Подтвердить что ты не робот

Почему при использовании grep не выводится два раза?

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

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

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

cat file.txt | grep something | grep something_else

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

EDIT: Чтобы ответить на вопросы до сих пор, файл определенно имеет содержимое, которое должно отображаться grep. В качестве доказательства, если grep выполняется следующим образом:

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

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

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

Нет вывода.

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

4b9b3361

Ответ 1

Возможно, вы столкнулись с проблемой буферизации 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.

Ответ 2

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

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

tail file.txt | grep something | grep something

Это проблема с файлом --follow=name, который является проблематичным.

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

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

Для этого нужно использовать команду script следующим образом:

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

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

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

FYI, Эти другие вопросы, связанные с stackoverflow, связаны:
Обмануть приложение, считая его stdin интерактивным, а не трубкой
Принудительный стандартный вывод программы, который небуферируется с использованием Python

Ответ 3

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

Ответ 4

работает для меня на 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

Ответ 5

grep pattern filename | шаблон grep | шаблон grep | grep pattern......