Tengo algunos ejemplos de diferentes formas de extraer información de tiempo de ping -c 10 google.com
. Para algunas de estas canalizaciones, se produce una línea de salida de vez en cuando, al igual que la salida de ping. Para otros, las líneas de salida se emiten todas a la vez después de que se hayan procesado todas. ¿Existe una buena regla sobre cuándo veré el primer comportamiento y cuándo veré el segundo?
# 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=//'
Después de mirar un poco, esto parece ser solo un problema de almacenamiento en búfer de línea y algunas de las utilidades estándar se comportan de manera diferente cuando se usan de forma interactiva y no interactiva.
Respuesta aceptada:
Se trata de cómo se maneja el almacenamiento en búfer con esos programas.
Si desea que grep genere datos canalizados inmediatamente, utilícelo con la opción –line-buffered.
ping -c 10 google.com | grep --line-buffered -o 'timeS*' | sed -e 's/time=//'
Si desea que awk genere datos canalizados de inmediato, puede usar la opción -W interactivo.
ping -c 10 google.com | awk -W interactive '{ print $7 }'
Debe leer las páginas man de esas aplicaciones para obtener más información.