2016-11-07 70 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