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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-05-17 CI(CodeIgniter)框架下使用非自带类库实现邮件发送
2017-05-17 B2B2C商品模块数据库设计
2017-05-17 PHP开发中多种方案实现高并发下的抢购、秒杀功能
2017-05-17 Linux CentOs集群LVS+Keepalived负载均衡的实现
2017-05-17 Mysql根据指定字段的int值查出在当前列表的排名
2017-05-17 CentOs下 SVN版本控制的安装(包括yum与非yum)
2017-05-17 Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)