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位数八进制值的字符,仅在格式字符串中有效