ファイルにパイピングせずに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を使用している場合、-l
sedオプションは間違っているようです。おそらく-u
(unbuffered)オプションが必要です。さらに、これはgrep
重複しています。 sedで欲しいものを手に入れることができるはずです。
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
-n
正常な一致出力を抑制し、一致するs///p
行を強制的に出力します。