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:

  • 使用
    -c count
    选项在指定的ping次数后停止
  • 或者,在类似BSD的系统上,您可以使用
    -o
    在第一次成功ping后停止
  • 或者,您可以在指定的超时(以秒为单位)后停止,无论接收到多少数据包:
    • Linux:
      -w超时
    • 类似BSD的系统:
      -t超时
顺便说一句,为了将管道重定向到文件,不需要将其作为一个整体封装在
(…)
中,这不需要创建(另一个)子shell


以下是在(a)已知具体症状和(b)OP在评论中披露其平台为OSX之前编写的。下面的命令显示了OP提取命令的替代方案<代码>-c 2已添加,以将ping限制为2次尝试

至少在您的命令中发现了潜在的问题:假设
time
值总是有一个小数点,这在Linux平台上不成立;但是,在BSD/OSX平台上,始终有3位小数

您可以绕过这个问题以及如下合并连续行的需要(我使用
127.0.0.1
而不是
apple.com
,以便于测试):

使用GNU
sed
(Linux)或BSD
sed
(类似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