メールログファイルから「@ xyz.nl」で終わるメールアドレスのみを取得したい。これを達成するには、次のようにします。
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2
--line-buffered with grepは、パイプが端末と見なされないために出力をバッファリングするため、必要です。Grepは次のような行を出力します。
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone@xyz.nl>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)
最初のカットは次のようになります。
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone
2番目のカットは以下を生成するはずです:
someone
ただし、カットもバッファリングのようです。tail -fの代わりにcatを使用してコマンドを開始すると、ログファイルからすべての関連する結果が(推奨される形式で)取得されます。しかし、ログファイルの結果をリアルタイムで確認する必要があります。
私はこれにunbufferを使ってみました:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
また試しました:
# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
...最初のカットから4Kバッファリングを削除します。ただし、これは機能しません。ローカルドメインでgrepを実行すると、ヒット数が大幅に増えると、バッファーがすぐにいっぱいになり、出力が早く生成されます(4Kバッチ)。
だから私の質問は:カットをバッファリング解除するにはどうすればよいですか?
関連:私はsedを知っており、(g)awkは私に電子メールアドレスを配信できます。私は試しましたが、まだ結果はありません。sedまたは(g)awkを使用した回答は歓迎されており、私の直接的な問題を解決する可能性がありますが、cutコマンドのバッファリングを解除する方法の質問の名目上の回答には引き続き興味があります。cutコマンドは(非)バッファリングについては説明しません。
grep -oP '[^<]+(?=@xyz.nl)'
(必要に応じて、あなたの他のgrepのオプションと一緒に)
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...