试图仅从ping
输出中捕获数据包返回时间,我发出
$ ping 192.168.0.1 | grep -o '[^ =]* ms'
它起作用了,显示每个数据包到达的时间。由于我也想摆脱时间单位,因此认为这就足够了:
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | grep -o '^[^ ]*'
但是,令我惊讶的是,它挂起,没有显示输出。echo
但是,用输出中的示例行替换第一个命令ping
可以按预期工作(它输出5.07
):
$ echo '64 bytes from 192.168.0.1: icmp_seq=10 ttl=64 time=5.07 ms' | grep -o '[^ =]* ms' | grep -o '^[^ ]*'
我找到了其他方法来获取没有毫秒单位的时间,但仍然:ping
命令有什么问题?为什么通过一个管道可以,但不能通过两个?
PS:下面的这些也失败了,而他们的echo
版本成功了,所以问题不在于grep
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | sed 's_ ms__'
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | cut -f 1 -d ' '
$ ping 192.168.0.1 | cut -f 7 -d ' ' | cut -f 2 -d '='
明确的答案是行缓冲。
ping -c 3
您可以使用而不是 just来演示这一点ping
,其中所有输出仅在第一个命令完成时产生。作为 GNU 的一种解决方法,
grep
您可以将两个过滤器减少到一个或者,如果您真的想使用两个过滤器,
grep --line-buffered ...
或者stdbuf -oL grep ...
将适合您。我认为您的问题是由您的外壳的行缓冲引起的。
如果您让命令运行足够长的时间,您应该会看到一些输出。
或者只是限制这样的 ping 数量:
如果您点击此链接,还有更多信息和解决方法(解决方案?)