2016-04-24 6 views
0

が突然、これは(ない出力と、SHzshのbashので試行)が失敗した:二度のgrepも失敗したこと尾の出力をパイプで何度もフィルタリングできないのはなぜですか?

echo "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | sed 's#pl#st#g'

注意、それはかなりだことを示しますどのコマンドを使用するかは関係ありません。

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | grep played 

グレップのみの作品は:、journalctl --follow

# echo -e "foo\nplayed\nbar" > /tmp/t && cat /tmp/t | grep played | sed 's#pl#st#g' 
stayed 

:それは動作しますが、

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | sed 's#pl#st#g'` 
foo 
stayed 
bar 

代わり尾の付:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played 
played 

一人で作品をセッドそれ tailのように失敗します。

なぜ2回パイプすることができないのですか?

答えて

1

これはバッファリングの問題です。最初のgrepは、別のコマンドにパイプしているときに出力しますが、stdoutに出力している場合は出力しません。詳細については、http://mywiki.wooledge.org/BashFAQ/009を参照してください。

+0

ありがとう、エド。この記事では、不要なコマンドが排除されるかどうか最初に確認することを提案しています。私の特別なケースでは、 '--silent'と明示的に置換された行(' p')を追加することができました。たとえば、sed - silentの#pl#st#p "を指定します。 (そうでなければ、言及されていない*バッファされていない*変形が行く方法でした) – user569825

+0

私は '--silent'について聞いたことがなく、より一般的な' -n'と同じことをするようです。これは、 '再生された'考え以外の文脈で 'pl'を含む行を出力します。シンタックスをチェックしてsedを使って '/ played/{s/pl/st/gp}'のようなことをすることができます。 awkでは 'awk '/ played/{gsub(/ pl /、" st "); print}' 'となります。 –

+0

幸いにも私の使用例は、私が与えた例より複雑です。したがって、置換を受け取るすべての行は実際には出力に必要です。それでも、将来のケースでは、sedの正しい構文が不思議に思うでしょう。 (Btw '--silent' *は*' -n'です。スクリプト化と文書化の際に、複雑なスイッチを使用する方が好きです。) – user569825

関連する問題