32

典型的な Apache アクセス ログを使用すると、次を実行できます。

tail -f access_log | grep "127.0.0.1"

指定した IP アドレスのログ (作成時) のみが表示されます。

grepしかし、結果をさらに制限するために 2 回目のパイプ処理を行うと、なぜこれが失敗するのでしょうか?

たとえば、「.css」の単純な除外:

tail -f access_log | grep "127.0.0.1" | grep -v ".css"

出力は表示されません。

4

2 に答える 2

53

ここでの問題は、最初の grep が出力をバッファリングしていることです。つまり、2 番目の grep は、バッファがフラッシュされるまでそれを認識しません。

--line-buffered最初の grep にオプションを追加してみてください。

tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css"

詳細については、「BashFAQ/009 -- バッファリングとは何ですか? または、コマンド ラインで出力が生成されないのはなぜですか?」tail -f logfile | grep 'foo bar' | awk ...を参照してください。

于 2012-12-13T11:37:42.430 に答える
13

これはバッファリングの結果であり、十分なデータが利用可能になったときに最終的に出力されます。

Shawn Chin--line-bufferedが提案するオプションを使用するか、利用可能な場合は、次の方法で同じ効果を得ることができます。stdbuf

tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css"
于 2012-12-13T11:40:06.927 に答える