J'ai quelques exemples de différentes façons d'extraire des informations de synchronisation de ping -c 10 google.com
. Pour certains de ces pipelines, une ligne de sortie est produite de temps en temps, tout comme la sortie de ping. Pour d'autres, les lignes de sortie sont émises toutes en même temps après qu'elles aient toutes été traitées. Existe-t-il une bonne règle pour savoir quand je verrai le premier comportement et quand je verrai le second ?
# 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=//'
Après avoir regardé un peu autour de moi, cela semble être juste un problème de mise en mémoire tampon de ligne et certains des utilitaires standard se comportent différemment lorsqu'ils sont utilisés de manière interactive ou non interactive.
Réponse acceptée :
Il s'agit de la façon dont la mise en mémoire tampon est gérée avec ces programmes.
Si vous voulez que grep produise immédiatement des données canalisées, utilisez-le avec l'option –line-buffered.
ping -c 10 google.com | grep --line-buffered -o 'timeS*' | sed -e 's/time=//'
Si vous souhaitez que awk affiche immédiatement les données canalisées, vous pouvez utiliser l'option -W interactive.
ping -c 10 google.com | awk -W interactive '{ print $7 }'
Vous devriez lire les pages de manuel de ces applications pour en savoir plus.