我如何为 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