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.