我正在编写一个脚本,为了实现优势,必须将日期和时间格式从日志文件转换为时间戳。我希望以后能够轻松比较。
我的日志文件格式为:
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? : - )
答案 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.