正则表达式从日志中提取日期和时间

时间:2016-11-07 09:21:49

标签: sed

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

2 个答案:

答案 0 :(得分: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]
  • 进行转义

答案 1 :(得分: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