我只想获取从 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
强制输出匹配行。