执行命令,直到在其输出中获得X行

  • 本文关键字:输出 命令 执行 bash
  • 更新时间 :
  • 英文 :


虽然如何在一定数量的输出后终止脚本与我正在寻找的非常相似,但我注意到,如果我对输出进行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行为良好,并且没有将其标准输出设置回缓冲。

最新更新