衍生文章链接:https://blog.csdn.net/enjoyphp/article/details/100024220
项目中亲测,命令全部有效
日志截取,从总日志文件中截取昨天已整天的数据出来,并覆盖到新文件中:
cat access.log | awk '$4 >="[14/Mar/2019:00:00:00" && $4 <="[14/Mar/2019:23:59:59"' > 20190314-access.log
若不想要覆盖新文件,想要追加到文件内则可以用“>>” 替代">"。上面这个命令亲测有效,以下命令也可以试试,但我试了没用,截取出来会有问题。
cat access.log | awk '$4 >="14/Mar/2019:00:00:00" && $4 <="14/Mar/2019:23:59:59"' > 20190314-access.log
cat access.log | awk '$4 >="[14/Mar/2019:00:00:00" && $4 <"[15/Mar/2019:00:00:00"' > 20190314-access.log
然后再对切割出来的昨天一整天的日志进行分析:
1、总访问量:
grep "keyword" access.log | awk "{print $NF}" | wc -l
若要过滤掉ip黑名单,不匹配某些ip,则可以这样:
grep -vE "ip1|ip2" access.log | grep "keyword" | awk "{print $NF}" | wc -l
2、接口成功访问量:
grep "keyword" access.log | grep -E " 200 " | awk "{print $NF}" | wc -l
或者状态码是20开头的:
grep "keyword" access.log | grep -E " 20\d?" | awk "{print $NF}" | wc -l
3、统计某路由平均响应时间($upstream_response_time参数):
grep "keyword" access.log | awk '{print $NF}' | grep -P '\d{3}?$' | awk '{sum += $0;}END {if(sum==0)print 0;else print sum/NR}'
用if做了个判断,若日志中没有访问此接口,则为0,可以解决awk 报错division by zero attempted,即0不能做除数
4、接口失败数量:
总访问量 - 接口成功访问量
=