GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verarbeiten Sie jede Ausgabezeile von „ping“ sofort in der Pipeline?

Ich habe einige Beispiele für verschiedene Möglichkeiten, Zeitinformationen aus ping -c 10 google.com zu extrahieren . Für einige dieser Pipelines wird von Zeit zu Zeit eine Ausgabezeile erzeugt, genau wie die Ausgabe von ping. Bei anderen werden die Ausgabezeilen alle auf einmal ausgegeben, nachdem alle verarbeitet wurden. Gibt es eine gute Regel dafür, wann ich das erste Verhalten und wann das zweite sehe?

# prints output for each line as soon as it is received
# on OS X and Linux.
ping -c 10 google.com | grep -o 'time=S*'

# prints output for each line as soon as it is received on OS X
# but not on Linux 
# (the output of ping is slightly different so it's $8 on Linux to get the time)
ping -c 10 google.com | awk '{ print $7 }'

# waits until all input is received on OS X and Linux
ping -c 10 google.com | awk -F ':' '{ print $2 }'

# prints output for line as soon as it is received on Linux and OS X
ping -c 10 google.com | sed -e 's/^.*time=(.*) .*$/1/'

# waits for the end of input on OS X and Linux
ping -c 10 google.com | grep -o 'timeS*' | sed -e 's/time=//'

# as a quick check, this prints each line of output immediately 
# on OS X and Linux
ping -c 10 google.com | sed -e 's/time=//' 

Nachdem ich mich ein wenig umgesehen habe, scheint dies nur ein Problem der Zeilenpufferung zu sein, und einige der Standard-Dienstprogramme verhalten sich anders, wenn sie interaktiv oder nicht interaktiv verwendet werden.

Akzeptierte Antwort:

Es geht darum, wie das Puffern mit diesen Programmen gehandhabt wird.

Wenn Sie möchten, dass grep Daten sofort per Pipe ausgibt, verwenden Sie es mit der Option –line-buffered.

ping -c 10 google.com | grep --line-buffered -o 'timeS*' | sed -e 's/time=//'

Wenn Sie möchten, dass awk direkt Piped-Daten ausgibt, können Sie die Option -W interactive.

verwenden
ping -c 10 google.com | awk -W interactive '{ print $7 }'

Sie sollten die Manpages für diese Apps lesen, um mehr zu erfahren.


Linux
  1. Redundanz aus Ausgabespalten entfernen?

  2. Iteration über jede Zeile der Ausgabe von ls -l

  3. Wie kann ich in einer Linux-Shell jede Zeile einer mehrzeiligen Zeichenfolge verarbeiten?

  4. Auslassen der ersten Zeile in jeder Linux-Befehlsausgabe

  5. Wie zähle ich die Anzahl der Tabulatoren in jeder Zeile mit Shell-Skript?

Wie kann ich von der Befehlszeile aus feststellen, auf welcher Version von Os X ich mich befinde?

Daemontools Multilog verliert Informationen zur Protokollzeilenzeit. Wie man es repariert?

Umleiten einer Ausgabe einer Subshell zu einem Prozess?

Ausgabe von Sensoren einfärben?

Holen Sie sich die ersten 5 Zeichen aus jeder Zeile im Shell-Skript

Befehlszeile:Substring aus der Ausgabe extrahieren