无法捕获粘贴 bash 命令的输出


( ping -n apple.com | ack -o --flush '((?<=icmp_seq=)[0-9]+|(?<=time=)[0-9]+[.][0-9]+)' | paste - - ) > ~/Desktop/ping_ouput.txt

似乎没有出于某种原因工作,而如果我拿走

| paste - -

部分,它可以正常工作。我需要将所有其他行与选项卡一起加入其他行,而不是Newline。任何想法都将受到赞赏。

更新:

默认情况下,ping无限期地产生输出,直到终止,因此您的管道将继续生成输出并无限期地生产输出文件,您的命令永远不会单独完成

因此,您需要 limage 执行的ping的数量;例如:

  • 使用-c count选项在指定的ping数之后停止。
  • 另外,在类似BSD的系统上,您可以使用-o在第一个成功之后停止 ping。
  • 另外,无论收到多少数据包,您都可以在指定的超时之后停下来:
    • Linux:-w timeout
    • 类似BSD的系统:-t timeout

顺便说一句,为了将管道重定向到文件, no 需要将其封闭在整个(...)中,这不必要地创建一个(nother) subshell


在(a)(a)在OP在评论中揭示其平台是OSX之前的特定症状之前(b)在(b)之前写下了以下内容。下面的命令显示了OP提取命令的替代方案;添加了-c 2以将Ping限制为 2 尝试。

tivn的答案至少在您的命令中发现了电位问题:time始终的假设有一个小数点,而该点不存在于 linux linux 平台;但是,在BSD/OSX平台上,有总是 3个小数点。

您可以绕过此问题,以及需要按以下方式合并连续行(我使用的是127.0.0.1而不是apple.com来更轻松地测试):

使用GNU sed(Linux)或BSD sed(包括OSX在内的BSD样系统):

ping -c 2 -n 127.0.0.1 |
  sed -E '1d; s/^.* icmp_seq=([^ ]+).* time=([^ ]+).*$/1'$'t''2/'

替代解决方案,使用awk

ping -c 2 -n 127.0.0.1 | awk -F'[ =]' -v OFS='t' 'NR>1 { print $6, $10 }'

如果您不想依靠字段 indices ,这是一种替代方案(仍然依靠field icmp_seqtime之前,都依靠,两者都在空间):

ping -c 2 -n 127.0.0.1 | awk -F' (icmp_seq|time)=' -v OFS='t' '
  NR>1 { sub(" .+$", "", $2); sub(" .+$", "", $3)
  print $2, $3 }'

您不提供从ping获得的样品输入,因此尚不清楚您的问题是什么。但是我想您的问题是因为ping结果的time零件可能并不总是包含DOT .,例如:64 bytes from x.x.x.x: icmp_seq=1 ttl=63 time=137 ms。您可能需要尝试以下命令:

( ping -n yahoo.com 
  | ack -o --flush '((?<=icmp_seq=)d+|(?<=time=)[d.]+)' 
  | stdbuf -o0 paste - - 
) > ~/Desktop/ping_ouput.txt

编辑:在OP的评论后,该问题实际上可能来自缓冲paste命令。请尝试将stdbuf -o0添加到paste命令。

相关内容

  • 没有找到相关文章

最新更新