awk与nginx日志分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk与nginx日志分析相关的知识,希望对你有一定的参考价值。
首先先了解下nginx日志的格式(未修改conf文件的日志格式)220.248.44.xx- - [11/Jun/2019:08:32:47 +0000] "GET / HTTP/1.1" 200 53902 "http://47.102.121.2xx/" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0; SE 2.X MetaSr 1.0) like Gecko"
取一段测试日志进行分解
nginx.conf中日志格式
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
日志格式,对应变量如下
220.248.44.xx $remote_addr #请求者IP
- - 格式
- $remote_user #请求者名称
[11/Jun/2019:08:32:47 +0000] [$time_local] #时间
"GET / HTTP/1.1" "$request" #请求的内容
200 $status #状态码
53902 $body_bytes_sent #请求文件的大小
"http://47.102.121.2xx/" "$http_referer" #请求的页面
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0; SE 2.X MetaSr 1.0) like Gecko" #来自何种方式(手机端,pc端等)
"$http_x_forwarded_for"‘ #nignx请求头,此信息并不真实可信
示例1:打印某个时段的日志
` awk ‘$4>="[14/Jun/2019:18:11:00" && $4<="[14/Jun/2019:18:20:00"‘ access.log`
示例2:打印某天访问IP的top10
awk ‘/14\/Jun\/2019/ ips[$1]++ ENDfor (i in ips) print i,ips[i]‘ access.log | sort -k2rn | head -10
首先正则过滤时间,将IP作为数组ips索引,值++ 行处理后遍历数组ips索引,最后打印索引和索引的值,进行排序 for(i in ips)取的是数组的索引
示例3:打印某天访问url的top10
awk ‘/14\/Jun\/2019/ urls[$7]++ ENDfor (i in urls) print i,urls[i]‘ access.log | sort -k2rn | head -10
示例4:打印某天访问url的大小统计top10及访问次数
awk ‘/14\/Jun\/2019/ urls[$7]++;size[$7]+=$10 ENDfor(i in size) print i,size[i],urls[i]‘ access.log | sort -k2rn | head -10
解释下为什么是urls[i],因为i从size中拿到了索引,索引是$7,也就是url.所以数组urls[i]等于urls[url],打印出来就是它++的值>,也就是次数
示例5:打印某天 ip访问状态码404的次数top10
awk ‘/14\/Jun\/2019/ ip_stat[$1" "$9]++ ENDfor (i in ip_stat) print i,ip_stat[i]‘ access.log | sort -k3rn | head -10
示例6:截取前一分钟的日志取ip行
date=`date -d "1 minute ago" +%d/%h/%Y:%H:%M`;awk -v date=$date ‘$0 ~ date ips[$1]++ ENDfor (i in ips) print i,ips[i]‘ access.log
以上是关于awk与nginx日志分析的主要内容,如果未能解决你的问题,请参考以下文章