2012-11-06 16 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