shell 統計nginx日誌中從指定日期到結束日期之間天天指定條件匹配的總次數

公司給出一個需求,指定時間內,統計請求driver.upload.position(司機位置上報接口)中,來源是華爲push(come_from=huawei_push)的數量,要求是按天統計。html

看一下url格式,url中,method參數就是所請求的接口地址node

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目錄下的列表文件linux

因爲咱們的日誌是按照分鐘來統計單位文件,以往的查詢若是統計單天的話,一條grep語句就能夠解決。nginx

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

因爲文件數據量比較大,每一次grep都會耗費巨大時間,若是僅僅一兩天的這個稍微耐心等一下就能夠了,如今是統計2018-12-01到2019-05-17號的,耗費不起。。git

第一個想到的就是shell 腳本,awk啊啥的。shell

不瞭解grep啊 awk的匹配,能夠看看這個文章linux sed、awk、grep同時匹配多個條(而且 or 或者)api

#!/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   //寫入指定文件app

 let i+=1 done

OK。執行腳本統計結果寫入文件url

 

這裏最初想到的是,經過年份獲取每一個月的天數,而後各類遍歷操做,不當心百度發現shell還能夠獲取指定開始日期到指定結束日期的全部日期,皆大歡喜~因此以上內容就是這麼解決的。spa

補充:獲取當前年份的每一個月天數的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
相關文章
相關標籤/搜索