ping コマンドからファイルへのミリ秒数のみを取得したいのですが、ファイルにパイプしなくても意図したとおりに動作します。ファイルへの > が何も書き込まない理由が少しわかりません。
これは機能します:
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'
ping.datには何も書き込まれません
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat
何が間違っているのでしょうか?
答え1
それぞれは|
、stdio 出力バッファと stdin 入力バッファに囲まれている可能性があります。リアルタイム パイピングを実現するには、どれをオフにする必要があるかを調べる必要があります。
これは私にとってはうまくいきます:
ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file
最初はすべてのコマンドの前に を入れてstdbuf -i0 -o0
、どれが不要かを調べました。
答え2
GNU を使用している場合、-l
sed のオプションが間違っているようです。おそらく-u
(unbuffered) オプションが必要です。また、 はgrep
不要です。sed だけで必要なものを取得できるはずです。
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
は-n
通常の一致する出力を抑制しますが、 はs///p
一致する行の出力を強制します。