管道不写入文件

管道不写入文件

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

相关内容