バッファーカットをキャンセルする方法は?

バッファーカットをキャンセルする方法は?

私のメールログファイルで「@xyz.nl」で終わるEメールアドレスだけを取得したいと思います。これを達成するには、次のようにします。

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2

grepの--line-bufferedが必要です。そうしないと、パイプは端末と見なされないため、出力をバッファリングするためです。 Grep は次の行を出力します。

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, 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

しかし、カットもバッファリングされているようです。次にコマンドを起動すると変えるテール-fログファイルから関連するすべての結果(好ましい形式)を取得します。しかし、リアルタイムログファイルの結果が必要です。

私はこれを達成するために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コマンドをバッファリング解除する方法に関する質問に対する名目上の回答にはまだ興味があります。切り取りコマンドにはバッファリング(非)は含まれません。

答え1

GNU Coreutils(ほぼすべてのLinux)を使用している場合は、次のことを試すことができますstdbuf

… | stdbuf -oL cut -d '@' -f 1 | …

-oL必要に応じて行バッファリングを作成します。

関連情報