Я пытаюсь получить вывод 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 при запуске, все работает как положено. Есть идеи, что может пойти не так?

2 ответа2

2

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

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

0

РЕДАКТИРОВАТЬ: Я просто столкнулся с этим с '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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .