一起使用“ping”、“cut”和“tee”

一起使用“ping”、“cut”和“tee”

因此,我知道通过使用“tee”,我可以将“ping”等命令的输出重定向到标准输出以及文件。

例如:

> ping google.com | tee somefile

这将在终端上显示 ping 统计信息并将其写入“somefile”。

现在,如果我想修改“ping”的输出,我可以这样使用“cut”:

> ping google.com | cut -d' ' -f 1

但是,如果我希望一起使用所有三个命令,我会在标准输出上得到无输出和空文件。

> ping google.com | cut -d' ' -f 1 | tee somefile

我究竟做错了什么?有一个更好的方法吗?不知怎的,我觉得我没有正确使用“tee”。任何见解将不胜感激。

我正在使用 bash shell,如果这相关的话。

答案1

您的管道命令作为非终端目标,正在缓冲您的输出。它最终会显示出来,但只有在产生大量输出或 ping 命令退出时才会出现。

您可以使用ping -c 5 google.com设置要发送的特定数据包数量,然后 ping 将退出。您的输出返回并且管道应该按预期工作。

编辑:另一种解决方法用于stdbuf避免管道缓冲和awk避免某些内部cut缓冲,并让 ping 连续运行:

ping www.google.com | stdbuf --output=0 awk '{print $1}' | tee /tmp/file

相关内容