![tail + grep + cutの組み合わせが機能しないのはなぜですか? [コピー]](https://linux33.com/image/114505/tail%20%2B%20grep%20%2B%20cut%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
ログの追跡中に、一部のログを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)}'