因此,我知道通过使用“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