私はこのような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」を実行した後は、すべてのEメールアドレスを取得します(単一の「チャンク」出力の途中でも、例の2番目の出力)。
私はawkを使って最初の行と5番目の行(送信者の電子メールアドレス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の場合は標準)
バラより9.3.8 BRE表現の固定:
ㅏ
<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