我有一个 mail.log 行,使用 sed 和管道我可以提取邮件的主题、发件人和收件人,
echo "Jul 15 09:04:38 mail postfix/cleanup[36034]: 4A4E5600A5DE0: info: header Subject: The tittle of the message from localhost[127.0.0.1]; from=<sender01@mydomain> to=<recipient01@mydomain> proto=ESMTP helo=<mail.mydomain>" | sed -e 's/^.*Subject: //' -e 's/\]//' -e 's/from localhost//' -e 's/^.\];//' |sed -e 's/\[127.0.0.1; //' -e 's/proto=ESMTP helo=<mail.mydomain>//'
我有输出
The tittle of the message from=<sender01@mydomain> to=<recipient01@mydomain>
我想要的输出是
Jul 15 09:04:38 The tittle of the message from=<sender01@mydomain> to=<recipient01@mydomain>
如何提取日期并将其添加到输出中?
答案1
丑陋但把它放在声明的开头sed
:
-e 's/^\([[:alpha:]]+ [[:digit:]]+ [[:digit:]]+:[[:digit:]]+:[[:digit:]]+\).*Subject:\(.*\)/\1\2/'
或者,如果您始终知道“mail postfix”将出现在该位置的文本中,您可以使用:
-e 's/^\(.*\) mail postfix.*Subject:\(.*\)/\1\2/'
并且其他变化也是可能的。关键是捕获日期,跳过您不关心的部分,并再次捕获仍需要处理的其余部分。要使用 和 捕获环绕声\(
并\)
打印捕获的内容,请使用\n
其中 n 是特定捕获的位置(第一个是 1,第二个是 2,等等)
现在您知道了这一点,您可能可以弄清楚如何消除所有单独的指令 (-e)、使用多个捕获组并将其简化为单个sed
表达式。