Estoy tratando de obtener una secuencia de texto en vivo netcat
, pero no funciona para mí:
netcat localhost 9090 | grep sender
no devuelve nada, pero estoy seguro de que debería.
Si redirijo la netcat
salida a un archivo y agrego algunos retrasos (simular el entorno real), entonces funciona:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
También intenté agregar --line-buffered
pero sin éxito.
¿Qué hice mal?
Editar:
Noté el mismo problema con sed
, la salida está vacía.
Pero, por ejemplo, hexdump
convierte el texto en hexadecimal en vivo:
$ 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
(tomado de aquí )netcat -z localhost 9090 | grep sender
grep
lo que probablemente esté esperando sin cesar una nueva línea.cat
funciona yagrep
que obtendrá un EOF si no una nueva línea, al menos. ¿Quizás probarawk
con{
RS?Respuestas:
Puede usar el
read
comando (bash
incorporado) para forzar la lectura de los caracteres uno por uno:Este script debe imprimir cada salida completa con balanceo
{
y}
, pero puede cambiar el script para hacer lo que quiera. Este script NO funcionaría bien en un punto de referencia en comparación con casi cualquier cosa, pero es bastante simple y parece funcionar para mí ...Tenga en cuenta que su muestra de prueba no tenía coincidencia
{
y}
, por lo tanto, si este es el caso de la entrada real, es posible que desee cambiar los criterios para imprimir la línea.fuente
La respuesta está aquí: grep no coincide en la salida nc
netcat genera registros detallados de error estándar, por lo que debemos capturar los errores antes de canalizar a grep.
fuente
2>&1
, parece que grep no funcionó en absoluto.Creo que el problema es la ausencia de nuevas líneas en el
netcat
resultado. Puedo ver dos soluciones:Inserte una nueva línea cada
x
segundo (con consecuencias desafortunadas si la nueva línea se inserta en el medio desource
):Usar
awk
con un RS que no sea nueva línea:fuente
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
La salida estuvo bien:,"sender":"xbmc"}
Agregar
--line-buffered
para usar el buffering de línea en la salida:fuente
watch
comando de uso :fuente
Según el comentario de @ user43791 , intente deshabilitar el almacenamiento en búfer en la tubería , por ejemplo:
fuente
En Bash puede usar archivos de pseudodispositivos para abrir una conexión TCP y grep como de costumbre. Por ejemplo:
Para probarlo, simplemente ejecute el servidor que puede enviar algún archivo, como:
Luego, en otro terminal, ejecute la prueba a
grep
la salida:fuente