日志文件包含带有消息标记的日志语句,如下所示

时间:2017-06-12 17:56:27

标签: awk logfile

日志文件包含带有消息标记的日志语句,如下所示。 该实用程序列出了超过指定时间的所有操作。从命令行以秒为单位指定时间。

输入:

#<process id> <date time> <log level> <file name> <line number> <actual message>

1098 2007-02-28 15:23:09 WARN db_util.c 5928 Config file not found, using default values
1098 2007-02-28 15:23:09 INFO db_util.c 5908 Connecting to database
1098 2007-02-28 15:23:17 INFO db_util.c 5908 Connected to database
1098 2007-02-28 15:23:17 ERROR log_test.c 198 Unable to setup our satellite launch system
1098 2007-02-28 15:23:18 INFO log_test.c 198 Reconnecting to launch the satellite
1098 2007-02-28 15:23:21 INFO log_test.c 198 Reconnected. Initialize to launch the satellite

例如:如果通过将输入文件作为输入并且性能阈值时间为2秒来执行该实用程序,则应该生成此输出:

1098 2007-02-28 15:23:09 INFO db_util.c 5908 Connecting to database
1098 2007-02-28 15:23:18 INFO log_test.c 198 Reconnecting to launch the satellite.

我发现此代码适用于上述问题陈述:

awk -v threshold=$1 '{texttime=mktime(gensub(/-|:/," ", "g", $2" "$3))} NR>1 && texttime-prevtexttime>threshold{print prevrecord} {prevtexttime=texttime; prevrecord=$0}' $2

是否有更优雅的方式将当前记录的日期和时间转换为unix时间戳?除此(mktime(gensub(/-|:/," ", "g", $2" "$3)))

之外

1 个答案:

答案 0 :(得分:0)

用awk?不是真的(只需将/-|:/更改为/[-:]/)。我相信perl有strptime()可以省去一个函数调用等效代码,但恕我直言,不值得为此改变工具/语言。