文章来源:王琦的个人博客-linux三剑客之awk ,互联网打杂,喜欢多语言编程,记录一些知识碎片,分享一些心得。
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