awk文本处理工具

Posted gaojinzhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk文本处理工具相关的知识,希望对你有一定的参考价值。

 awk工作原理

 第一步:执行BEGIN{action;...}语句块中的语句。
 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{action;...}语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
 第三步:当读至输入流末尾时,执行END{action;...}语句块。
 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可写咋BEGIN语句块中。
 END语句块在awk从输入流中读完所有的行之后被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
 pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{print},即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

print格式:print item1, item2, ...

awk基本用法

awk [options] ‘program‘ var=value file ...
awk [options] -f programfile var=value file ...
awk [options] ‘BEGIN{ action;...} pattern{ action;... } END{ action;... }‘ file ...

 选项:

 -F:指明输入时用到的字段分隔符;
? -v var=value:自定义变量。

分隔符、域和记录

 awk执行时,由分隔符的字段(域)标记$1,$2...$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同;
 文件的每一行称为记录;
 省略action,则默认执行print $0的操作。

范例:

以-F指定以:为分隔符,打印/etc/passwd文件中的第一列,$1表示第一列

 1 [21:37:18 root@centos8 ~]#awk -F: {print $1} /etc/passwd
 2 root
 3 bin
 4 daemon
 5 adm
 6 lp
 7 sync
 8 shutdown
 9 halt
10 mail
11 operator
12 games
13 ftp
14 nobody
15 dbus
16 systemd-coredump
17 systemd-resolve
18 tss
19 polkitd
20 geoclue
21 rtkit
22 pulse
23 qemu
24 usbmuxd
25 unbound
26 rpc
27 gluster
28 chrony
29 libstoragemgmt
30 pipewire
31 saslauth
32 setroubleshoot
33 dnsmasq
34 radvd
35 clevis
36 cockpit-ws
37 sssd
38 colord
39 gdm
40 rpcuser
41 gnome-initial-setup
42 sshd
43 avahi
44 tcpdump
45 gjz
46 apache

 打印第一列和第三列,$1和$3中间用,隔开

 1 [15:39:43 root@centos8 ~]#awk -F: {print $1,$3} /etc/passwd
 2 root 0
 3 bin 1
 4 daemon 2
 5 adm 3
 6 lp 4
 7 sync 5
 8 shutdown 6
 9 halt 7
10 mail 8
11 operator 11
12 games 12
13 ftp 14
14 nobody 65534
15 dbus 81
16 systemd-coredump 999
17 systemd-resolve 193
18 tss 59
19 polkitd 998
20 geoclue 997

 

 取出df命令中的设备名和分区利用率

 1 [15:42:10 root@centos8 ~]#df |awk {print $1,$5}
 2 Filesystem Use%
 3 devtmpfs 0%
 4 tmpfs 0%
 5 tmpfs 2%
 6 tmpfs 0%
 7 /dev/sda2 10%
 8 /dev/sda3 1%
 9 /dev/sda1 20%
10 tmpfs 1%

 

只取出df命令中分区利用率数字,-F指定以一个以上的空格和%作为分隔符,取出第5列

 1 [15:42:34 root@centos8 ~]#df | awk -F +|% {print $5}
 2 Use
 3 0
 4 0
 5 2
 6 0
 7 10
 8 1
 9 20
10 1

 

 找出df命令中以/dev/sd开头设备的分区利用率

1 [15:52:42 root@centos8 ~]#df |awk /^/dev/sd/ {print$1,$5}
2 /dev/sda2 10%
3 /dev/sda3 1%
4 /dev/sda1 20%

 

取出ifconfig命令中的IP地址(centos7、8)

1 [15:56:19 root@centos8 ~]#ifconfig ens160 |awk /netmask/ {print $2}
2 10.0.0.3

 

centos6

1 [root@Centos6 ~]#ifconfig eth0 |awk -F  +|: /Mask/{print $4}
2 10.0.0.5

 

通用方法    

r:扩展正则表达式 n:取消自动打印  2:打印第二行    s:搜索替代 

1 [root@Centos6 ~]#ifconfig eth0 | sed -nr 2s/^[^0-9]+([0-9.]+) .*$/1/p
2 10.0.0.5
1 [15:56:28 root@centos8 ~]#ifconfig ens160 | sed -nr 2s/^[^0-9]+([0-9.]+) .*$/1/p
2 10.0.0.3

 

NR记录的编号    如NR==2表示第二行

利用NR取出etc/passwd文件第二行

1 [16:25:10 root@centos8 ~]#awk NR==2 /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin

 

利用NR取出ifconfig命令中的IP地址

1 [16:25:26 root@centos8 ~]#ifconfig ens160 |awk NR==2 {print $2}
2 10.0.0.3

 

 

printf可以实现格式化输出

  • 格式替代符

  • %b 相对应的参数被视为含有要被处理的转义序列之字符串。
  • %c ASCII字符。显示相对应参数的第一个字符
  • %d, %i 十进制整数
  • %e, %E, %f 浮点格式
  • %g %e或%f转换,看哪一个较短,则删除结尾的零
  • %G %E或%f转换,看哪一个较短,则删除结尾的零
  • %o 不带正负号的八进制值
  • %s 字符串
  • %u 不带正负号的十进制值
  • %x 不带正负号的十六进制值,使用a至f表示10至15
  • %X 不带正负号的十六进制值,使用A至F表示10至15
  • %% 字面意义的%
  • 转义序列

  • a 警告字符,通常为ASCII的BEL字符
  •  后退
  • c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
  • f 换页(formfeed)
  • 换行
  • 回车(Carriage return)
  • 水平制表符
  • v 垂直制表符
  • 一个字面上的反斜杠字符
  • ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
  • ddd 表示1到3位的八进制值字符
 1 [16:33:51 root@centos8 ~]#awk -F : {printf "%-20s | %10d
",$1,$3} /etc/passwd
 2 root                 |          0
 3 bin                  |          1
 4 daemon               |          2
 5 adm                  |          3
 6 lp                   |          4
 7 sync                 |          5
 8 shutdown             |          6
 9 halt                 |          7
10 mail                 |          8
11 operator             |         11
12 games                |         12
13 ftp                  |         14
14 nobody               |      65534
15 dbus                 |         81
16 systemd-coredump     |        999
17 systemd-resolve      |        193
18 tss                  |         59
19 polkitd              |        998
20 geoclue              |        997
21 rtkit                |        172
22 pulse                |        171
23 qemu                 |        107
24 usbmuxd              |        113
25 unbound              |        996
26 rpc                  |         32
27 gluster              |        995
28 chrony               |        994
29 libstoragemgmt       |        993
30 pipewire             |        992
31 saslauth             |        991
32 setroubleshoot       |        990
33 dnsmasq              |        984
34 radvd                |         75
35 clevis               |        983
36 cockpit-ws           |        982
37 sssd                 |        981
38 colord               |        980
39 gdm                  |         42
40 rpcuser              |         29
41 gnome-initial-setup  |        979
42 sshd                 |         74
43 avahi                |         70
44 tcpdump              |         72
45 gjz                  |       1000
46 apache               |         48

 

 

技术图片

 

 技术图片

先对n取反,n=1结果为真,打印第一行,n++  n=1,1取反结果为0 ,假不打印

1 [16:34:22 root@centos8 ~]#awk -v n=0 !n++{print $0} /etc/passwd
2 root:x:0:0:root:/root:/bin/bash

同理,1取反为0,结果为假不打印

[16:38:08 root@centos8 ~]#awk -v n=1 !n++{print $0} /etc/passwd

 

++n  先相加n=1,1取反结果为0假不打印

[16:39:24 root@centos8 ~]#awk -v n=0 !++n{print $0} /etc/passwd

 

 

将/etc/passwd文件中UID大于等于1000的行进行打印

[16:40:12 root@centos8 ~]#awk -F: $3>=1000 /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
gjz:x:1000:1000:gjz:/home/gjz:/bin/bash

~表示包含  打印包含root的行                   同理 !~表示除了包含root的行

[16:42:34 root@centos8 ~]#awk -F : $0 ~ /root/ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

$NF表示最后一列

打印/etc/passwd文件中shell类型为/bin/bash的行

1 [16:48:46 root@centos8 ~]#awk -F : $NF=="/bin/bash"{print $1,$NF} /etc/passwd
2 root /bin/bash
3 gjz /bin/bash
[16:48:50 root@centos8 ~]#awk -F : $NF ~ /bash$/{print $1,$NF} /etc/passwd
root /bin/bash
gjz /bin/bash

 

 

if条件判断

如果UID满足大于等于1000才打印第一列和第三列

[16:50:14 root@centos8 ~]#awk -F : {if($3>=1000)print $1,$3} /etc/passwd
nobody 65534
gjz 1000

如果满足UID大于等于1000,打印common user +第1列和第3列,如果不满足打印,system user +第1列第3列

 1 [16:54:05 root@centos8 ~]#awk -F : {if($3>=1000)print "Common user:" $1,$3;else print "System user:" $1,$3} /etc/passwd
 2 System user:root 0
 3 System user:bin 1
 4 System user:daemon 2
 5 System user:adm 3
 6 System user:lp 4
 7 System user:sync 5
 8 System user:shutdown 6
 9 System user:halt 7
10 System user:mail 8
11 System user:operator 11
12 System user:games 12
13 System user:ftp 14
14 Common user:nobody 65534
15 System user:dbus 81
16 System user:systemd-coredump 999
17 System user:systemd-resolve 193
18 System user:tss 59
19 System user:polkitd 998
20 System user:geoclue 997
21 System user:rtkit 172
22 System user:pulse 171
23 System user:qemu 107
24 System user:usbmuxd 113
25 System user:unbound 996
26 System user:rpc 32
27 System user:gluster 995
28 System user:chrony 994
29 System user:libstoragemgmt 993
30 System user:pipewire 992
31 System user:saslauth 991
32 System user:setroubleshoot 990
33 System user:dnsmasq 984
34 System user:radvd 75
35 System user:clevis 983
36 System user:cockpit-ws 982
37 System user:sssd 981
38 System user:colord 980
39 System user:gdm 42
40 System user:rpcuser 29
41 System user:gnome-initial-setup 979
42 System user:sshd 74
43 System user:avahi 70
44 System user:tcpdump 72
45 Common user:gjz 1000
46 System user:apache 48

 

以上是关于awk文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令:文本处理工具awk详解一

56文本处理工具-awk

linux之文本处理工具awk

Pyp–一个替代sed,awk的文本处理工具

Linux 文本处理工具awk

强大的文本处理工具之三awk