1つのスクリプトの出力を取得してから、このputputをgrepにパイプし、grepの出力を別のスクリプトにパイプします。
./script1 | grep 'expr' | ./script2
ただし、2番目のスクリプトは入力を受け取りません。繰り返しますが、script2
をcat
に、script1
をping
に置き換えても何も出力されません。
ping localhost | grep localhost | cat
grep
をawk
に置き換えても同じことが起こります:
ping localhost|awk '{print $1}'|cat
何が起こっている?
grep
はバッファリングしています(出力がターミナルではないと判断されるためです。厳密に言えば、これはCライブラリの動作です)。
これを無効にするには、unbuffer -p
(-p
は、unbuffer
が標準入力から読み取るために必要です):
ping localhost | unbuffer -p grep localhost | cat
または、grep
に行ごとにバッファするように指示します(これがサポートされている場合):
ping localhost | grep --line-buffered localhost | cat