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

 其他内置变量的用法FS、OFS


[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逐行处理文本


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