繁体   English   中英

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

[英]RegExp to match date and time from custom log file

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

我的日志文件格式为:

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? :-)

要匹配的ERE:

2012-11-06 10:32:45

在它自己的一行是:

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

但你可能会逃脱:

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

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

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

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

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

  • 您的字符串替换中存在错误:您应该将“ - ”替换为“”以及正确吗?

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

可以完全取消正则表达式,只需测试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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM