tail + grep + cutの組み合わせが機能しないのはなぜですか? [コピー]

tail + grep + cutの組み合わせが機能しないのはなぜですか? [コピー]

ログの追跡中に、一部のログをgrepして行が長すぎるため、各行の一部だけを印刷したいと思います。

私が使っている組み合わせがなぜ機能しないのか理解できません。手順は次のとおりです。

echo 'Jun 29 16:27:00 someip rails[pid]: Killed a transaction
Jun 29 16:28:00 someip rails[pid]: Killed a transaction' > /tmp/test

# Shows the lines
tail -f /tmp/test | grep Killed

# Shows the lines
grep Killed /tmp/test | cut -c -43

# Shows the lines
cat /tmp/test | grep Killed | cut -c -43

# Doesn't show them
tail -f /tmp/test | grep Killed | cut -c -43

最後の組み合わせが機能しないのはなぜですか?

答え1

コメントで指摘したように、問題はバッファリングによって引き起こされます。あなたができることは、示されているstdbufようにコマンドを実行することです。ここ

stdbuf -i0 -o0 -e0 tail -f /tmp/test | grep Killed | cut -c -43

grepところで、おそらくパイプを取り除き、cut次のものを使用できます。

stdbuf -i0 -o0 -e0 tail -f /tmp/test | awk '/Killed/{print substr($0,length($0)-43)}'

関連情報