我有这样的 exigrep 输出。
2019-02-02 17:03:00 1gpxky-0005ky-Mk <= [email protected] U=XXXXX P=local S=14529 [email protected] T="XXXXXXXXX" for [email protected]
2019-02-02 17:03:00 1gpxky-0005ky-Mk Sender identification U=XXXXX D=XXXXX.com [email protected]
2019-02-02 17:03:00 1gpxky-0005ky-Mk SMTP connection outbound 1549123380 1gpxky-0005ky-Mk XXXXX.com [email protected]
2019-02-02 17:03:01 1gpxky-0005ky-Mk => [email protected] R=dkim_lookuphost T=dkim_remote_smtp H=gmail-smtp-in.l.google.com [XXX.XXX.XXX.XXX] X=TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128 CV=yes C="250 2.0.0 OK 1549123381 m21si11695854lfc.90 - gsmtp"
2019-02-02 17:03:01 1gpxky-0005ky-Mk Completed
2019-02-02 15:48:22 1gpwaj-00081N-5J H=mx2.XXXXX.pl [XX.XX.XX.XX]:15240 Warning: "SpamAssassin as takapara detected message as NOT spam (2.4)"
2019-02-02 15:48:22 1gpwaj-00081N-5J H=mx2.XXXXX.pl [XX.XX.XX.XX]:15240 Warning: Message has been scanned: no virus or other harmful content was found
2019-02-02 15:48:22 1gpwaj-00081N-5J <= [email protected] H=mx2.XXXX.pl [XX.XX.XX.XX]:15240 P=esmtp S=72014 id=9c38a455-1b57-404a-ae68-87ed816473a8 T="XXXXXXXXXX" for [email protected]
2019-02-02 15:48:23 1gpwaj-00081N-5J => XXXX <[email protected]> R=virtual_user T=dovecot_virtual_delivery C="250 2.0.0 <[email protected]> +A/zNratVVyfaQAADQHPYA Saved"
2019-02-02 15:48:23 1gpwaj-00081N-5J Completed
我有其中一些 - 但在完成 awk 正则表达式样式“grep”之后,我得到了所有邮件地址(甚至在单个“块”的输出中间 - 示例中的第二个输出)
我用 awk 搜索 grep 到第一行第五件事(发件人邮件地址 wo 在我的服务器上),但\n
不起作用。
我有这样的代码:
# cat /var/log/exim_mainlog | grep 2019-02-02 | exigrep {user_name} | awk '/^([0-9]*-[0-9]*-[0-9]*) ([0-9]*:[0-9]*:[0-9]*) ([0-9a-zA-Z]*-[0-9a-zA-Z]*-[0-9a-zA-Z]*) (<=).*\n/ {print $5}'
这里如何定义EOL?
答案1
awk
和grep
使用“$”作为行尾标记(POSIX 正则表达式的一个功能)。 \n
不是其中的一部分,无论是基本正则表达式(grep 的默认值)或扩展正则表达式(grep 的一个选项,awk 的标准)。
A
<dollar-sign>
( '$' ) 在用作整个 BRE 的最后一个字符时应为锚点。该实现可以处理<dollar-sign>
用作子表达式的最后一个字符时作为锚点。这<dollar-sign>
应将表达式(或可选的子表达式)锚定到匹配字符串的末尾;这<dollar-sign>
可以说是匹配最后一个字符后面的字符串结尾。
从评论中 - 如果您只想打印 awk 中的第一个匹配项,您可以对块执行类似的操作
{print $5}
替换为
{if (found) next; found = 1; print $5; }
答案2
上面提到的命令应该有效:
awk 'NR==1{print $5}' filename