Grepping grep output falha

0

Estou tentando aproveitar a saída do ngrep. Infelizmente quando adiciono outro grep ao pipeline, não recebo nenhuma saída. Pode ser algum outro comando também - cat / grep / tee - tudo quebra a cadeia. Exemplo:

# 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.

mas

#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

Se eu usar cat somefile em vez de ngrep no começo, tudo funcionará como esperado. Alguma idéia do que poderia dar errado aqui?

    
por viraptor 05.02.2010 / 18:46

2 respostas

2

Você tem egrep aliased para qualquer coisa que possa modificar o texto, como grep --color poderia fazer? $ type egrep

Verifique também a saída de caracteres de controle "ocultos" usando od -bc (como o jch mencionou) ou hd -C .

    
por 11.03.2010 / 13:29
0

EDIT: Eu acabei de me deparar com isso com 'egrep' - estava fazendo:

tail -f somefile|egrep 'somepattern'

O que forneceria resultados gratificantes a cada dois segundos; mas o seguinte produziu nada :

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

Após algumas pesquisas na página man, encontrei a opção '--line-buffered' que produziu a saída novamente!

Então eu encontrei esta descrição do buffer em pipelines - parece que o que se resume é que algum comando utilitários de linha (por exemplo: tail -f) rotineiramente chamam fflush em stdout e outros (cut, grep, etc) não.

Minha primeira resposta errada está abaixo

Normalmente, quando me deparo com esses tipos de problemas, um ou mais dos programas no pipeline estão colocando a saída em vários descritores de arquivos - na maioria das vezes STDERR.

Você pode tentar adicionar "2 > & 1" antes de seu primeiro "|" no pipeline para redirecionar STDERR para STDOUT.

    
por 05.02.2010 / 20:09

Tags