F.E.
1、 示例1,if条件判断语句:
1> 单分支if语句1; [root@KOU ~]# [root@KOU ~]# awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd kou 1000 nfsnobody 65534 maha 1001 [root@KOU ~]# 2> 单分支if语句2; [root@KOU ~]# [root@KOU ~]# awk -F: '{if($NF=="/bin/bash")printf "%-18s:%-10s:%-s\n",$1,$3,$7}' /etc/passwd root :0 :/bin/bash kou :1000 :/bin/bash maha :1001 :/bin/bash [root@KOU ~]# 3> 单分支if语句3; [root@KOU ~]# awk '{if(NF>5)print}' /etc/fstab # Created by anaconda on Mon May 21 20:19:01 2018 # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=cf39f560-952f-4328-9110-c0dc20265fae / xfs defaults 0 0 UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88 /boot xfs defaults 0 0 /dev/mapper/KOU-usr /usr xfs defaults 0 0 UUID=e68723d4-44ce-4fde-a3e9-816e5d6d4f0c /var xfs defaults 0 0 UUID=db46ba65-2bb9-49f8-8c89-c1ac8cb4c9be swap swap defaults 0 0 [root@KOU ~]# 4> 单分支if语句4; [root@KOU ~]# [root@KOU ~]# df -lh | awk -F% '{print $1}' Filesystem Size Used Avail Use /dev/sda7 15G 103M 15G 1 devtmpfs 471M 0 471M 0 tmpfs 488M 0 488M 0 tmpfs 488M 20M 468M 4 tmpfs 488M 0 488M 0 /dev/mapper/KOU-usr 5.0G 4.1G 1011M 81 /dev/sda3 6.0G 477M 5.6G 8 /dev/sda2 2.0G 164M 1.9G 9 tmpfs 98M 4.0K 98M 1 tmpfs 98M 48K 98M 1 /dev/sr0 8.8G 8.8G 0 100 [root@KOU ~]# [root@KOU ~]# df -lh | awk -F% '{print $1}' | awk '{if($NF>80)print $1}' Filesystem /dev/mapper/KOU-usr /dev/sr0 [root@KOU ~]# [root@KOU ~]# [root@KOU ~]# df -lh | awk -F% '/^\/dev/{print $1}' | awk '{if($NF>80)print $1}' /dev/mapper/KOU-usr /dev/sr0 [root@KOU ~]# 5> 双分支if语句; [root@KOU ~]# awk -F: '{if($3>=1000){printf "common user : %-18s:%-s\n",$1,$3} else {printf "system user : %-18s:%-s\n",$1,$3}}' /etc/passwd system user : root :0 system user : bin :1 system user : daemon :2 system user : adm :3 system user : lp :4 system user : sync :5 system user : shutdown :6 system user : halt :7 system user : mail :8 system user : operator :11 system user : games :12 system user : ftp :14 system user : nobody :99 system user : systemd-network :192 system user : dbus :81 system user : polkitd :999 system user : postfix :89 system user : sshd :74 common user : kou :1000 ...... system user : sssd :992 system user : tcpdump :72 common user : maha :1001 system user : qemu :107 system user : usbmuxd :113 system user : saslauth :991 system user : radvd :75 system user : unbound :990 system user : avahi :70 system user : gnome-initial-setup:989 system user : apache :48
2、示例2,while循环语句:
1> 显示指定字段的字符个数;
[root@KOU ~]# [root@KOU ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%-55s,%-s\n",$i,length($i);i++}}' /etc/grub2.cfg linux16 ,7 /vmlinuz-3.10.0-862.2.3.el7.x86_64 ,34 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 ro ,2 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 rhgb ,4 quiet ,5 LANG=en_US.UTF-8 ,16 linux16 ,7 /vmlinuz-3.10.0-693.el7.x86_64 ,30 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 ro ,2 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 rhgb ,4 quiet ,5 LANG=en_US.UTF-8 ,16 linux16 ,7 /vmlinuz-0-rescue-ab4db88d98d84dfa8b33daec6dbd2e2d ,50 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 ro ,2 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 rhgb ,4 quiet ,5 [root@KOU ~]#
2> 先对符合模式匹配的行进行各个字段的字符数计算并显示,再根据指定的字符数量过滤显示;
[root@KOU ~]# [root@KOU ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%-55s,%-s\n",$i,length($i);i++}}' /etc/grub2.cfg | awk -F, '{if($2>10)printf "%-55s,%-s\n",$1,$2}' /vmlinuz-3.10.0-862.2.3.el7.x86_64 ,34 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-3.10.0-693.el7.x86_64 ,30 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-0-rescue-ab4db88d98d84dfa8b33daec6dbd2e2d ,50 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 [root@KOU ~]#
[root@KOU ~]# [root@KOU ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>10){printf "%-55s,%-s\n",$i,length($i)};i++}}' /etc/grub2.cfg /vmlinuz-3.10.0-862.2.3.el7.x86_64 ,34 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-3.10.0-693.el7.x86_64 ,30 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-0-rescue-ab4db88d98d84dfa8b33daec6dbd2e2d ,50 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 [root@KOU ~]#
3、for循环举例:
先对符合模式匹配的行进行各个字段的字符数计算并显示,再根据指定的字符数量过滤显示;<承上例,此处用for循环书写>
[root@KOU ~]# [root@KOU ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {if(length($i)>10){printf "%-55s,%-s\n",$i,length($i)}}}' /etc/grub2.cfg /vmlinuz-3.10.0-862.2.3.el7.x86_64 ,34 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-3.10.0-693.el7.x86_64 ,30 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 LANG=en_US.UTF-8 ,16 /vmlinuz-0-rescue-ab4db88d98d84dfa8b33daec6dbd2e2d ,50 root=UUID=cf39f560-952f-4328-9110-c0dc20265fae ,46 crashkernel=auto ,16 rd.lvm.lv=KOU/usr ,17 [root@KOU ~]#
4、next
[root@KOU ~]# [root@KOU ~]# awk -F: '{if($3%2==0) printf "%-18s:%-s\n",$1,$3}' /etc/passwd root :0 daemon :2 lp :4 shutdown :6 mail :8 games :12 ftp :14 systemd-network :192 sshd :74 kou :1000 geoclue :998 rpc :32 gluster :996 rtkit :172 ntp :38 setroubleshoot :994 gdm :42 nfsnobody :65534 sssd :992 tcpdump :72 unbound :990 avahi :70 apache :48 [root@KOU ~]# -------------------------------------- [root@KOU ~]# [root@KOU ~]# awk -F: '{if($3%2!=0) next; printf "%-18s:%-s\n",$1,$3}' /etc/passwd root :0 daemon :2 lp :4 shutdown :6 mail :8 games :12 ftp :14 systemd-network :192 sshd :74 kou :1000 geoclue :998 rpc :32 gluster :996 rtkit :172 ntp :38 setroubleshoot :994 gdm :42 nfsnobody :65534 sssd :992 tcpdump :72 unbound :990 avahi :70 apache :48
5、awk的自定义变量、for循环遍历数组:
[root@KOU ~]# [root@KOU ~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday"; print weekdays["mon"]}' monday [root@KOU ~]# [root@KOU ~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday"; print weekdays["tue"]}' tuesday [root@KOU ~]# [root@KOU ~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday"; for(w in weekdays) print weekdays[w]}' tuesday monday [root@KOU ~]#
6、for循环遍历数组特殊应用;
统计TCP协议类型应用的各种状态,并计数;
[root@KOU ~]# netstat -tan Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 192.168.206.88:22 192.168.206.1:52456 ESTABLISHED tcp 0 52 192.168.206.88:22 192.168.206.1:51901 ESTABLISHED tcp 0 0 192.168.206.88:22 192.168.206.1:52463 ESTABLISHED tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN [root@KOU ~]# [root@KOU ~]# [root@KOU ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}' LISTEN 4 ESTABLISHED 3 [root@KOU ~]#
统计web日志文件中IP地址访问top数量,并计数排列;
[root@KOU access_2018_03]# [root@KOU access_2018_03]# awk '{ipaddr[$1]++}END{for(count in ipaddr) {print ipaddr[count],count}}' access_2018-03-14.log | sort -nr | head -15 84833 180.173.31.69 2192 183.234.61.135 1440 47.104.162.74 545 61.140.180.103 129 101.226.65.107 110 14.24.210.76 52 112.96.128.79 26 112.97.250.79 22 171.13.14.146 21 140.205.205.34 21 140.205.205.28 20 220.181.132.200 20 220.181.132.195 20 171.13.14.150 20 116.21.181.63 [root@KOU access_2018_03]#
[root@KOU access_2018_03]# cat access_2018-03-14.log | cut -d' ' -f1 | sort | uniq -c | sort -rn | head -15 84833 180.173.31.69 2192 183.234.61.135 1440 47.104.162.74 545 61.140.180.103 129 101.226.65.107 110 14.24.210.76 52 112.96.128.79 26 112.97.250.79 22 171.13.14.146 21 140.205.205.34 21 140.205.205.28 20 220.181.132.200 20 220.181.132.195 20 171.13.14.150 20 116.21.181.63 [root@KOU access_2018_03]#
统计指定文件中每个单词出现的次数;
[root@KOU ~]# [root@KOU ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(w in count){printf "%-5s,%-s\n",count[w],w}}' /etc/fstab 1 ,man 1 ,May 1 ,and/or 1 ,maintained 4 ,xfs 1 ,/var 1 ,Accessible 7 ,# 1 ,are 5 ,defaults 1 ,blkid(8) 1 ,/ .................... 1 ,info 1 ,20:19:01 2 ,swap 1 ,filesystems, 1 ,reference, 1 ,for 1 ,UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88 1 ,under [root@KOU ~]#
函数:split举例;
[root@KOU ~]# [root@KOU ~]# netstat -tan Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 192.168.206.88:22 192.168.206.1:52456 ESTABLISHED tcp 0 0 192.168.206.88:22 192.168.206.1:51901 ESTABLISHED tcp 0 0 192.168.206.88:22 192.168.206.1:52463 ESTABLISHED tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN [root@KOU ~]# [root@KOU ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}' 0.0.0.0 4 192.168.206.1 3 [root@KOU ~]# [root@KOU ~]# [root@KOU ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print count[i],i}}' 4 0.0.0.0 3 192.168.206.1 [root@KOU ~]#