ether 00:0c:29:31:86:4c txqueuelen 1000 (Ethernet)
RX packets 151680 bytes 12418252 (11.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 227495 bytes 58347686 (55.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 20 bytes 1724 (1.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20 bytes 1724 (1.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ip a | grep 'inet ’ | grep -v ‘127.0.0.1’| awk -F ‘[ /]+’ ‘{print $3}’
192.168.129.133
| 变量 | 作用 |
| — | — |
| NR | 输出文件当前行的所有行号 |
| NF | 输出文件当前行的列数(有几列) |
| FS | 指定每行文本的字段分隔符,默认为空格或制表位 |
| RS | 行分隔符 |
| FILENAME | 被处理的文件名 |
- awk应用实例:
[root@localhost ~]# cat passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
#输出每次处理行的行号,以及当前行以":"为分隔符的字段个数(有几列):
[root@localhost ~]# awk -F: ‘{print NR,NF}’ passwd
1 7
2 7
3 7
4 7
#awk的print指令不仅可以打印变量,也可以打印常量:
[root@localhost ~]# awk -F: ‘{print $1"用户:";$7}’ passwd
root用户:
bin用户:
daemon用户:
adm用户:
#打印包含root的整行内容
[root@localhost ~]# awk -F: ‘/root/{print $0}’ passwd
root❌0:0:root:/root:/bin/bash
[root@localhost ~]#
#打印包含root的行的第一列
[root@localhost ~]# awk -F: ‘/root/{print $1}’ passwd
root
#打印包含root的行的第一列和第六列
[root@localhost ~]# awk -F: ‘/root/{print $1,$6}’ passwd
root /root
[root@localhost ~]# cat passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
#在打印之前定义字段分隔符为冒号
[root@localhost ~]# awk ‘BEGIN{FS=“:”}{print $1}’ passwd
root
bin
daemon
adm
#OFS定义了输出时以什么分隔,$1$2中间要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
[root@localhost ~]# awk ‘BEGIN{FS=“:”;OFS=“—”}{print $1,$2}’ passwd
root—x
bin—x
daemon—x
adm—x
awk [选项] ‘[条件]{指令}’ filename
awk [选项] ’ BEGIN{指令} {指令} END{指令}’ filename
BEGIN{ }
行前处理,读取文件内容前执行,指令执行1次
{ }
逐行处理,读取文件过程中执行,指令执行n次
END{ }
行后处理,读取文件结束后执行,指令执行1次
只做预处理的时候,可以没有操作文件,比如:
[root@localhost ~]# awk ‘BEGIN{A=12;print A*3}’
36
[root@localhost ~]# awk ‘BEGIN{print B+3}’ //B可以不定义,直接用,默认值为0
3
[root@localhost ~]# awk ‘BEGIN{print 2.5+3.8}’
6.3
格式化输出passwd文件(awk同样支持制表符\t和换行符\n):
要求: 格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、UID、家目录信息,最后一行提示一共已处理文本的总行数:
[root@localhost ~]# awk -F: ‘BEGIN{print “User\tUID\tHome”}{print $1"\t"$3"\t"$6} END{print “Total”,NR,“line.”}’ passwd
User UID Home
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
Total 4 line.
| 比较符号 | 作用 |
| — | — |
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
[root@localhost ~]# cat passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
#输出passwd文件的第3行的用户记录
[root@localhost ~]# awk -F: ‘NR==3{print}’ passwd
daemon❌2:2:daemon:/sbin:/sbin/nologin
#输出passwd文件中账户UID大于等于900的账户名称和UID
[root@localhost ~]# awk -F: ‘$3>=900{print $1,$3}’ passwd
polkitd 998
#输出passwd文件中账户UID小于10的账户名称和UID信息
[root@localhost ~]# awk -F: ‘$3<10{print $1,$3}’ passwd
root 0
bin 1
daemon 2
adm 3
逻辑测试条件
[root@localhost ~]# cat passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
#输出passwd文件中用户账户UID大于10并且小于20的账户信息
[root@localhost ~]# awk -F: ‘$3>10 && $3<20’ passwd
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
#输出passwd文件中账户UID大于900或者账户UID小于10的账户信息
[root@localhost ~]# awk -F: ‘$3>900 || $3<10’ passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
数学运算
++x在返回结果前递增x的值(前缀)
x++在返回结果后递增x的值(后缀)
^|** (取幂)
#匹配空行
[root@localhost ~]# cat test1
(707) 724-0000
(707)724-0000
[root@localhost ~]# awk ‘/^$/{print x+= 1}’ test1
1
2
3
4
5
#先赋值在运算
[root@localhost ~]# awk ‘/0/{print x++}’ test1
0
1
#先运算在赋值
[root@localhost ~]# awk ‘/0/{print ++x}’ test1
1
2
#匹配有几行空行
[root@localhost ~]# awk ‘/^$/{++i}END{print i}’ test1
5
[root@localhost ~]# awk ‘BEGIN{x++;print x}’
1
[root@localhost ~]# awk ‘BEGIN{x=8;print x+=2}’
10
[root@localhost ~]# awk ‘BEGIN{print 2+3}’
5
[root@localhost ~]# awk ‘BEGIN{print 2*3}’
6
[root@localhost ~]# awk ‘BEGIN{print 2**3}’
8
[root@localhost ~]# awk ‘BEGIN{print 2^3}’
8
[root@localhost ~]# awk ‘BEGIN{ print 23%8}’ //求23除以8的余数
7
[root@localhost ~]# awk ‘$1%3==0’ num //求20以内30的倍数
21
27
6
9
12
15
18
[root@localhost ~]# awk ‘$1%7==0||$1~/7/’ num //求30以内整数中7的倍数或者含7的数:
21
27
28
列
- 按格式输出每一行的倒数第二列,最后一列,总列数
[root@localhost ~]# cat name
John Robinson 666-555-1111
jjyy nishazi 110-119-4444
xixi microsoft 888-888-9999
haha remotely 111-222-3333
#输出文件每一行的倒数第二列
[root@localhost ~]# awk ‘{print $(NF-1)}’ name
Robinson
nishazi
microsoft
remotely
#输出文件每一行的最后一列
[root@localhost ~]# awk ‘{print $(NF)}’ name
666-555-1111
110-119-4444
888-888-9999
111-222-3333
#输出文件每一行的列数
[root@localhost ~]# awk ‘{print NF}’ name
3
3
3
3
计算操作
- awk实现求和、平均值,最大值和最小值的计算操作
[root@localhost ~]# cat a
11
22
33
#求和
[root@localhost ~]# awk ‘{sum+=$1} END {print "Sum = ", sum}’ a
Sum = 66
#求平均值
[root@localhost ~]# awk ‘{sum+=$1} END {print "Average = ", sum/NR}’ a
Average = 22
#求最大值
[root@localhost ~]# awk ‘BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print “Max=”, max}’ a
Max= 33
#求最小值
[root@localhost ~]# awk ‘BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print “Min=”, min}’ a
Min= 11