Ho alcuni esempi di modi diversi per estrarre informazioni sui tempi da ping -c 10 google.com
. Per alcune di queste pipeline, ogni tanto viene prodotta una linea di output, proprio come l'output di ping. Per altri, le righe di output vengono emesse tutte in una volta dopo che tutte sono state elaborate. C'è una buona regola per quando vedrò il primo comportamento e quando vedrò il secondo?
# 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=//'
Dopo aver guardato un po' in giro, questo sembra essere solo un problema di buffering di linea e alcune delle utilità standard si comportano in modo diverso se utilizzate in modo interattivo e non interattivo.
Risposta accettata:
Riguarda come viene gestito il buffering con quei programmi.
Se vuoi che grep emetta immediatamente i dati in pipe, usalo con l'opzione –line-buffered.
ping -c 10 google.com | grep --line-buffered -o 'timeS*' | sed -e 's/time=//'
Se vuoi che awk emetta immediatamente i dati in pipe, puoi usare l'opzione -W interattiva.
ping -c 10 google.com | awk -W interactive '{ print $7 }'
Dovresti leggere le pagine man per quelle app per saperne di più.