2009-09-03 6 views
1

大規模なテキストファイル(sed | grep | sort | lessなど)を処理するために、Linux/Unix上に長いマルチコマンドパイプを構築します。Linuxでのバッファリングフィルタリング

キーフレーズ/文字列が検出されるまで(たとえば "SUCCESS")、stdoutを介して受け取ったすべてのものをバッファリングするパイプライン要素を使用できるようにしたいと思います。残りのストリームを通過させ続けます。キーフレーズが検出されない場合、プログラムはすべての内容を破棄する。

標準的なコマンドがありますか、それともPerlスクリプトを書く必要がありますか?

ここに任意のアイデアをお寄せいただきありがとうございます!

Wodow、パイプ

+4

「パイプの恋人」の私の称賛... –

答えて

1

おそらく最も簡単な解決策はsedを使用することです:

 
    sed '/SUCCESS/,$!{H;d;};$H;x' 
+0

これは、行単位で完全に動作します(コマンドラインから直接テストした場合)。 – wodow

+0

これはありがとう! – wodow

2

の恋人あなたは、単純なawkは/これを行うに1つのライナーgawkは使用することができます彼のコメント

で指摘(固定)dmckeeバグを修正する更新:

EDITを

gawk '{sum = sum "\ n" $ 0}; /成功/ {プリント和}」

+0

かわいい。 – dmckee

+0

これは「成功」に続く行を通過しません。 – mark4o

+0

これは簡単に変更することができます。 – Omnifarious

0

それを行うための迅速かつ汚い方法は、このように書き:

perl -pe'$b.=$_;/SUCCESS/&&last}print$b;while(<>){' 

しかし、あなたならばこれはしばしば、独自のスクリプトが必要です。