Can';t捕获粘贴bash命令的输出
第二节,它工作得很好。我需要用制表符而不是换行符将其他行连接在一起。欢迎提出任何想法。更新: 默认情况下,Can';t捕获粘贴bash命令的输出,bash,shell,scripting,Bash,Shell,Scripting,第二节,它工作得很好。我需要用制表符而不是换行符将其他行连接在一起。欢迎提出任何想法。更新: 默认情况下,ping会无限期地生成输出,直到终止,因此管道将继续生成输出并无限期地增长输出文件,您的命令本身永远不会完成 因此,您需要限制执行的ping的数量;e、 g: 使用-c count选项在指定的ping次数后停止 或者,在类似BSD的系统上,您可以使用-o在第一次成功ping后停止 或者,您可以在指定的超时(以秒为单位)后停止,无论接收到多少数据包: Linux:-w超时 类似BSD的系统
ping
会无限期地生成输出,直到终止,因此管道将继续生成输出并无限期地增长输出文件,您的命令本身永远不会完成
因此,您需要限制执行的ping的数量;e、 g:
- 使用
选项在指定的ping次数后停止-c count
- 或者,在类似BSD的系统上,您可以使用
在第一次成功ping后停止-o
- 或者,您可以在指定的超时(以秒为单位)后停止,无论接收到多少数据包:
- Linux:
-w超时
- 类似BSD的系统:
-t超时
- Linux:
(…)
中,这不需要创建(另一个)子shell
以下是在(a)已知具体症状和(b)OP在评论中披露其平台为OSX之前编写的。下面的命令显示了OP提取命令的替代方案<代码>-c 2已添加,以将ping限制为2次尝试 至少在您的命令中发现了潜在的问题:假设
time
值总是有一个小数点,这在Linux平台上不成立;但是,在BSD/OSX平台上,始终有3位小数
您可以绕过这个问题以及如下合并连续行的需要(我使用127.0.0.1
而不是apple.com
,以便于测试):
使用GNUsed
(Linux)或BSDsed
(类似BSD的系统,包括OSX):
使用awk的替代解决方案:
ping -c 2 -n 127.0.0.1 |
sed -E '1d; s/^.* icmp_seq=([^ ]+).* time=([^ ]+).*$/\1'$'\t''\2/'
如果您不想依赖字段索引,这里有一个替代方案(仍然依赖于字段
icmp_seq
在time
之前出现,并且两者前面都有空格):
您没有提供从
ping
获得的示例输入,因此不清楚您的问题是什么。但我猜您的问题是因为ping
结果中的时间部分可能并不总是包含点
,例如:x.x.x中的64字节:icmp_seq=1 ttl=63 time=137 ms
。您可能希望尝试使用以下命令:
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-n yahoo.com\
|ack-o--flush'(?什么“不起作用”意思是?输出是什么?可能是stdin和stderror的问题吗?它没有输出到文件谢谢你指出了这一点。但是你指定的解决方案也没有输出到文件。我的主要问题是粘贴部分阻止它将输出保存到ping_output.txtGood catch;times>=100毫秒。确实看到了吗在Linux上,m表示为整数(在man
页面中没有任何明显的信息告诉我们这一点)。相比之下,在BSD/OSX系统上,总是有3位小数。@mklement0感谢您检查其他系统。我只检查Linux。@zacbrac,也许您有缓冲的paste
,请尝试用stdbuf-o0 paste---
@mklement0啊,就是这样。非常感谢您。现在一切都正常了。现在我可以在g中绘制这个nuplot:)
ping -c 2 -n 127.0.0.1 |
sed -E '1d; s/^.* icmp_seq=([^ ]+).* time=([^ ]+).*$/\1'$'\t''\2/'
ping -c 2 -n 127.0.0.1 | awk -F'[ =]' -v OFS='\t' 'NR>1 { print $6, $10 }'
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 -n yahoo.com \
| ack -o --flush '((?<=icmp_seq=)\d+|(?<=time=)[\d.]+)' \
| stdbuf -o0 paste - - \
) > ~/Desktop/ping_ouput.txt