Exim - exigrep出力でEOLのマーカーは何ですか?

Exim - exigrep出力でEOLのマーカーは何ですか?

私はこのような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

関連情報