GNU/Linux >> Tutoriels Linux >  >> Linux

Traiter chaque ligne de sortie de `ping` immédiatement dans le pipeline ?

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.


Linux
  1. Supprimer la redondance des colonnes de sortie ?

  2. Itérer sur chaque ligne de la sortie ls -l

  3. Dans un shell Linux, comment puis-je traiter chaque ligne d'une chaîne multiligne ?

  4. Quelle est la signification de chaque ligne de la sortie d'assemblage d'un C hello world ?

  5. Omettre la première ligne de toute sortie de commande Linux

La sortie de Ls a des retours à la ligne mais s'affiche sur une seule ligne. Pourquoi?

Comment savoir sur quelle version d'Os X je suis depuis la ligne de commande ?

Daemontools Multilog perd les informations de temps de ligne de journal. Comment le réparer?

Coloriser la sortie des capteurs ?

Ligne de commande :Extraire la sous-chaîne de la sortie

Clonezilla depuis la ligne de commande