2009-06-09 3 views
26

Ich verwende 'tail -f', um einer Protokolldatei zu folgen, während sie aktualisiert wird; Als nächstes pipere ich die Ausgabe von diesem an grep, um nur die Zeilen anzuzeigen, die einen Suchbegriff enthalten ("org.springframework" in diesem Fall); schließlich würde Ich mag ist, um die Ausgabe von grep kochend auf einen dritten Befehl, ‚schneiden‘:Wie leiten Sie die Eingabe über grep an ein anderes Dienstprogramm weiter?

tail -f logfile | grep org.springframework | cut -c 25- 

Der Schnitt Befehl, um die ersten 25 Zeichen jeder Zeile für mich entfernen würde, wenn sie die Eingabe bekommen könnte von Grep! (Es funktioniert wie erwartet, wenn ich 'grep' aus der Kette eliminiere.)

Ich benutze cygwin mit bash.

Tatsächliche Ergebnisse: Wenn ich die zweite Pipe hinzufügen, um mit dem Befehl 'cut' zu verbinden, ist das Ergebnis, dass es hängt, als ob es auf Eingabe wartet (falls Sie sich wundern).

+0

Wenn ich nach grep stoppen (ohne das Rohr zu ‚schneiden‘) funktioniert es (ohne die ersten 24 oder 25 Zeichen zu entfernen). – les2

+0

Das eigentliche Problem hier ist, dass 'tail -f' niemals endet, also wartet der Rest der Pipeline auf mehr Eingabe – Hasturkun

Antwort

10

Auf meinem System wurde etwa 8K gepuffert, bevor ich irgendeine Ausgabe bekam. Diese Sequenz gearbeitet, um die Datei zu folgen sofort:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

ist gerade zurück zu diesem und dieser arbeitete – les2

-1

Was Sie haben, sollte gut funktionieren - das ist die ganze Idee von Pipelines. Das einzige Problem, das ich sehe, ist, dass ich in der Version von (GNU coreutiles 6.10) die Syntax cut -c 25- (d. H. Ein Minuszeichen anstelle eines Pluszeichens verwenden) verwenden, um die ersten 24 Zeichen zu entfernen.

Sie suchen auch nach anderen Mustern in Ihren beiden Beispielen, falls relevant.

+0

oops! Ich benutze das 'Minus' Zeichen - das war ein Tippfehler in meinem Post hier – les2

29

Unter der Annahme, GNU grep, fügt --line-buffered auf der Kommandozeile, zB.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Edit:

ich grep Pufferung sehen, ist nicht das einzige Problem hier ist, als Schnitt nicht linewise Pufferung erlaubt.

möchten Sie vielleicht versuchen, es mit etwas ersetzen Sie steuern können, wie sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

oder awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

--line-buffered hat nicht für mich funktioniert - das puffert die * Ausgabe * von Grep. Wenn du tail -f logfile | cut -c 25- tust, sitzt es immer noch dort. Die Pufferung erfolgt am Ausgang des Tails. –

+0

Überarbeitet, scheint, als ob Sie von stdout buffering im Schnitt gebissen werden, sollten diese für Sie arbeiten – Hasturkun

+0

Vielen Dank! Das ist sehr nützlich, wenn mehrere Greps aneinandergereiht werden. z.B. etwasohne Ausgabe | grep --line-gepuffertes Filtermuster | grep --color highlightpattern – Superole

Verwandte Themen