( 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
- Linux:
顺便说一句,为了将管道重定向到文件, 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_seq
到 time
之前,都依靠,两者都在空间):
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
命令。