我有一个以下格式的日志文件
[30/Jan/2015:10:10:30 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 425
[30/Jan/2015:10:11:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 261
[30/Jan/2015:10:11:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 232
[30/Jan/2015:10:12:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 315
[30/Jan/2015:10:12:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 221
[30/Jan/2015:10:12:57 +0000] 12.30.30.182 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 218
此日志文件中的每一行在最后一个字段中都有响应时间,并且在第一个字段中有时间戳。有没有办法awk
读取所有特定时间间隔内的平均响应时间?例如,每五分钟计算平均响应时间。
我尝试了以下方法,这是一种静态方法,只会给出一个时间间隔的平均值。
$ grep "30/Jan/2015:10:1[0-4]" mylog.log | awk '{resp+=$NF;cnt++;}END{print "Avg:"int(resp/cnt)}'
但我需要对整个文件执行全部 5 分钟。即使我循环命令,如何将日期动态传递给命令?因为日志文件每次以及其中的日期都会有所不同。
或者除了这个之外还有什么最好的替代方法吗awk
?请建议。
答案1
在第一次关闭时,它可以是:
awk -F"[][ ]*" -v it=300 '{
sub(":"," ",$2)
gsub("/"," ",$2)
"date +%s -d \""$2"\""|getline d
if (d-f>it) {
f=d
if (NR!=1)
print s/n
s=n=""
}
n++
s+=$NF
}' log.file
-F"[][ ]*"
用作F产量S分隔符额外去除方括号-v it=300
设置变量(间隔以秒为单位)sub,gsub
从字段中删除符号以准备date
命令格式date
将字段转换为第二个(来自 EPOCH)|getline d
将上面的内容放入d
变量中