标签:工作原理 字段 判断 标准 file ogr pac dbus 类信息
第一步:执行BEGIN{action;...}语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{action;...}语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;...}语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可写咋BEGIN语句块中。
END语句块在awk从输入流中读完所有的行之后被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{print},即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
print格式:print item1, item2, ...
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可以实现格式化输出
格式替代符
转义序列
1 [16:33:51 root@centos8 ~]#awk -F ‘:‘ ‘{printf "%-20s | %10d\n",$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
标签:工作原理 字段 判断 标准 file ogr pac dbus 类信息
原文地址:https://www.cnblogs.com/gaojinzhou/p/12898139.html