【问题标题】:Converting date to epoch date - Runs slower将日期转换为纪元日期 - 运行速度较慢
【发布时间】:2015-11-24 06:01:57
【问题描述】:

我有一个格式的日志文件

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 中的 Timestamp 转换成 UnixTime,然后用它来比较。当我这样做时,我的 awk 命令会变得很慢

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

  1. 从第一列中选​​择日期,将其转换为纪元日期
  2. 将纪元与第 5 列一起打印

但这运行速度很慢。

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 个日志文件执行此操作,因此速度非常慢

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

【问题讨论】:

  • 不,方法是错误的。根据您发布的示例输入,编辑您的问题以包含预期的输出,并告诉我们您是否拥有或可以安装 GNU awk(运行 awk --version),以便我们为您提供帮助。

标签: performance unix awk epoch


【解决方案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

但您还没有向我们展示您要使用该信息做什么,因此我们无法为您提供任何进一步的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2018-04-24
    • 2011-12-06
    • 2012-07-18
    • 2019-08-21
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多