2 种日期格式 SED 的正则表达式

2 种日期格式 SED 的正则表达式

我如何为 sed 编写一个正则表达式,它从接受这两种日期格式的日志文件中仅提取 DATE 字段:

Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...

使用 awk 打印 $1 列在第二种情况下可以工作,但在第一种情况下不行。

答案1

尝试这个:

$ cat test.txt 
Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...
$ sed 's/^\([0-9:+\.T\-]*\|[A-Z][a-z]*\s*[0-9]*\s[0-9:]*\)\s.*/\1/' < test.txt 
Jun  9 16:56:14
2017-06-04T06:59:36.984086+02:00

解释:

  • 匹配行首:^
  • 使用反斜杠括号将您感兴趣的区域作为替换中的反向引用(见下文),即“日志文本的其余部分”之前的“日期”
  • 括号中:匹配两个变体(用于\|表示两个子表达式的替代)
  • 括号后:匹配该行的其余部分,因为我们想把它扔掉(一开始似乎有点违反直觉,但请参阅下一点)
  • 代替整条线(这就是我们匹配其余部分的原因)与日期匹配的反向引用:\1

相关内容