之前面试中被问到了一些关于nginx日志统计的问题,复习一下。
nginx的日志格式如下:
日志大体长这个样子:
关于日志数据呢,各位可以自己从公司搞一份。不方便的话,我准备了一份(https://download.csdn.net/download/xiao1xuan2/10961732),在我的下载资源当中。(!!!汗,本来是想免费提供的,但是CSDN现在不支持调整积分了)。
1.统计IP访问量(独立ip访问数量)
[www@localhost test]$ cat test.log | awk '{print $1}'|sort -n |uniq| wc -l
261
awk 取得第一列;
sort -n正序排序,sort -rn倒叙排序;
uniq去重,这里需要注意unix的用法:uniq 命令读取由 InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。);
wc -l 做统计;
2.统计2月16日12点-24点这段时间的访问总次数
[www@localhost test]$ cat test.log | grep -E '16\/Feb\/2019:1[2-9]|16\/Feb\/2019:2[0-3]'| wc -l
1242
主要麻烦在这个正则表达式上。
3.查看访问最频繁的前5个IP,并列出访问次数
[www@localhost test]$ cat test.log | awk '{print $1}'|sort -n|uniq -c| sort -rn| head -5
6580 1.119.1.242
2341 123.121.224.46
2052 123.121.223.119
572 123.121.207.249
450 123.121.226.178
sort -n|uniq -c 首先做去重操作;
sort -rn 倒序排序;
head -5 区前5个;
4.查看访问次数大于X(这里假设是100)的IP,并列出访问次数
[www@localhost test]$ cat test.log | awk '{print $1}'|sort -n|uniq -c| sort -rn| awk '{if($1 > 100) print $0}'
6580 1.119.1.242
2341 123.121.224.46
2052 123.121.223.119
572 123.121.207.249
450 123.121.226.178
277 47.95.15.186
184 114.242.250.101
175 114.242.248.123
158 221.178.126.227
122 157.230.33.140
120 219.237.112.98
嘿嘿,我的leader常说的一句话,一个awk不行就两个。
5.查询出访问最频繁的URL
[www@localhost test]$ cat test.log | awk '{print $7}'|awk -F'?' '{print $1}'|sort -n|uniq -c|sort -rn|head -1
2783 /user/info
awk -F'?' '{print $1}' 按照指定的分隔符分割。
6.统计访问成功次数
最开始呢,我直接写的响应值为200即可
[www@localhost test]$ cat test.log |awk '{if($9 == 200) print $9}'|wc -l
12954
后来想到万一有别的状态码呢,于是又写了一个正则匹配表达式
[www@localhost test]$ cat test.log |awk '{if($9 ~ /2[0-9]{2}/) print $9}'|wc -l
12982
果然有误差,有一些206的状态码。所以平时写东西要小心。