2009-09-03 45 views
1

我通常在Linux/Unix上建立長長的多命令管道來處理大型文本文件(sed | grep | sort | less等)。在Linux上緩衝過濾管道

我希望能夠使用管道元素來緩衝通過stdin接收的所有內容,直到檢測到關鍵短語/字符串(例如「SUCCESS」),此時它將所有接收到該點的內容釋放到標準輸出然後繼續傳遞其餘的流。如果沒有檢測到關鍵短語,程序將丟棄所有內容。

有沒有一個標準的命令可以做到這一點,還是我需要編寫一個Perl腳本?

在此先感謝您的任何想法!

Wodow,管道的情人

+4

我對「管道愛好者」的恭維... – 2009-09-03 11:45:16

回答

1

也許最簡單的解決方案是使用sed

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

這可以在逐行的基礎上完美工作(直接通過命令行進行測試)。 – wodow 2009-09-07 11:02:54

+0

感謝您的支持! – wodow 2009-09-07 11:03:28

2

你可以使用一個簡單的awk /呆子1個襯墊做到這一點:

編輯:更新,以修復dmckee在他的評論

指出的(固定)的bug

gawk'{sum = sum'\ n「$ 0}; /成功/ {打印總和}」

+0

可愛。 – dmckee 2009-09-03 14:04:53

+0

這不會通過「成功」後面的行。 – mark4o 2009-09-03 18:36:38

+0

它可以很容易地被修改來做到這一點。 – Omnifarious 2009-09-03 23:06:37

0

做它的快速和骯髒的方式是這樣的:

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

但是,如果你經常這樣做,它應該有一個自己的腳本。