Сбой вывода grep

1422
viraptor

Я пытаюсь получить вывод ngrep. К сожалению, когда я добавляю еще один grep в конвейер, я вообще ничего не получаю. Это может быть и другая команда - cat / grep / tee - все разрывает цепочку. Пример:

# this works: $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' -- U +1.469535 xxx:5060 -> xxx:5060 SIP/2.0 180 Ringing. -- U +0.001384 xxx:5060 -> xxx:2048 SIP/2.0 180 Ringing. 

но

#these don't: $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | egrep '^U' $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | cat $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | tee test 

Если я использую cat somefileвместо ngrep при запуске, все работает как положено. Есть идеи, что может пойти не так?

0
Что произойдет, если вы опустите параметр -l в ngrep? jdigital 14 лет назад 0
То же самое - нет выхода после второй трубы. viraptor 14 лет назад 0

2 ответа на вопрос

2
janmoesen

Есть ли у вас egrep псевдоним для всего, что может изменить текст, как grep --colorможет сделать?$ type egrep

Также проверьте вывод на наличие «скрытых» управляющих символов, используя od -bc(как упоминалось выше) или hd -C.

0
jch

РЕДАКТИРОВАТЬ: Я просто столкнулся с этим с 'egrep' - делал:

tail -f somefile|egrep 'somepattern'

Который обеспечил бы удовлетворяющий вывод каждые две секунды; но следующее ничего не дало :

tail -f somefile|egrep 'somepattern'|tr -d '%'

После некоторого поиска в справочной странице я нашел опцию --line-buffered, которая снова выдала вывод!

Затем я нашел это описание буферизации в конвейерах - похоже, все сводится к тому, что некоторые утилиты командной строки (например, tail -f) обычно вызывают fflush на stdout, а другие (cut, grep и т. Д.) Этого не делают.

Мой неправильный первый ответ ниже


Обычно, когда я сталкиваюсь с этими типами проблем, одна или несколько программ в конвейере помещают выходные данные в несколько файловых дескрипторов - чаще всего STDERR.

Вы можете попробовать добавить '2> & 1' перед первым '|' в конвейере, чтобы перенаправить STDERR в STDOUT.

Первый grep уже обрабатывает вывод ngrep, поэтому все идет по пути stdout. viraptor 14 лет назад 0
хорошо - возможно, что некоторые непечатаемые символы поступают в выходной поток, что вы получаете, когда делаете: $ ngrep -l -q -T -Wbyline -d любой udp и порт 5060 | egrep -B1 '^ SIP / 2.0 180' | голова -4 | od -bc jch 14 лет назад 0

Похожие вопросы