[英]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.