2012-11-06 65 views
2

我正在编写一个脚本,为了实现卓越,必须将日期和时间格式从日志文件转换为时间戳。我希望以后能够轻松进行比较。RegExp与自定义日志文件中的日期和时间匹配

我的日志文件的格式为:

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

回答

3

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

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

  • 我不知道的版本您使用的这些笨拙的人(我猜> 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 
+0

是的,我使用4.0.1。啊哈,好点(有趣)!由于我的输入生成了一个时间戳,而不是-1,我认为它吞下了日期部分,包括 - 正确。我阅读手册页,但懒惰和愚蠢,并忽略了 - 基于以前的声明。 :) 谢谢。 – Qben

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. 
+1

这很聪明,我会+1,因为它显示了解决问题的不同方法。出于好奇,这样做对性能的影响会更大吗? – Qben

+1

@Qben:在我的测试中,这实际上比你描述的正则表达式方法更快(即使我考虑肯特的答案并将你的两个打印语句减少到一个)。这种方法仍然只占用你三分之二的时间。有趣的嘿。 – Steve

+0

确实很有趣。我猜想编写mktime()的人比我有更好/更优化的正则表达式。 :-) – Qben

4

的ERE匹配:

2012-11-06 10:32:45 

上它自己的一行是:

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

,但你很可能逃脱:

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

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

+0

+1 - 这是完全正确的。请注意,大多数正则表达式实现允许您使用'\ d'作为'[:digit:]'的简写。 – ghoti