カットのバッファリングを解除する方法は?


8

メールログファイルから「@ 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コマンドは(非)バッファリングについては説明しません。


awk -F'[><@]' '/@xyz.nl/ {print $2}'...
jasonwryan

1
してみてくださいgrep -oP '[^<]+(?=@xyz.nl)'(必要に応じて、あなたの他のgrepのオプションと一緒に)
Sundeep

上記のawkとgrepの両方のオプションが魅力のように機能します!
Forkbeard

回答:


16

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

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

-oL それはあなたが望むもののように思われるラインバッファリングを行います。


これはまさに私が探していたものです、ありがとう!
Forkbeard

何らかの理由で私にとって何も変更しません。:(
panzi

1
@panziこの質問にリンクして、自由に質問してください。完全な詳細(可能な場合は実行している正確なコマンド、OS、ディストリビューション、バージョンなど)を含めてください。うまく行かない理由を誰かが理解できるようになれば幸いです。
derobert 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.