使用awk,sort和uniq从ATS访问日志中统计出异常链接域名的次数排名
在运维过程中,发现portal中出现流量异常曲线,
就从排查ATS的访问日志中的异常域名开始,下面是我截获的对应时段的访问日志截图
发现里面有502,403等异常响应,我们将这段访问日志文件记为exception_peak.log。采用下面的命令来过滤出502的访问记录,并剥离出对应的访问链接的host,统计指定时段中的该host出现次数,最后逆序排名。
cat exception_peak.log | grep ‘ 502 ‘ | awk -F ‘”‘ ‘{print $2}’ | awk -F ‘/’ ‘{print $3}’ | sort | uniq -c | sort -nr > host_peak.log
这里说明如下:
grep ‘ 502 ‘ 只过滤出502的访问记录,
awk -F ‘”‘ ‘{print $2}’表示以双引号为分隔线,取第2段子域,也就是访问链接,
awk -F ‘/’ ‘{print $3}’表示从访问链接中提取出host
sort | uniq -c 表示现将可能重复的行放到一起,再去掉重复行,并标注每行重复的次数
sort -nr 表示按重复次数逆序排名
这样处理的结果将会被重定向到一个名为 host_peak.log的日志文件中,它的内容如下
这就是我们想要的效果。
注意:如果采用下面的命令
cat exception_peak.log | grep ‘ 502 ‘ | awk -F ‘”‘ ‘{print $2}’ | awk -F ‘/’ ‘{print $3}’ | awk ‘a[$1]+=1;END{for(i in a){print a[i]” “i;}}’ | sort -k1 -urn > host_peak.log
我们会发现有个小bug就是,数字ip的次数无法统计,参见下面的截图
另外,下面是可能需要用到的几个命令:
awk -F “/“ ‘{print $0}’
awk -F “/“ ‘{if ($1==502) print $2}’
awk -F “:“ ‘{print $1,$2}’
———————
awk删除文件的某一列
cat file |awk ‘ { $5=null;print $0 }’
实际的项目开发/测试中常用的统计命令;比如说项目开发完了,正在测试环中测试,这时候如果有一个脚本可以实时统计出php的errors.log日志中出现PHP Notice的错误,这是一件很棒的事情;(发现问题,及时反馈给项目的开发小伙伴)
cat /var/log/php/errors.log|grep ‘Undefined’|awk ‘{$2=null;print $0}’| sort | uniq -c|sort -nr
如图: