Wie grep Netcat Ausgabe

13

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 netcatAusgabe 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-bufferedaber ohne Erfolg.

Was ich falsch mache?

Bearbeiten:

Ich habe das gleiche Problem mit bemerkt sed, die Ausgabe ist leer.

Aber zum Beispiel hexdumpwandelt 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|
tomekceszke
quelle
2
Vielleicht wird es in der Pipe gepuffert? Sie könnten versuchen, stdbuf -o0 netcat localhost 9090 | grep sender(von hier genommen )
user43791
Funktioniert es so? netcat -z localhost 9090 | grep sender
Gilles Quenot
@ user43791 die Ausgabe ist noch leer, aber ich bin sicher, dass netcat passende Zeichenfolge zurückgegeben hat
tomekceszke
@sputnick dieser kehrt sofort zur Shell zurück und wartet nicht auf ein Ereignis
tomekceszke
1
Es gibt keine neuen Zeilen im Hexdump, daher grepwartet es wahrscheinlich endlos auf eine neue Zeile. catfunktioniert da grepwird zumindest eine EOF bekommen, wenn nicht eine Newline. Vielleicht versuchen awkmit {als RS?
Muru

Antworten:

4

Sie können den readBefehl ( bashintegriert) verwenden, um das Lesen von Zeichen nacheinander zu erzwingen:

netcat localhost 9090 | (
    cnt=0
    line=
    while read -N 1 c; do
        line="$line$c"
        if [ "$c" = "{" ]; then
            cnt=$((cnt+1))
        elif [ "$c" = "}" ]; then
            cnt=$((cnt-1))
            if [ $cnt -eq 0 ]; then
                printf "%s\n" "$line"
                line=
            fi
        fi
    done
) | grep sender

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.

user43791
quelle
Es sieht so aus, als ob die nicht übereinstimmenden Klammern nur darauf zurückzuführen sind, dass er nur den Anfang der Ausgabe gepostet hat.
Barmar
8

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.

$ netcat -zv localhost 1-9000 2>&1 | grep succeeded
tkdave
quelle
Diese Antwort hat mich nur zur Lösung gebracht. Das war sehr seltsam, als ich diesen Befehl ohne 2>&1ausführte. Es sieht so aus, als hätte grep überhaupt nicht funktioniert.
Marecky
2

Ich denke, das Problem ist das Fehlen von Zeilenumbrüchen in der netcatAusgabe. Ich kann zwei Problemumgehungen sehen:

  1. Fügen Sie alle xSekunden eine neue Zeile ein (mit unglücklichen Folgen, wenn die neue Zeile in der Mitte eingefügt wird source):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. Verwendung awkmit einem anderen RS als Newline:

    netcat ... | awk -v RS='}' -v ORS='}' '/source/'
    
muru
quelle
Noch leere Ausgabe. Um sicherzustellen, dass der Befehl korrekt ist, cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/',"sender":"xbmc"}
führe
Ich habe gerade die erste Problemumgehung überprüft und es funktioniert ! Aber wie Sie bereits erwähnt haben, kann es die Ausgabe aufteilen, sodass es nicht die endgültige Lösung sein kann. Trotzdem vielen Dank!
Tomékceszke
1

Hinzufügen --line-buffered, um die Zeilenpufferung bei der Ausgabe zu verwenden:

netcat localhost 9090 | grep --line-buffered sender 
Cyrus
quelle
Ich habe das schon versucht, es hat nicht funktioniert.
Tomekceszke
1

verwenden watchBefehl ein :

watch 'netcat localhost 9090 | grep sender'
αғsнιη
quelle
Es funktioniert auch nicht. Das gleiche gilt für sed ... Aber zum Beispiel: netcat localhost 9090 | hexdump funktioniert und ersetzt Text zu hex live, warum?
Tomékceszke
0

In Bash können Sie Pseudogerätedateien verwenden , um eine TCP-Verbindung zu öffnen und wie gewohnt zu überprüfen. Beispielsweise:

$ grep "sender" < /dev/tcp/example.com/1234

Führen Sie zum Testen einfach einen Server aus, der eine Datei senden kann, z.

$ nc -vl 1234 < /etc/hosts

Führen Sie dann in einem anderen Terminal den Test zum grepAusgang aus:

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
Kenorb
quelle