• shell 统计nginx日志中从指定日期到结束日期之间每天指定条件匹配的总次数


    公司给出一个需求,指定时间内,统计请求driver.upload.position(司机位置上报接口)中,来源是华为push(come_from=huawei_push)的数量,要求是按天统计。

    看一下url格式,url中,method参数就是所请求的接口地址

    api10 100.116.219.186 | - | 17/May/2019:02:00:17 +0800 | GET /rest?app_ver=5.1.2.0&appkey=30000001&come_from=huawei_push&from=internal&
    gps_timestamp=1558029615&gps_type=baidu&latitude=1.0&log_time=20190517020015&longitude=1.0&mac=C8%3A94%3ABB%3A81%3AFD%3A79&
    method=driver.upload.position&milli_timestamp=1558029615091&model=HUAWEI-PRA-AL00&os=HUAWEI24%2C7.0&status=2&
    timestamp=2019-05-17%2002%3A00%3A15&token=&user=YZ52092&ver=3&sig=1cce09da019def3a7ed9fe08749d07c1
    HTTP/1.1 | 200 | 83 | - | - | 0.019 | okhttp/2.5.0 | 122.96.41.116 | 0.019

    log目录下的列表文件

    由于我们的日志是按照分钟来统计单位文件,以往的查询如果统计单天的话,一条grep语句就可以解决。

    $ cat 2019-05-17* | grep 'driver.upload.position' | grep 'come_from=huawei_push' 

    由于文件数据量比较大,每一次grep都会耗费巨大时间,如果仅仅一两天的这个稍微耐心等一下就可以了,现在是统计2018-12-01到2019-05-17号的,耗费不起。。

    第一个想到的就是shell 脚本,awk啊啥的。

    不了解grep啊 awk的匹配,可以看看这个文章linux sed、awk、grep同时匹配多个条(并且 or 或者)

    #!/bin/sh
    start_date=20181201   //开始时间
    end_date=20190517    //结束时间
    
    logdir=/data/logs/nginx_api  //日志目录
    i=0
    while true
    do
       oDate=`date -d "$start_date + $i day" "+%Y%m%d"`
       [ $oDate -gt $end_date ] && break
    
       day=${oDate:0:4}'-'${oDate:4:2}'-'${oDate:6:2}

            count=`find $logdir/$day* | xargs grep -E "(come_from=huawei_push.*driver.upload.position|come_from=huawei_push.*driver.upload.position)" | wc -l`
              echo $day'总数量为:'$count >>days.txt   //写入指定文件

    
       let i+=1
    done

    OK。执行脚本统计结果写入文件

    这里最初想到的是,通过年份获取每个月的天数,然后各种遍历操作,不小心百度发现shell还可以获取指定开始日期到指定结束日期的所有日期,皆大欢喜~所以以上内容就是这么解决的。

    补充:获取当前年份的每个月天数的shell

    for m in {1..12}; do
      date -d "$m/1 + 1 month - 1 day" "+%b - %d days"; 
    done
    //输出
    [root@node122 logs]# ./test.sh 
    Jan - 31 days
    Feb - 28 days
    Mar - 31 days
    Apr - 30 days
    May - 31 days
    Jun - 30 days
    Jul - 31 days
    Aug - 31 days
    Sep - 30 days
    Oct - 31 days
    Nov - 30 days
    Dec - 31 days
  • 相关阅读:
    libmegjb.so加载问题调试和分析
    art虚拟机启动问题分析
    高通发布骁龙808六核/810八核64位芯片
    pivotx的entry和page内容里的日期格式修改
    dlmalloc(Android bionic C库的malloc实现)简介
    dojo分析之declare接口
    零基础搞懂智能机之手机参数怎么看
    Google one联合联发科,国内低端智能机方案怎么办?
    自己搭建云存储(WIFI路由器上接硬盘)
    数据结构目录(浙大)
  • 原文地址:https://www.cnblogs.com/wt645631686/p/10881628.html
Copyright © 2020-2023  润新知