美文网首页
awk, wc, uniq, grep, sort等命令的组合,

awk, wc, uniq, grep, sort等命令的组合,

作者: 猪蹄胖 | 来源:发表于2019-02-13 21:58 被阅读0次

    定制化过的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等命令的组合,

          本文链接:https://www.haomeiwen.com/subject/eoyjeqtx.html