首先先了解下nginx日誌的格式(未修改conf文件的日誌格式)nginx
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"';
日誌格式,對應變量以下ide
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]++} END{for (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]++} END{for (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} END{for(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]++} END{for (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]++} END{for (i in ips){ print i,ips[i]}}' access.log