GNU/Linux >> Znalost Linux >  >> Linux

Zpracovat každý řádek výstupu z `ping` okamžitě v potrubí?

Mám několik příkladů různých způsobů, jak extrahovat informace o načasování z ping -c 10 google.com . U některých z těchto kanálů se často vytváří řada výstupu, stejně jako výstup příkazu ping. U ostatních jsou řádky výstupu vysílány všechny najednou poté, co byly všechny zpracovány. Existuje dobré pravidlo, kdy uvidím první chování a kdy druhé?

# 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=//' 

Když se trochu rozhlédnu, zdá se, že jde pouze o problém s ukládáním do vyrovnávací paměti a některé standardní nástroje se chovají jinak, když jsou používány interaktivně a neinteraktivně.

Přijatá odpověď:

Jde o to, jak je u těchto programů řešeno ukládání do vyrovnávací paměti.

Pokud chcete, aby grep okamžitě vydával data z potrubí, použijte jej s volbou –line-buffered.

ping -c 10 google.com | grep --line-buffered -o 'timeS*' | sed -e 's/time=//'

Pokud chcete, aby awk okamžitě vydával data z potrubí, můžete použít volbu -W interaktivní.

ping -c 10 google.com | awk -W interactive '{ print $7 }'

Měli byste si přečíst manuálové stránky těchto aplikací, abyste zjistili více.


Linux
  1. Jaký je význam každého řádku výstupu sestavy C hello world?

  2. Spuštění PHP skriptu z příkazového řádku jako proces na pozadí

  3. získat prvních 5 znaků z každého řádku v shell skriptu

  1. Jak získat rodičovské PID daného procesu v GNU/Linuxu z příkazového řádku?

  2. Příkazový řádek:Extrahujte podřetězec z výstupu

  3. Clonezilla z příkazového řádku

  1. Výstup z Ls má nové řádky, ale zobrazuje se na jednom řádku. Proč?

  2. Jak zjistit, jakou verzi OS X používám z příkazového řádku?

  3. Daemontools Multilog ztratí informace o čase řádku protokolu. Jak to opravit?