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
Другие вопросы по тегам