パイプがファイルに書き込まない [重複]

パイプがファイルに書き込まない [重複]

ファイルにパイピングせずにpingコマンドからファイルにミリ秒をインポートしようとしていますが、期待どおりに機能します。なぜ> to a fileが何も書かないのは少し混乱しています。

これは働きます:

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行を強制的に出力します。

関連情報