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.
verwendenping -c 10 google.com | awk -W interactive '{ print $7 }'
Sie sollten die Manpages für diese Apps lesen, um mehr zu erfahren.