パイプがファイルに書き込まない

パイプがファイルに書き込まない

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 を使用している場合、-lsed のオプションが間違っているようです。おそらく-u(unbuffered) オプションが必要です。また、 はgrep不要です。sed だけで必要なものを取得できるはずです。

ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out

-n通常の一致する出力を抑制しますが、 はs///p一致する行の出力を強制します。

関連情報