bash, цепочка команд grep, обработка по мере поступления данных
Когда я использую одну команду grep, она обрабатывает и выводит данные в режиме реального времени.
Вот мой простой тестовый файл test.sh
:
echo a
sleep 1
echo b
sleep 1
echo ab
sleep 1
echo ba
sleep 1
echo baba
Я делаю следующее:
sh test.sh | grep a
a
ab
ba
ab
ba
все хорошо, так фа. "a" появляется сразу, затем "ab" и т. д.
Но когда я передаю несколько команд grep, вот так
sh ./test.sh | grep a | grep b
ab
ba
baba
Я получаю вывод только в конце, а не так, как он приходит! терминал остается пустым до тех пор, пока весь файл не будет обработан, а затем выводит все за один раз.
Это почему?
Как я могу связать / объединить несколько greps без потери свойства "обрабатывать и выводить по мере поступления"?
Это для поиска и обработки живых огромных журналов с большим количеством данных, где у меня есть только шанс сохранить на диск отфильтрованную версию, а не огромный необработанный вывод, который бы достаточно быстро заполнил диск.
1 ответ
Там есть опция под названием line-buffered
:
Other Options
--line-buffered
Use line buffering on output. This can cause a performance penalty.
Так:
sh ./test.sh | grep --line-buffered a | grep b