パイプラインの「ping」出力の各行をただちに処理します。

パイプラインの「ping」出力の各行をただちに処理します。

私はそれからタイミング情報を抽出するさまざまな方法のいくつかの例を持っていますping -c 10 google.com。これらのパイプの一部では、ping出力と同様に、時々出力ラインが生成されます。他の出力ラインでは、すべての出力ラインが処理された直後にすべての出力ラインが放出されます。最初の行動を見る時期と2番目の行動を見る時期を決める良いルールがありますか?

# 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 'time\S*' | 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=//' 

ツアーの後、これはラインバッファリングの問題に過ぎず、一部の標準ユーティリティは対話式で使用されている場合と非対話式で使用されている場合は異なる動作をするようです。

ベストアンサー1

これらのプログラムでバッファリングを処理する方法についてです。

grepにパイプされたデータをすぐに出力させるには、--line-bufferedオプションと一緒にそれを使用します。

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

awkがパイプデータをすぐに出力できるようにするには、-W Interactiveオプションを使用します。

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

詳細については、そのアプリケーションのマニュアルページを読んでください。

おすすめ記事