一、awk命令快速入门
awk 'BEGIN {commands} pattern {commands}END{commands}' file1
BEGIN: 处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令
BEGIN和END里的命令只是执行一次
pattern里的命令会匹配每一行去处理
示例:查找/etc/passwd文件,筛选第3列值在500-2000之间的行,输出第1列和第3列的值,
[root@CentOS-7 /]# cat /etc/passwd | awk -F ":" 'BEGIN{OFS="@@";print "---start---"} $3>500&&$3<2000 {print $1,$3}END{print "---end---"}'
---start---
polkitd@@999
libstoragemgmt@@998
unbound@@997
saslauth@@996
gluster@@995
chrony@@994
www@@1000
mysql@@1001
redis@@1002
gitlab-www@@993
git@@992
gitlab-redis@@991
gitlab-psql@@990
gitlab-prometheus@@989
springboot@@1003
pdns@@988
named@@1004
user-es@@1005
openvpn@@987
---end---
上述例子中,我们用-F ":" 指定每行文本中的分隔符为":",同时用OFS="@@"指定输出分隔符为@@,如果去掉OFS="@@"则默认用空格做分隔符,如果把3之间的逗号去掉,则没有分隔符
分隔符示例:
[root@CentOS-7 /]# awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -5
root x root
bin x bin
daemon x daemon
adm x adm
lp x lp
[root@CentOS-7 /]# awk -F ":" '{print $1$2$5}' /etc/passwd | head -5
rootxroot
binxbin
daemonxdaemon
admxadm
lpxlp
二、awk工作流程
先执行一次BEGIN {commands}代码块,然后查看是否使用pattern模式,若有则检查该行整体是否匹配pattern,匹配则执行{commands}命令,不匹配则不执行{commands}命令,若无则直接执行{commands}命令主体,执行完毕接着读取下一行,循环读取直到读取完毕。
pattern模式示例:
[root@CentOS-7 /]# awk -F ":" '/gitlab/{print $1,$2,$5}' /etc/passwd | head -5
gitlab-www x
git x
gitlab-redis x
gitlab-psql x
gitlab-prometheus x
三、配合其他命令使用
示例1:查找python server.py命令的进程pid
[root@CentOS-7 /]# ps -ef | grep 'python server.py' |grep -v 'grep' |awk '{print $2}'
21477
21592
21593
21594
21595
示例2:查找以python3执行的进程pid
[root@CentOS-7 /]# ps aux | grep python3.7 | grep -v 'grep' | awk '{print $2}'
21477
21592
21593
21594
21595
示例3:统计uid>1000并且使用shell是bash的用户的数量
[root@CentOS-7 /]# awk -F ":" '$3>1000&&$7 ~ /bash/{print $1,$3,$7; i++}END{print "uid大于1000并且shell是bash的人数有:"i"人"}' /etc/passwd
user-es 1005 /bin/bash
uid大于1000并且shell是bash的人数有:1人
ps: ~代表进行正则匹配,匹配则为1,不匹配则为0
示例4:显示第5行到第10行/etc/passed文件里的第3和第5字段的内容
[root@CentOS-7 /]# awk -F ":" 'NR>=5 && NR<=10{print NR,$3,$5}' /etc/passwd
5 4 lp
6 5 sync
7 6 shutdown
8 7 halt
9 8 mail
10 11 operator
ps:NR为行号
网友评论