如何使用awk读取所有频繁时间间隔之间的数据

如何使用awk读取所有频繁时间间隔之间的数据

我有一个以下格式的日志文件

[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变量中

相关内容