Estou tentando grep ao vivo netcat
, mas não funciona para mim:
netcat localhost 9090 | grep sender
não retorna nada, mas tenho certeza de que deveria.
Se eu redirecionar a netcat
saída para um arquivo e adicionar alguns atrasos (simular o ambiente real) - funcionará:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
Eu também tentei adicionar, --line-buffered
mas sem sucesso.
O que eu faço de errado?
Editar:
Percebi o mesmo problema com sed
, a saída está vazia.
Mas, por exemplo, hexdump
converte texto em hexadecimal:
$ netcat localhost 9090 | hexdump -C
00000000 7b 22 6a 73 6f 6e 72 70 63 22 3a 22 32 2e 30 22 |{"jsonrpc":"2.0"|
00000010 2c 22 6d 65 74 68 6f 64 22 3a 22 50 6c 61 79 65 |,"method":"Playe|
00000020 72 2e 4f 6e 50 6c 61 79 22 2c 22 70 61 72 61 6d |r.OnPlay","param|
00000030 73 22 3a 7b 22 64 61 74 61 22 3a 7b 22 69 74 65 |s":{"data":{"ite|
00000040 6d 22 3a 7b 22 69 64 22 3a 36 2c 22 74 79 70 65 |m":{"id":6,"type|
00000050 22 3a 22 6d 6f 76 69 65 22 7d 2c 22 70 6c 61 79 |":"movie"},"play|
00000060 65 72 22 3a 7b 22 70 6c 61 79 65 72 69 64 22 3a |er":{"playerid":|
00000070 31 2c 22 73 70 65 65 64 22 3a 31 7d 7d 2c 22 73 |1,"speed":1}},"s|
stdbuf -o0 netcat localhost 9090 | grep sender
(extraído daqui )netcat -z localhost 9090 | grep sender
grep
provavelmente está esperando infinitamente por uma nova linha.cat
funciona, poisgrep
receberá um EOF, se não uma nova linha, pelo menos. Talvez tenteawk
com{
como RS?Respostas:
Você pode usar o
read
comando (bash
interno) para forçar os caracteres a serem lidos um por um:Esse script deve imprimir todas as saídas completas com balancing
{
e}
, mas você pode alterar o script para fazer o que quiser. Esse script NÃO funcionaria bem em uma referência comparada a praticamente qualquer coisa, mas é bem simples e parece funcionar para mim ...Observe que sua amostra de teste não possui correspondência
{
e}
, portanto, se este for o caso da entrada real, convém alterar os critérios para imprimir a linha.fonte
A resposta está aqui: grep não corresponde na saída nc
O netcat gera logs detalhados para erro padrão, portanto, precisamos capturar erros antes de enviar para grep.
fonte
2>&1
, parece que o grep não funcionou.Eu acho que a questão é a ausência de novas linhas na
netcat
saída. Eu posso ver duas soluções alternativas:Insira uma nova linha a cada
x
segundo (com conseqüências infelizes se a nova linha for inserida no meio desource
):Use
awk
com um RS diferente da nova linha:fonte
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
A saída foi boa:,"sender":"xbmc"}
Adicione
--line-buffered
para usar o buffer de linha na saída:fonte
use o
watch
comando:fonte
De acordo com o comentário do @ user43791 , tente desativar o buffer no pipe , por exemplo:
fonte
No Bash, você pode usar arquivos de pseudo-dispositivo para abrir uma conexão TCP e cumpri-la normalmente. Por exemplo:
Para testá-lo, basta executar o servidor que pode enviar algum arquivo, como:
Em outro terminal, execute o teste
grep
na saída:fonte