Die Grepping-Grep-Ausgabe schlägt fehl

1531
viraptor

Ich versuche die Ausgabe von ngrep zu grep. Wenn ich der Pipeline ein weiteres grep hinzufüge, bekomme ich leider keine Ausgabe. Es kann auch ein anderer Befehl sein - cat / grep / tee - alles bricht die Kette. Beispiel:

# this works: $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' -- U +1.469535 xxx:5060 -> xxx:5060 SIP/2.0 180 Ringing. -- U +0.001384 xxx:5060 -> xxx:2048 SIP/2.0 180 Ringing. 

aber

#these don't: $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | egrep '^U' $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | cat $ ngrep -l -q -T -Wbyline -d any udp and port 5060 | egrep -B1 '^SIP/2.0 180' | tee test 

Wenn ich cat somefileam Anfang ngrep verwende, funktioniert alles wie erwartet. Irgendwelche Ideen, was hier schief gehen könnte?

0
Was passiert, wenn Sie den Parameter -l in ngrep nicht angeben? jdigital vor 14 Jahren 0
Gleich - keine Ausgabe nach der zweiten Leitung. viraptor vor 14 Jahren 0

2 Antworten auf die Frage

2
janmoesen

Haben Sie einen Egrep-Alias ​​für alles, was den Text modifizieren könnte, wie es grep --colorvielleicht der Fall ist ?$ type egrep

Überprüfen Sie auch die Ausgabe auf "ausgeblendete" Steuerzeichen mit od -bc(wie in jch erwähnt) oder hd -C.

0
jch

EDIT: Ich habe mich selbst mit "egrep" getroffen - tat:

tail -f somefile|egrep 'somepattern'

Das würde alle zwei Sekunden ein erfreuliches Ergebnis liefern. aber folgendes erzeugte nichts :

tail -f somefile|egrep 'somepattern'|tr -d '%'

Nach einigem Graben in der Manpage fand ich die Option '--line-buffered', die wieder zu Ausgabe führte!

Dann fand ich diese Beschreibung der Pufferung in Pipelines - es scheint so, als würde es darauf hinauslaufen, dass einige Kommandozeilen-Utils (zB: tail -f) fflush auf stdout routinemäßig aufrufen und andere (cut, grep usw.) nicht.

Meine falsche erste Antwort ist unten


Normalerweise, wenn ich auf diese Arten von Problemen stoße, geben eines oder mehrere der Programme in der Pipeline Ausgaben für mehrere Dateideskriptoren aus - meistens STDERR.

Sie könnten versuchen, '2> & 1' vor dem ersten '|' hinzuzufügen. in der Pipeline, um STDERR zu STDOUT umzuleiten.

Das erste grep verarbeitet bereits die ngrep-Ausgabe, sodass alles durch den Standardpfad geht. viraptor vor 14 Jahren 0
ok - es ist möglich, dass einige nicht druckbare Zeichen in den Ausgabestrom kommen. Was erhalten Sie, wenn Sie Folgendes tun: $ ngrep -l -q -T -Wbyline -d ein beliebiges udp und Port 5060 | egrep -B1 '^ SIP / 2.0 180' | Kopf -4 | od -bc jch vor 14 Jahren 0