RegEx用于匹配自定义日志文件中的日期和时间

时间:2012-11-06 09:48:17

标签: regex awk gawk

我正在编写一个脚本,为了实现优势,必须将日期和时间格式从日志文件转换为时间戳。我希望以后能够轻松比较。

我的日志文件格式为:

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

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

3 个答案:

答案 0 :(得分:4)

要匹配的ERE:

2012-11-06 10:32:45

在它自己的一行上是:

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

但你可能会逃脱:

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

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

答案 1 :(得分:3)

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

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

  • 我不知道您使用的是哪个gawk版本(我猜&gt; 4.0),--re-interval选项不是默认版本&lt; 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

答案 2 :(得分: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.