1、AWK脚本编程之控制语句格式
2、实例
(1)打印uid大于300小于4000的用户和uid
[root@server1 bin]# awk -F: 'OFS=":"{if($3>=300 && $3<=4000 ) {print $1,$3} }' /etc/passwd //定义输出分隔符为“:”,且如果第三域的值小于4000大于300.就将第一域和第三域的值打印。
polkitd:999
libstoragemgmt:998
colord:997
saslauth:996
setroubleshoot:995
gluster:994
chrony:993
unbound:992
geoclue:991
gnome-initial-setup:990
kiosk:1000
varnish:989
ps:1001
j:1002
l:1008
ll:1009
u1:1010
u2:1011
u3:1012
u4:1013
u5:1014
(2)按照规定语句打印出管理员
[root@server1 bin]# awk -F: '{if($3==0){print $1,"is admin"} }' /etc/passwd //“,”默认为一个空格,所以中间加一个逗号。$1不能放在双引号里面,否则会直接打印出来。
root is admin
(3)如果为0打印是管理员,其他打印是普通用户。
[root@server1 bin]# awk -F: '{if($3==0){print $1,"is admin\n"}else{print $1,"is not admin\n"} }' /etc/passwd
root is admin
bin is not admin
daemon is not admin
adm is not admin
lp is not admin
(4)
第一个:如果uid大于等于500且不等于65534,那么打印该用户$1为普通用户,否则打印$1不是普通用户;
第二个:如果id -u的结果大于等于500且不等于65534,那么打印该用户$1为普通用户,否则打印$1不是普通用户。
注意这里不能使用反撇号来执行命令,只能使用$()符号,因为具有嵌套.
(5)
第一个:如果$3=0,打印是管理员;如果$3大于等于1且小于等于499,打印是系统用户;其他打印是普通用户。
第二个:如果$3=0,将i加1;如果$3大于等于1且小于等于499,或者$3等于65534,将j加1;其他给k加1;最后打印管理员个数为i,系统用户为j,普通用户为k。
(5)用awk实现
1
12
123
1234
12345
[root@server1 bin]# awk 'BEGIN{for(i=1;i<=5;i++) {for(j=1;j<=i;j++) {printf j};print }}' //第一个printf是为了让一个大循环也就是每一行的数字不换行输出,第二个print是为了让每小于i个j打印完后换行输出。
1
12
123
1234
12345
3、AWK统计实例
在AWK中关联数组不用声明,变量不用引用也不用加双引号,普通字符串加双引号
(1)统计系统中各种种类的bash
[root@server1 bin]# awk -F: '{shell[$NF]++};END{for(i in shell) {print i":"shell[i]} }' /etc/passwd //{shell[$NF]++}是对文件进行处理,所以在end之前。
/bin/sync:1
/bin/bash:28
/sbin/nologin:42
/sbin/halt:1
/sbin/shutdown:1
(2)统计网站访问状态
[root@server1 bin]# netstat -antl|grep 80|awk '{print$6}'|awk '{state[$1]++};END{for(i in state) {print i":"state[i]}}' //经过grep过滤awk截取后,连接状态以逐行的方式显示在屏幕界面,而awk处理文件行,所以我们通过管道符重定向标准输入。接下来通过关联数组将其存储,方法同上一个一样。
LISTEN:1
ESTABLISHED:7
FIN_WAIT2:2
TIME_WAIT:1
(3)统计访问网站的每个IP数量
[root@server1 bin]# netstat -antl|grep 80|awk '{print$5}'|awk '{IP[$1]++};END{for(i in IP) {print i":"IP[i]}}'
192.168.13.129:80:1
192.168.13.129:42822:1
192.168.13.134:50512:1
0.0.0.0:*:1
192.168.13.134:50508:1