Ich versuche, einen Live-Text-Stream abzurufen netcat
, aber das funktioniert bei mir nicht:
netcat localhost 9090 | grep sender
gibt nichts zurück, aber ich bin sicher, dass es sollte.
Wenn ich die netcat
Ausgabe in eine Datei umleitung und einige Verzögerungen hinzufüge (reale Umgebung simulieren), funktioniert es:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
Ich habe auch versucht hinzuzufügen, --line-buffered
aber ohne Erfolg.
Was ich falsch mache?
Bearbeiten:
Ich habe das gleiche Problem mit bemerkt sed
, die Ausgabe ist leer.
Aber zum Beispiel hexdump
wandelt Text in Hex - Live:
$ 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
(von hier genommen )netcat -z localhost 9090 | grep sender
grep
wartet es wahrscheinlich endlos auf eine neue Zeile.cat
funktioniert dagrep
wird zumindest eine EOF bekommen, wenn nicht eine Newline. Vielleicht versuchenawk
mit{
als RS?Antworten:
Sie können den
read
Befehl (bash
integriert) verwenden, um das Lesen von Zeichen nacheinander zu erzwingen:Dieses Skript sollte jede vollständige Ausgabe mit balancing
{
und drucken}
, aber Sie können das Skript ändern, um zu tun, was Sie wollen. Dieses Skript würde auf einem Benchmark im Vergleich zu so ziemlich allem NICHT gut abschneiden, aber es ist ziemlich einfach und scheint für mich zu funktionieren ...Beachten Sie, dass Ihre Testprobe nicht perfekt miteinander harmonieren
{
und}
, also , wenn dies der Fall der realen eingegeben wird, möchten Sie vielleicht die Kriterien ändern , um die Zeile zu drucken.quelle
Die Antwort ist hier: grep stimmt nicht mit der nc-Ausgabe überein
netcat gibt ausführliche Protokolle als Standardfehler aus, daher müssen wir Fehler erfassen, bevor wir zu grep weiterleiten.
quelle
2>&1
ausführte. Es sieht so aus, als hätte grep überhaupt nicht funktioniert.Ich denke, das Problem ist das Fehlen von Zeilenumbrüchen in der
netcat
Ausgabe. Ich kann zwei Problemumgehungen sehen:Fügen Sie alle
x
Sekunden eine neue Zeile ein (mit unglücklichen Folgen, wenn die neue Zeile in der Mitte eingefügt wirdsource
):Verwendung
awk
mit einem anderen RS als Newline:quelle
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
,"sender":"xbmc"}
Hinzufügen
--line-buffered
, um die Zeilenpufferung bei der Ausgabe zu verwenden:quelle
verwenden
watch
Befehl ein :quelle
Versuchen Sie gemäß @ user43791-Kommentar , die Pufferung in der Pipe zu deaktivieren , z.
quelle
In Bash können Sie Pseudogerätedateien verwenden , um eine TCP-Verbindung zu öffnen und wie gewohnt zu überprüfen. Beispielsweise:
Führen Sie zum Testen einfach einen Server aus, der eine Datei senden kann, z.
Führen Sie dann in einem anderen Terminal den Test zum
grep
Ausgang aus:quelle