awk, wc, uniq, grep, sort等命令的组合,分析nginx的access和error日志

定制化过的nginx日志格式

^A 是内部自定义日志格式是加的隔离符号,Ctrl+V Ctrl+A,必须手动敲,复制无效

#nginx日志定义格式
log_format main '$time_local ^A $remote_addr ^A $request_method '
  ^A '$request_uri ^A $uri ^A $request_time '
  ^A '$status ^A  $body_bytes_sent '
  ^A '$geoip2_data_country_name ^A $geoip2_data_subdivisions_name ^A $geoip2_data_city_name '
  ^A '$http_referer ^A $upstream_addr ^A $upstream_response_time '
  ^A '$http_user_agent ^A $http_x_forwarded_for';

$time_local:本地时间
$remote_addr:请求客户端IP地址
$request_method:请求方法
$request_uri:请求的URL,不带有请求的参数
$uri:请求的URL,带有请求的参数
$request_time:请求处理时间,即响应时间
$status:返回状态
$body_bytes_sent:发送body大小
$geoip2_data_country_name:请求所属的国家
$geoip2_data_subdivisions_name:请求所属的省份或地区
$geoip2_data_city_name:请求所属的城市
$http_referer:请求来自于何处,例如从百度跳转过来
$upstream_addr:请求转发的后端服务器地址
$upstream_response_time:后端服务器响应的时间
$http_user_agent:访问客户端信息,可以获取到请求浏览器版本信息等
$http_x_forwarded_for:请求经过的代理信息

日志
29/Nov/2018:16:56:36 +0800 59.83.198.149 POST /frame9_v7/listallmessagebytype_v7 /frame9_v7/listallmessagebytype_v7 0.010 200 1181 China Shandong Jinan - 192.168.0.58:8000 0.010 okhttp/3.10.0 - 147- - -


nginx日志分析

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

思路:对IP列去重,并输出出现的次数
方法一:

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

方法二:

cat access.log | awk -F'^A' '{ print $2 }' |sort |uniq -c |sort -k1 -nr |head -n10
## ^A 是公司内部自定义日志格式是加的隔离符号,Ctrl+V Ctrl+A,必须手动敲,复制无效

统计日志中访问大于500次的IP

方法一:

cat access.log | awk -F'^A' '{a[$2]++}END{for(i in a){if(a[i]>500)print i,a[i]}}' access.log

方法二:

cat access.log | awk -F'^A' '{a[$2]++;if(a[$2]>500){b[$2]++}}END{for(i in b){print i,a[i]}}' access.log

统计2018年11月29日一天内访问你最多的10个IP

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

cat access.log |awk -F'^A' '$1>="29/Nov/2018:00:00:01" && $1<="29/Nov/2018:23:59:59" {a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' 

方法二:

#前提开始时间与结束时间日志中必须存在
sed -n '/29\/Nov\/2018:00:00:01/,/29\/Nov\/2018:23:59:59/p' access.log |sort |uniq -c |sort -k1 -nr |head -n10  

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

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

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

统计访问最多的前10个页面

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

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

cat access.log | awk  -F'^A'  '{a[$8]++;size[$8]+=$10}END{for(i in a)print a[i],size[i],i}' 

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

cat access.log | awk -F'^A' '{a[$1" "$9]++}END{for(i in a)print i,a[i]}'

统计访问状态为404的IP及出现次数

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

原生nginx日志

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;

192.168.149.9 - - [29/Nov/2018:02:00:22 -0500] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "-"


提取总记录数

思路:拆分原始文件,找到状态列,按照不同条件值,分别获取总数

cat access.log  | awk  '{if($8>0) print $9}' | wc -l | awk '{print "Total Items:"$1}' 
#Total Items:447

统计200成功总数

cat access.log  | awk  '{if($9==200) print $9}' | wc -l | awk '{print "Total Items:"$1}'  
#Total Items:400

统计404失败总数

cat access.log  | awk  '{if($9==404) print $9}' | wc -l | awk '{print "Total Items:"$1}'  
#Total Items:4

统计403失败总数

统计500失败总数

错误中,哪类URL出现次数最多,并提出重复项

思路:拆分获取request和status,对request拆分获取真实url,对url排序、去重、计算总数、倒叙排列

 cat access.log | awk '{if ($9==200) print $7}' | sort | uniq -c | sort -nr -k1 |head -n10

你可能感兴趣的:(awk, wc, uniq, grep, sort等命令的组合,分析nginx的access和error日志)