GNU/Linux >> Linux Esercitazione >  >> Linux

Elaborare ogni riga di output da `ping` immediatamente in pipeline?

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ù.


Linux
  1. Qual è il significato di ciascuna riga dell'output dell'assieme di un ciao mondo?

  2. Esecuzione di script PHP dalla riga di comando come processo in background

  3. ottenere i primi 5 caratteri da ogni riga nello script di shell

  4. Come ottenere il PID padre di un determinato processo in GNU/Linux dalla riga di comando?

  5. Riga di comando:estrai la sottostringa dall'output

Come dire a quale versione di Os X mi trovo dalla riga di comando?

Daemontools Multilog perde le informazioni sull'ora della riga di registro. Come sistemarlo?

Colora l'output dei sensori?

Omissione della prima riga da qualsiasi output di comando Linux

Come contare il numero di schede in ogni riga usando lo script di shell?

Un comando per emettere ogni riga in avanti e poi all'indietro