J'essaie de récupérer le flux de texte en direct à partir de netcat
, mais cela ne fonctionne pas pour moi:
netcat localhost 9090 | grep sender
ne renvoie rien, mais je suis sûr que cela devrait.
Si je redirige la netcat
sortie vers un fichier et ajoute quelques retards (simuler l'environnement réel) - alors cela fonctionne:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
J'ai également essayé d'ajouter --line-buffered
mais sans succès.
Ce que je fais mal?
Éditer:
J'ai remarqué le même problème avec sed
, la sortie est vide.
Mais, par exemple, hexdump
convertit le texte en hexadécimal en direct:
$ 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
(extrait d' ici )netcat -z localhost 9090 | grep sender
grep
attend probablement sans fin une nouvelle ligne.cat
fonctionne depuisgrep
obtiendra un EOF sinon une nouvelle ligne, au moins. Peut-être essayerawk
avec{
RS?Réponses:
Vous pouvez utiliser la
read
commande (bash
intégrée) pour forcer la lecture des caractères un par un:Ce script doit imprimer chaque sortie complète avec équilibrage
{
et}
, mais vous pouvez modifier le script pour faire ce que vous voulez. Ce script ne ferait PAS bien sur un benchmark par rapport à à peu près n'importe quoi, mais il est assez simple et semble fonctionner pour moi ...Notez que votre échantillon de test n'a pas de correspondance
{
et}
, donc si c'est le cas de l'entrée réelle, vous souhaiterez peut-être modifier les critères pour imprimer la ligne.la source
La réponse est ici: grep ne correspond pas à la sortie nc
netcat génère des journaux détaillés sur erreur standard, nous devons donc capturer les erreurs avant de diriger vers grep.
la source
2>&1
, il semble que grep ne fonctionne pas du tout.Je pense que le problème est l'absence de nouvelles lignes dans la
netcat
sortie. Je peux voir deux solutions:Insérez une nouvelle ligne toutes les
x
secondes (avec des conséquences malheureuses si la nouvelle ligne est insérée au milieu desource
):Utiliser
awk
avec un RS autre que newline:la source
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
La sortie était correcte:,"sender":"xbmc"}
Ajouter
--line-buffered
pour utiliser la mise en mémoire tampon de ligne sur la sortie:la source
utilisez la
watch
commande:la source
Selon le commentaire @ user43791 , essayez de désactiver la mise en mémoire tampon dans le canal , par exemple:
la source
Dans Bash, vous pouvez utiliser des fichiers de pseudo-périphériques pour ouvrir une connexion TCP et la grep comme d'habitude. Par exemple:
Pour le tester, lancez simplement le serveur qui peut envoyer des fichiers, comme:
Ensuite, dans un autre terminal, exécutez le test sur
grep
la sortie:la source