一 awk之nginx实践案例:
nginx日志格式内容如下:
106.12.223.235 - - [18/Dec/2020:05:19:55 +0800] "GET /examples/globalresources.html HTTP/1.1" 404 784 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
1统计时间段内访问ip次数最多的记录
awk '$4>="[17/Dec/2020:05:19:55" &&$4<="[18/Dec/2020:05:19:55"{a[$1]++}END{for (i in a)print i,a[i]}' /usr/nginx/logs/access.log
2统计访问ip次数:
awk ‘{a[$1]++}END{for (i in a)print i,a[i]}’ /usr/nginx/logs/access.log
3统计访问ip次数大于100的记录:
awk '{a[$1]++}END{for (i in a){if (a[i]>100)print i,a[i]}}' /usr/nginx/logs/access.log
4统计ip访问前十的记录:
awk '{a[$1]++}END{for (i in a)print i,a[i]|"sort -k2 -nr|head -10"}' /usr/nginx/logs/access.log
5统计上一分钟ip的访问量
[root@tyjs09 ~]# date=$(date -d '-1 minute' +%Y/%m/%d:%H:%M)
[root@tyjs09 ~]# echo $date
2020/12/24:14:03
[root@tyjs09 ~]# awk -vdate=$date '$4~date{c++}END{print c}' /usr/nginx/logs/access.log
6统计访问最多的10个页面:
awk '{a[$7]++}END{for (i in a)print i,a[i]|"sort -k1 -nr|head -n10"}'at /usr/nginx/logs/access.log
7统计每个ip访问状态码的数量:
awk '{a[$1""$9]++}END{for (i in a)print i,a[i]}' /usr/nginx/logs/access.log
8统计ip访问404状态次数:
awk '{if($9~/404/)a[$1""$9]++}END{for (i in a)print i,a[i]}' /usr/nginx/logs/access.log
二 两个文件差异对比
1找出2个文件中相同的内容
awk 'FNR==NR{a[$0];next}{if ($0 in a)print $0}' a b
2找出2个文件中不同的内容
awk 'NR==FNR{a[$0];next}!($0 in a)' a b
3合并2个文件:
awk 'NR==FNR{a[$1]=$0;next}{print (a[$1]" "$2)}' a b
4将文件内相同ip的服务名合并
awk 'BEGIN{FS=":"}{a[$1]=a[$1]$2}END{for(v in a)print v,a[v]}' a
以后就记住,凡事将相同key但值不同的数据追加合并,就用for循环即可实现追加
5 将列合并成一行
awk '{a[i]=a[i]$i" "}END{for(v in a)print a[v]}' a
解释:
三行三列9个字符,将9个字符定义成数组a[i],那么for循环这个数组就可以循环9次
数组里面的内容就是:a[1]=1,a[2]=2,。。。。。。
循环时,当v=1时print a[v]=1,当v=2时print a[v]=2
a[i]=a[i]$i” ”是我们定义的变量
6将列合并成行
awk '{for(i=1;i<=3;i++)a[i]=a[i]$i" "}END{for (v in a)print a[v]}' a
解释:
如果要指定每列的显示个数,对一对for循环的次数做限制,符合条件后即换行接着循环