2

我正在编写一个脚本,为了实现卓越,必须将日期和时间格式从日志文件转换为时间戳。我想要这个以便稍后进行比较。

我的日志文件具有以下格式:

2012-11-06 10:32:45
<log message follows here on multiple lines in XML format> 

我正在使用以下 gawk 表达式将我的日期/时间转换为时间戳:

$ gawk '/^([0-9]{2,4}-?){3} ([0-9]{2}\:?){3}/{print $0;gsub(/\:/," ");print mktime($0)}' logfile.txt

输出将是:

2012-11-01 15:27:28
1293719248

这实际上是我正在寻找的,但问题是正则表达式是否正确?由于我远离正则表达式大师,我也想知道这是否可以。当涉及到正则表达式时,这是否可以以一种更好的方式完成?日志文件中使用的格式永远不会改变,因为我没有费心进行通用日期/时间匹配。也许我表达中的其他东西是fubar?:-)

4

3 回答 3

4

要匹配的 ERE:

2012-11-06 10:32:45

就其本身而言是:

^[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}$

但你可能会逃脱:

^[[:digit:]]([[:digit:]: -][[:digit:]]{2}){6}$

没有得到任何错误的匹配。

于 2012-11-06T17:51:06.427 回答
3

如果你只处理你的日志文件,那么正则表达式就可以了。因为您可以假设您的日志文件将始终提供有效的日期时间字符串。(例如2012-13-56 28:23:77不会发生)

但我要指出的是,您的 awk 代码可能有问题。

  • 我不知道您使用的是哪个 gawk 版本(我猜 > 4.0), --re-interval如果版本 < 4,则选项不是默认值。

  • 您的字符串替换存在错误:您也应该将“-”替换为“”,对吗?

awk 手册页:

 mktime(datespec)
                 Turns datespec into a time stamp of the same form as returned by systime().  The datespec is a string of the form YYYY MM DD HH  MM  SS[  DST].

看到不同:

kent$  gawk '{print $0;gsub(/:|-/," ");print mktime($0)}' <<<"2012-11-01 15:27:28"
2012-11-01 15:27:28
1351780048

output with your awk line:
2012-11-01 15:27:28
1293719248
于 2012-11-06T10:18:13.963 回答
3

可以完全取消正则表达式并简单地测试mktime()' 的失败。显然,这取决于您的数据是否可以包含具有日期/时间外观的行。但是,您可能没有考虑过这样做:

awk '{ line = $0; gsub(/[:-]/, " "); time = mktime($0) } time != "-1" { print line ORS time }' file.txt

结果:

2012-11-06 10:32:45
1352161965

从手册页:

If datespec does not contain enough elements or if the resulting time is out of 
range, mktime() returns −1.
于 2012-11-06T14:58:40.317 回答