Nginx-日志分析

 

##日志格式

'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'



首先把字段解释一下:

remote_addr:客户端地址

remote_user:客户端用户名

time_local:服务器时间

request:请求内功(包括方法名,地址,http协议)

http_host:用户请求时使用的http地址

status:返回的http状态码

request_length:请求大小

body_bytes_sent:返回的大小

http_referrer:来源页

http_user_agent:客户端名称

request_time:整体请求延时

1)统计日志中访问最多的10IP

思路:因为remote_addr代表的客户端ip,所以取第一列就好了,并且去重,输出次数就ok了

方法1:awk '{a[$1]++}END{for(i in a) print a[i],i| "sort -k1 -nr|head -n10"}' access.log

解释一下:

说明:a[$1]++ 创建数组a,以第一列作为下标,使用运算符++作为数组元素,元素初始值为0。处理一个IP时,下标是IP,元素加1,处理第二个IP时,下标是IP,元素加1,如果这个IP已经存在,则元素再加1,也就是这个IP出现了两次,元素结果是2,以此类推。因此可以实现去重,统计出现次数,

sort  #排序

-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以那个区间 (field) 来进行排序的意思
 
head # 
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数
 
方法二:
awk '{print $1}' access.log |sort|uniq -c |sort -k1 -nr|head -n10
uniq 命令用于报告或忽略文件中的重复行,一般与sort命令结合使用 
   -c或——count:在每列旁边显示该行重复出现的次数; 
  -d或–repeated:仅显示重复出现的行列; 
  -f<栏位>或–skip-fields=<栏位>:忽略比较指定的栏位; 
  -s<字符位置>或–skip-chars=<字符位置>:忽略比较指定的字符; 
  -u或——unique:仅显示出一次的行列; 
  -w<字符位置>或–check-chars=<字符位置>:指定要比较的字符


2)统计日志中访问大于10次的IP

方法1$ awk '{a[$1]++}END{for(i in a){if(a[i]>10)print i,a[i]}}' access.log

方法2$ awk '{a[$1]++;if(a[$1]>10){b[$1]++}}END{for(i in b){print i,a[i]}}' access.log

说明:方法1是将结果保存a数组后,输出时判断符合要求的IP。方法2是将结果保存a数组时,并判断符合要求的IP放到b数组,最后打印b数组的IP
那大于100次呢,会了吧~~~~

3. 统计201649日一天内访问最多的10IP

思路:先过滤出这个时间段的日志,然后去重,统计出现次数

方法1$ awk '$4>="[9/Apr/2016:00:00:01" && $4<="[9/Apr/2016:23:59:59" {a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

方法2$ sed -n '/\[9\/Apr\/2016:00:00:01/,/\[9\/Apr\/2016:23:59:59/p' access.log |sort |uniq -c |sort -k1 -nr |head -n10  #前提开始时间与结束时间日志中必须存在

4)统计当前时间前一分钟的访问数

思路:先获取当前时间前一分钟对应日志格式的时间,再匹配统计

$ date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$0~date{c++}END{print c}' access.log

$ date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$4>="["date":00" && $4<="["date":59"{c++}END{print c}' access.log

$ grep -c $(date -d '-1 minute' +%d/%b/%Y:%H:%M) access.log

说明:date +%d/%b/%Y:%H:%M --> 09/Apr/2016:01:55

5)统计访问最多的前10个页面($request


awk '{a[$7]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

6)统计每个URL访问内容的总大小($body_bytes_sent

$ awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}' access.log

 

7)统计每个IP访问状态码数量($status

$ awk '{a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

8)统计访问状态码为404IP及出现次数

$ awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log



猜你喜欢

转载自www.cnblogs.com/superzwb/p/13186979.html