一、awk简介
AWK是一个优良强大的文本处理分析工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
二、awk变量
1、内置常用变量
$0 当前记录,当前行所有列
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入域分隔符,等价于命令行-F,默认为空格
NF 当前记录中的字段个数,就是有多少列,列总数,$NF则表示最后一列
NR 已经读取的记录数,就是第几行,行数,从1开始
FNR 当前记录数
RS 输入记录分隔符,默认为换行符(即文本是按一行一行输入)
OFS 输出字段分隔符 默认也是空格
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
ARGC 命令行参数个数
ARGV 命令行参数排列
FILENAME awk浏览的文件名
\t 制表符
\n 换行符
2、自定义变量类型
echo |awk 'i="hello world"{print i}'
echo |awk 'i=1122 {print i}'
3、数组
echo |awk '{a[1]="hello";a[2]="world!";print a[1],a[2]}'
三、awk常用逻辑运算
? 条件表达操作符
|| && ! 并、与、非
~ !~ 匹配操作符,包括匹配 不匹配正则表达式
+ - * / % ^ 算术操作符
++ -- 前缀和后缀
= += -= *= /= %= ^= **= 赋值操作符
< <= == != >= > 关系操作符
BEGIN 在输出界面第一行输出相关
END 在输出界面最后一行输出相关
+ - 加,减
* / & 乘,除与求余
+-! 一元加,减和逻辑非
^*** 求幂
$ 字段引用
空格 字符串链接符
?: 三目运算符
ln 数组中是否存在某个键值
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
-F'[:#/]' 定义三个分隔符
四、语法格式
格式1:前置命令 | awk [选项] ‘条件{编辑指令}'
格式2:awk [选项] ‘条件{编辑指令}' 文件...
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
awk [ -F 分隔符 ] ' /模式/{操作} ' 文件名
awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
模式可以是正则表达式、条件表达式或两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号分开
五、常用命令选项
-F 指定域分隔符(默认为空格或tab键)
-f 指定从脚本文件中读取awk命令
-V 调用外部Shell变量 variable
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
环境准备
准备一台Centos6服务器
系统: Centos6.5
内存:1G
cpu: 2核
IP地址: 10.0.0.53
[root@localhost ~]# echo |awk '{print "hello world!"}'
hello world!
[root@localhost ~]# echo '11 22' | awk '{print $1}'
11
[root@localhost ~]#
[root@localhost ~]# echo |awk 'i="hello world"{print i}'
hello world
[root@localhost ~]# echo |awk 'i=1122 {print i}'
1122
[root@localhost ~]#
[root@ slave ~]# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:0C:29:B5:87:4D
inet addr:172.16.1.22 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::20c:29ff:feb5:874d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1800 (1.7 KiB) TX bytes:1656 (1.6 KiB)
# 截取MAC地址
[root@ slave ~]# ifconfig eth1 | awk '/HWaddr/{print $5}'
00:0C:29:B5:87:4D
[root@ slave ~]# ifconfig eth1 | awk '/Mask/{print $2}'
addr:172.16.1.22
# 截取IP地址
[root@ slave ~]# ifconfig eth1 | awk '/Mask/{print $2}' | awk -F : '{print $2}'
172.16.1.22
[root@ slave ~]#
ifconfig eth1 | awk '/Mask/{print $4}' | awk -F : '{print $2}'
# 格式化输出
[root@ slave ~]# echo tom jack | awk '{printf("%-30s %-15s\n",$1,$2)}'
tom jack
[root@ slave ~]# echo tom jack lucy | awk '{printf("%-30s %-20s %s\n",$1,$2,$3)}'
tom jack lucy
[root@ slave ~]#
[root@ slave ~]# echo 1 3 | awk '{printf("%f\n",$1/$2)}'
0.333333
[root@ slave ~]# echo 1 3 | awk '{printf("%.2f\n",$1/$2)}'
0.33
[root@ slave ~]#
# 打印系统用户、家目录、以及shell
cat /etc/passwd | awk -F : '{print $1,$6,$7}'
# 打印出来时更规范一些
cat /etc/passwd | awk -F : '{printf("%-15s" "%-25s %-20s\n",$1,$6,$7)}'
# 添加规范
cat /etc/passwd | awk -F : 'BEGIN {printf("%-13s %-23s %-23s\n","用户","家目录","SHELL")} {printf("%-15s %-25s %-20s\n",$1,$6,$7)}'
# 结尾打印结束信息
cat /etc/passwd | awk -F : 'BEGIN {printf("%-13s %-23s %-23s\n","用户","家目录","SHELL")} {printf("%-15s %-25s %-20s\n",$1,$6,$7)} END {print "处理完毕"}'
[root@localhost ~]# mpstat
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2020年01月05日 _x86_64_ (2 CPU)
01时58分57秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
01时58分57秒 all 0.06 0.00 0.12 0.08 0.00 0.02 0.00 0.00 99.72
# 取出CPU的使用率和空闲率
[root@localhost ~]# mpstat | awk '/all/{print "使用率:",$3+$5"%"} /all/{print "空闲率:",$11"%"}'
使用率: 0.18%
空闲率: 99.72%
[root@localhost ~]#
# 截取用户
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
dbus
usbmuxd
vcsa
rpc
rtkit
avahi-autoipd
abrt
rpcuser
nfsnobody
haldaemon
gdm
ntp
apache
saslauth
postfix
pulse
sshd
tcpdump
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF}'
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF}' | wc -l
33
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} /^root/{print NF}' | wc -l
1
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} /^root/{print NF;print NR}'
7
1
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF;print NR}'
7
1
7
2
7
3
7
4
7
5
7
6
7
7
7
8
7
9
7
10
7
11
7
12
7
13
7
14
7
15
7
16
7
17
7
18
7
19
7
20
7
21
7
22
7
23
7
24
7
25
7
26
7
27
7
28
7
29
7
30
7
31
7
32
7
33
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF} END{print NR}'
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
33
[root@localhost ~]#
[root@localhost ~]# awk -F : -v num=0 '{if($3>=500) sum++} END {print sum}' /etc/passwd
1
[root@localhost ~]# awk -F : -v num=0 '{if($3>=10) sum++} END {print sum}' /etc/passwd
24
[root@localhost ~]# awk -F : -v num=0 '{if($3>=20) sum++} END {print sum}' /etc/passwd
19
[root@localhost ~]#
[root@localhost ~]# awk -F : '/^root/{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
root
x
0
[root@localhost ~]#
[root@localhost ~]# awk -F : '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
root
x
0
bin
x
1
daemon
x
2
adm
x
3
lp
x
4
sync
x
5
shutdown
x
6
halt
x
7
mail
x
8
uucp
x
10
operator
x
11
games
x
12
gopher
x
13
ftp
x
14
nobody
x
99
dbus
x
81
usbmuxd
x
113
vcsa
x
69
rpc
x
32
rtkit
x
499
avahi-autoipd
x
170
abrt
x
173
rpcuser
x
29
nfsnobody
x
65534
haldaemon
x
68
gdm
x
42
ntp
x
38
apache
x
48
saslauth
x
498
postfix
x
89
pulse
x
497
sshd
x
74
tcpdump
x
72
[root@localhost ~]#
.
[root@localhost ~]# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
root
x
0
bin
x
1
daemon
x
2
adm
x
3
lp
x
4
sync
x
5
shutdown
x
6
halt
x
7
mail
x
8
uucp
x
10
operator
x
11
games
x
12
gopher
x
13
ftp
x
14
nobody
x
99
dbus
x
81
usbmuxd
x
113
vcsa
x
69
rpc
x
32
rtkit
x
499
avahi-autoipd
x
170
abrt
x
173
rpcuser
x
29
nfsnobody
x
65534
haldaemon
x
68
gdm
x
42
ntp
x
38
apache
x
48
saslauth
x
498
postfix
x
89
pulse
x
497
sshd
x
74
tcpdump
x
72
[root@localhost ~]#
[root@localhost ~]# awk -F : '{if ($3>500) print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]# awk -F : '{if ($3>=100) print $0}' /etc/passwd
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@localhost ~]# awk -F : '{if ($3>=100) print $3}' /etc/passwd
113
499
170
173
65534
498
497
[root@localhost ~]# awk -F : '$3>=100{print $3}' /etc/passwd
113
499
170
173
65534
498
497
[root@localhost ~]#