Почему при использовании 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
Ответы
Ответ 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......