linux三剑客之awk,以字段为单位进行处理数据的处理,统计。作为开发人员也应熟练掌握

awk 命令参数

awk 参数 ‘模式{动作}’ 文件

1、-F "[ ]" ,以指定分隔符号分隔,也就是多个字段
2、print 打印输出
3、$n 第n列
4、$0 表示一整行
5、NF列的数量
6、$NF 最后1列名称


# NF当前列总数
# 打印第一行列总数
awk 'NR==1{print NF}' 

# $NF 表示最后1列的名称,
awk '{print $NF}'

# -vOFS='\t' 输出指定分割符 	
awk -vOFS="\t" '{NF=3}1'

# 打印1,3列
'{print $1,$3}' 显示指定列

# 打印第1-10列
awk -vOFS='\t' '{NF=10}1'  


查找

awk '/php/' file	# 找出包含php的行

awk '/^$/{print NR}' file	# 查找空行	

awk '$2~/php/' file	# 查找第二列包含php的行	

awk '$3~/[15]$/{print $1}' file	# 以1或5结尾	

替换

# /目标/,"替换内容",(第几列);print
awk '{gsub(/:/,"$",$4);print}' reg.txt 

特殊模式BEGIN END

END{}会在读取完文件的最后一行执行

# 统计空行数量
awk '/^$/{i++}END{print i}' file 

awk数组

1、统计域名开头出现的次数

https://www.hiwangqi.com

https://www.hiwangqi.com

https://post.hiwangqi.com/

https://mp3.hiwangqi.com/

https://post.hiwangqi.com/


awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"]}' file

3 2

awk -F "[/.]+" '{h[$2]++}END{for(pol in h) print pol,h[pol] }' file

www 3
mp3 1
post 2

2、统计access.log中ip出现的次数并排序


awk '{f[$1]++}END{for(ip in f) print ip,f[ip]|"sort -nk2"}' ./access.log

sort

-n:按数值大小进行排序。

-k:按第几列进行排序。

-r:逆序。

3、统计出secure文件中每个用户和每个ipfailed错误的次数

# 内容: 
# Failed password for invalid user mashby from 120.52.120.166 port 47904 ssh2

awk '/Failed/{print $(NF-5), $(NF-3)}' /var/log/secure |sort|uniq -c|sort -n

# 显示结果:
208 root 43.225.180.227
310 root 115.239.253.159
633 root 210.245.107.92

命令解释:

$(NF-5):\$NF表示最后一列,$(NF-3)则表示IP
srot:默认以ASCII 码的次序排列,先进行排列,所有相同的行就会出现在相连的地方。
uniq -c:uniq用于去除相邻位置的行例如。-c参数则用于在每列旁边显示该行重复出现的次数。

# sort前
aaaaaaa
ccccccc 
aaaaaaa
# sort后
aaaaaaa
aaaaaaa
ccccccc
# uniq之后
aaaaaaa
bbbbbbb