2016-11-07 48 views
0
echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | \ 
sed -rn "s/(.*\|)([0-9]{4}-[0-9]{2}-[0-9]{2})\ ([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3})\2\3/p" 

嗨提取的日期和時間,正則表達式從日誌

我試圖提取從上面的線的日期和時間。你能告訴我什麼是缺少的?

我得到這個錯誤,不知道如何解決它

sed: -e expression #1, char 81: unterminated `s' command 
+1

缺少中間'/'字符?即'sed's /..../ \ 2 \ 3/p''?祝你好運。 – shellter

回答

2

的是在你的命令中沒有替換字符串。 s命令必須包含3個分隔符:s/pattern/string/

試試這個:

$ echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | sed -rn "s/.*\|([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}).*/\1/p" 
2016-11-0618:44:07.577 

此外,在評論中指出:

  • 你只需要一個捕獲組日期和時間
  • 點字符必須在模式進行轉義(\.[0-9]{3} ,而不是.[0-9]{3}),但不包含空格字符({2} [0-9],而不是{2}\ [0-9]
+0

你不需要轉義空格字符,但是如果你想要精確的話你需要轉義點字符(毫秒)(並且你不需要爲第一組創建一個組,你可以編寫'\ 1 \ 2'之後,否則,作品 –

+0

@ Jean-FrançoisFabre你是對的,我編輯過。 – SLePort

2

awkcut更適合這項任務

$ s='INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html' 

$ echo "$s" | awk -F\| '{print $2}' 
2016-11-06 18:44:07.577 

$ echo "$s" | cut -d\| -f2 
2016-11-06 18:44:07.577