2009-09-03 3 views
1

Я обычно создаю длинные многопроцессорные каналы в Linux/Unix для обработки больших текстовых файлов (sed | grep | sort | less и т. Д.).Буферизационная фильтровальная трубка на Linux

Я хотел бы иметь возможность использовать элемент конвейера, который будет буферизовать все, полученное через stdin, до тех пор, пока не будет обнаружена ключевая фраза/строка (например, «УСПЕХ»), и в этот момент он освобождает все полученные до этой точки значения stdout и затем продолжает пропускать остальную часть потока. Если ключевая фраза не обнаружена, программа отбросит все содержимое.

Есть ли стандартная команда, которая может это сделать, или мне нужно написать Perl-скрипт?

Заранее благодарим за любые идеи здесь!

Wodow, любитель труб

+4

Похвалы за «любовник труб» ... –

ответ

1

Вероятно, самым простым решением является использование sed:

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

Это отлично работает по принципу «поочередно» (тестирование непосредственно из командной строки). – wodow

+0

Спасибо за это! – wodow

2

Вы можете использовать простой AWK/поглазеть 1 вкладыш, чтобы сделать это:

EDIT: обновление, чтобы исправить ошибку, которая dmckee указал, (и фиксированной) в своем комментарии

gawk '{sum = sum "\ n" $ 0};/Успех/{печать сумма}»

+0

Cute. – dmckee

+0

Это не пройдет через строки, следующие за «успехом». – mark4o

+0

Его можно легко изменить, чтобы сделать это. – Omnifarious

0

быстрый и грязный способ сделать это выглядит следующим образом:

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

Но если вы делайте это часто, он заслуживает собственного сценария.