web-dev-qa-db-ja.com

コマンドの出力をgrepにパイプしてから、別のコマンドにパイプする

1つのスクリプトの出力を取得してから、このputputをgrepにパイプし、grepの出力を別のスクリプトにパイプします。

./script1 | grep 'expr' | ./script2

ただし、2番目のスクリプトは入力を受け取りません。繰り返しますが、script2catに、script1pingに置き換えても何も出力されません。

ping localhost | grep localhost | cat

grepawkに置き換えても同じことが起こります:

ping localhost|awk '{print $1}'|cat

何が起こっている?

5
user3469976

grepはバッファリングしています(出力がターミナルではないと判断されるためです。厳密に言えば、これはCライブラリの動作です)。

これを無効にするには、unbuffer -p-pは、unbufferが標準入力から読み取るために必要です):

ping localhost | unbuffer -p grep localhost | cat

または、grepに行ごとにバッファするように指示します(これがサポートされている場合):

ping localhost | grep --line-buffered localhost | cat
6
Stephen Kitt