Почему при двойном использовании grep вывод не выводится? - PullRequest
41 голосов
/ 25 марта 2011

В основном мне интересно, почему это ничего не выводит:

tail --follow=name file.txt | grep something | grep something_else 

Вы можете предположить, что это должно выдать вывод. Я запустил другую строку для подтверждения

cat file.txt | grep something | grep something_else

похоже, что вы не можете передать вывод tail более одного раза !?Кто-нибудь знает, в чем заключается суть сделки, и есть ли решение?

РЕДАКТИРОВАТЬ: Чтобы ответить на вопросы, файл определенно содержит содержимое, которое должно отображаться grep.В качестве доказательства, если grep выполняется следующим образом:

tail --follow=name file.txt | grep something

Вывод отображается правильно, но если вместо этого используется:

tail --follow=name file.txt | grep something | grep something

Вывод не отображается.

Если это вообще полезно, я запускаю Ubuntu 10.04

Ответы [ 5 ]

87 голосов
/ 14 апреля 2011

Вы также можете столкнуться с проблемой буферизации grep внутри трубы.то есть вы не видите вывод из

   tail --follow=name file.txt | grep something > output.txt

, так как grep будет буферизовать свой собственный вывод.

Используйте переключатель --line-buffered для grep, чтобы обойти это:

tail --follow=name file.txt | grep --line-buffered something > output.txt

Это полезно, если вы хотите получить результаты следующего в файл output.txt каккак можно быстрее.

6 голосов
/ 25 марта 2011

Разобрался, что здесь происходит.Оказывается, команда работает, просто вывод занимает много времени, чтобы добраться до консоли (примерно 120 секунд в моем случае).Это связано с тем, что в буфере стандартного выхода записывается не каждая строка, а каждый блок.Поэтому вместо того, чтобы получать каждую строку из файла в момент его написания, я получал бы гигантский блок каждые 2 минуты или около того.

Следует отметить, что это работает правильно:

tail file.txt | grep something | grep something

Это следующий файл с --follow=name, что проблематично.

В своих целях я нашел способ обойти это, и я собирался записать вывод первого файла grep в файл, поэтому команда будет выглядеть так:

tail --follow=name file.txt | grep something > output.txt

AЧтобы обойти это, используйте команду script следующим образом:

script -c 'tail --follow=name file.txt | grep something' output.txt

Скрипт захватывает выходные данные команды и записывает их в файл, таким образом избегая второй канал.

Это имеетэффективно обошел эту проблему для меня, и я объяснил, почему команда не работала так, как я ожидал, проблема решена.

К вашему сведению, эти другие вопросы, связанные со стековым потоком, связаны:
Обман приложениячтобы думать, что его стандартный ввод является интерактивным, а не конвейером
Принудительно небуферизовать стандартный вывод другой программы с помощью Python

0 голосов
/ 23 мая 2013

имя шаблона grep |шаблон grep |шаблон grep |grep pattern ......

0 голосов
/ 25 марта 2011

у меня работает на Mac без --follow=name

bash-3.2$ tail delme.txt | grep po
position.bin
position.lrn
bash-3.2$ tail delme.txt | grep po | grep lr
position.lrn
0 голосов
/ 25 марта 2011

Вы знаете, что tail начинается по умолчанию с последних десяти строк файла? Я думаю, все, что найденная версия cat ушло в прошлое. Попробуйте tail -n+1 --follow=name file.txt начать с начала файла.

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