在bash中捕获多个并行的grep输出

VY Canis Major

我的难题在于将grep结果传递给变量以供以后使用。通常,这不会有问题,我会使用$( )并将结果按原样推送到变量中。

当我需要使用&运算符并行运行多个ping实例时,就会出现问题一个代码片段:

google_ping=$(ping -c 2 www.google.com | grep -oP '\d+(?=% packet loss)') &
bing_ping=$(ping -c 2 www.bing.com | grep -oP '\d+(?=% packet loss)') &
custom_ping=$(ping -c 2 10.1.1.1 | grep -oP '\d+(?=% packet loss)') &

wait

printf "Google Ping: \t\e[32m %3d\e[0m\n " $google_ping
printf "Bing Ping:\t\e[32m %3d\e[0m\n " $bing_ping
printf "Custom Ping:\t\e[32m %3d\e[0m\n " $custom_ping

我有更多的ping命令可以运行,并且已缩短此操作,以使代码的混乱程度不如已经存在的混乱。本质上,对每个目的地执行两次ping操作,检索每个目的地的数据包丢失,并同时发布所有结果,而不是在它们可用时发布。

我得到的结果似乎是错误输出(已为0)而不是数据包丢失。对于custom_ping,这是一个受控测试(总是返回100%的数据包丢失),结果仍为0,而不是应检索的100个数据包。

像这样运行与printf一致的命令:

printf "Google Ping: \t\e[32m %3d\e[0m\n " $(ping -c 2 www.google.com | grep -oP '\d+(?=% packet loss)') &
#etc...

偶尔会起作用,但通常会通过将ping结果彼此相邻或彼此放置等方式来扭曲输出。更何况,我需要稍后根据结果的高低来使用结果的值来执行某些操作数据包丢失是,我最终还需要拉出数据包花费的毫秒数。

我尝试了多种并行运行ping的方法。包括使用反引号代替$( )和通过重定向输出2>$1我想尽可能避免使用临时文件。

还有另一种方法会更有效吗?还是一种将来自一个站点的所有ping结果放入一个变量,并使用类似于grep的命令或函数来提取我需要的信息的方法?

作为参考,整个脚本位于此处的pastebin上

如果不使用临时文件之类的东西,根本无法做您想做的事情。(或类似的半永久性存储,如memcached或redis。)幸运的是,所有这些解决方案都相当快。您的/tmp目录很有可能实际上是一个虚拟磁盘,如果不是,则可以制作一个或使用一种内存缓存解决方案。

您正在使用的命令:

var=$(pipeline) &

原因var=$(pipeline)在后台子shell中运行。在该外壳中,将执行管道,并且其输出将由子外壳的捕获$var但这没有用,因为子外壳将要终止,并带有其变量。

您可以将放到的&内部$(...),在这种情况下,值将分配到$var外壳中。但是命令替换$(pipeline&)替换waitpipeline,这完全违背了pipeline在后台运行的目的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试从bash输出中grep docker id

来自分类Dev

将grep输出管道到bash中的grep中

来自分类Dev

Bash 脚本:并行化 ssh 中缺少输出

来自分类Dev

无法将输出捕获到Bash中的变量中

来自分类Dev

无法将输出捕获到Bash中的变量中

来自分类Dev

Bash脚本中多个文件的输出NamingVariable

来自分类Dev

在BASH / SHELL中捕获输出和退出代码

来自分类Dev

Ruby从bash脚本执行中捕获stderr输出

来自分类Dev

如何在bash脚本中捕获两列ls输出

来自分类Dev

从bash并行运行多个脚本,而无需将输出打印到控制台

来自分类Dev

从bash并行运行多个脚本,而无需将输出打印到控制台

来自分类Dev

并行调用多个bash函数

来自分类Dev

grep在多个文件中搜索模式并输出到不同的文件

来自分类Dev

Grep 用于行中的多个值并仅输出 MULTIPLE 值

来自分类Dev

异步捕获多个进程的输出

来自分类Dev

异步捕获多个进程的输出

来自分类Dev

grep输出仅在bash脚本中打印一行

来自分类Dev

在bash脚本中从grep输出扩展环境变量

来自分类Dev

grep输出仅在bash脚本中打印单行

来自分类Dev

BASH将grep输出存储到变量或数组中

来自分类Dev

Bash:将函数中的变量前置到 grep 输出

来自分类Dev

Grep多个bash参数

来自分类Dev

Bash递归捕获命令输出

来自分类Dev

捕获内置bash的多行输出

来自分类Dev

Bash脚本可以在多个终端会话中并行或并行启动多个进程,还是全部集中在一个前台?

来自分类Dev

尾部多个文件并grep输出

来自分类Dev

Foreach并行-多个输出的合并功能

来自分类Dev

Bash Grep Quiet SSH输出

来自分类Dev

如何通过Snakefile中的输入并行化规则(具有多个输出)

Related 相关文章

热门标签

归档