簡體   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