虽然如何在一定数量的输出后终止脚本与我正在寻找的非常相似,但我注意到,如果我对输出进行grepping,这就行不通了。
例如:
➜ ~ ping google.com | head -n 5
PING google.com (142.251.32.206): 56 data bytes
64 bytes from 142.251.32.206: icmp_seq=0 ttl=115 time=30.867 ms
64 bytes from 142.251.32.206: icmp_seq=1 ttl=115 time=32.049 ms
64 bytes from 142.251.32.206: icmp_seq=2 ttl=115 time=37.133 ms
64 bytes from 142.251.32.206: icmp_seq=3 ttl=115 time=31.965 ms
➜ ~
但是如果我想只grep包含bytes from?
的行怎么办?这不起作用(根本没有输出):
➜ ~ ping google.com | grep -i "bytes from" | head -n 5
第二个命令最终将产生输出,但需要一些时间。您正在体验缓冲的结果。来自bash faq:
大多数标准Unix命令在非交互使用时缓冲它们的输出。这意味着它们不会立即写入每个字符(甚至每行),而是在打印任何内容之前收集更多的字符(通常为4千字节)。在上面的例子中,grep命令缓冲它的输出,因此awk只能以大块的形式获得它的输入。
同样的FAQ包含了这个问题的几个解决方案。例如,grep
有一个--line-buffered
选项,它将使您的第二个示例按照您期望的方式工作:
$ ping google.com | grep --line-buffered -i "bytes from" | head -n 5
您可以限制ping请求的数量,而不是使用head
:
ping -c 5 google.com
或者你可以试试
stdbuf -o0 ping google.com
后者最初将输出设置为未缓冲。这假设ping
行为良好,并且没有将其标准输出设置回缓冲。