Перенаправить выход хвоста в файл, а затем остановить, когда найдено совпадение

Этот файл журнала содержит данные, которые поступают непрерывно. То, что я хотел произойти, – это tail -f этот файл журнала, а затем перенаправить его в файл с условиями ff

пример содержимого файлов журналов

aaaaaaaaaaaaaaa bbbbbbbbbbbbbbb ccccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh iiiiiiiiiiiiiii 

в хвостохранилище, я хочу, чтобы перенаправление начало, когда оно обнаружило первый шаблон, затем остановило перенаправление, а также хвост, когда я нашел второй шаблон. например

Я хочу, чтобы перенаправление начиналось, когда он обнаружил шаблон «ddddddddddddddd», а затем остановится, когда он найдет «hhhhhhhhhhhhhhh», содержимое файла, созданного из перенаправления, должно быть

 ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh 

В кодировании я думаю о чем-то подобном. Но я не знаю, как остановить перенаправление, когда он нашел второй шаблон.

 tail -f logfile > log.tmp while grep "ddddddddddddddd" log.tmp do cat log.tmp > logfile done 

Это именно то, что делает retail . retail – это хвост с регулярными выражениями, инструмент, который я написал для конкретного случая использования у вас здесь. В вашем случае вы будете использовать:

 retail -f -r ddddddddddddddd -u hhhhhhhhhhhhhhh logfile > log.tmp 

-f – стандартный вариант tail -f . -r принимает регулярное выражение, чтобы использовать диапазон строк для включения, а -u принимает регулярное выражение для продолжения до. Он начинается с последнего появления шаблона -r и завершается после печати первого появления -u шаблона после этого.

Если вы хотите начать с первого экземпляра шаблона, вы можете использовать -b в комбинации с -r . Оба регулярных выражения являются ERE , без какого-либо неявного закрепления, но вы можете использовать ^ и $ для привязки соответствия, как обычно.


Вы можете получить и построить retail с помощью:

 git clone https://github.com/mwh/retail.git cd retail ./configure make make install 

По умолчанию он устанавливается в ~/.local/bin , но вы можете изменить это или просто скопировать исполняемый файл, если хотите.


retail цена полностью совместима с POSIX , хотя я не рекомендую использовать ее в качестве tail системы.

Если я понимаю, что ваши требования исправлены, это делает то, что вы ожидаете:

 awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' infile | tail -f 

awk работает как фильтр в файле «infile»; он печатает все, что находится между указанными шаблонами, в файл «выдержка», а также выводит каждую строку на стандартный вывод, который затем обрабатывается tail -f как обычно.

Если вы хотите использовать его с потоковыми данными:

 some_process | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' | tail -f 

(Примечание. Поскольку tail -f – это интерактивная программа, она должна, по возможности, всегда оставаться в конвейере.)

Возможно, вы можете использовать шаблоны диапазона awk здесь:

 tail -f logfile | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/' 

Если вам нужно обойти проблему SIGPIPE вы можете использовать socat вместо tail для задания:

 socat -u file:logfile,ignoreeof "system:'stdbuf -o0 awk /ddddddddddddddd/,/hhhhhhhhhhhhhhh/'" > logfile.new