将日期转换为纪元日期 - 运行速度较慢

时间:2015-08-29 20:17:16

标签: performance unix awk epoch

我有一个格式为

的日志文件
RESPONSE1: Sat Aug 29 07:25:06 EDT 2015: oltp: response | {"status":"success"}|123457 | CCT | 6
RESPONSE1: Sat Aug 29 07:25:07 EDT 2015: oltp: response | {"status":"fail"}|123437 | CCT |

每个字段都是管道分隔的,我需要在两个时间戳之间找到某个KPI。

我的方法是首先在UnixTime中转换时间戳,然后将其用于比较。当我这样做时,我的awk命令变得很慢

我正在使用这种方式。我的目标只是这样做

  1. 从第1列中选择日期,将其转换为纪元日期
  2. 与第5列一起打印纪元
  3. 但这很慢。

    awk -F "|" '$5>0 {print $1"|"$5}' ${logfilename} | sed -e "s/RESPONSE1: //g" -e "s/: oltp:/|/g" | awk -F "|" '{t=$1;"date -d \""t"\" +%s" | getline d; close("date -d \""t"\" +%s"); print d,$2}'

    任何有助于加快速度的帮助都会很好。每个日志文件都非常庞大,我需要在至少5到6个日志文件上执行此操作,因此非常慢

    如果方法正确,请告诉我。

1 个答案:

答案 0 :(得分:1)

这是如何使用GNU awk高效打印epoch secs中的时间加上第5个字段的值:

$ cat tst.awk
BEGIN {
    FS=" *[|] *"
    for (i=1;i<=12;i++) {
        m[substr("JanFebMarAprMayJunJulAugSepOctNovDec",(i-1)*3+1,3)] = i
    }
}
{
    split($1,t,/[ :]+/)
    print mktime(t[9]" "m[t[3]]" "t[4]" "t[5]" "t[6]" "t[7]), $5
}

$ awk -f tst.awk file
1440851106 6
1440851107

但是您还没有向我们展示您正在尝试使用该信息,因此我们无法为您提供进一步的帮助。