【问题标题】:Capturing multiple paralleled grep outputs in bash在 bash 中捕获多个并行的 grep 输出
【发布时间】:2014-08-22 22:52:40
【问题描述】:

我的困境在于将 grep 结果通过管道传输到一个变量以供以后使用。通常,这不是问题,我会使用$( ) 并将结果按原样推送到变量中。

当我需要使用& 运算符并行运行多个 ping 实例时,问题就出现了。一码sn-p:

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,而不是这些 grep 应该检索的 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 的命令或函数来提取我需要的信息的方法?

作为参考,整个脚本位于pastebinhere

【问题讨论】:

  • 我不认为你的结果是零。我认为你的变量是空的。我认为当您执行这样的后台任务时,shell 分配不起作用。

标签: linux bash scripting


【解决方案1】:

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

你正在使用的命令:

var=$(pipeline) &

导致var=$(pipeline) 在后台子shell 中运行。在那个 shell 中,管道将被执行并且它的输出被子 shell 的$var 捕获。但这没有用,因为 subshel​​l 即将终止,并带走了它的变量。

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

【讨论】:

  • 最终,我最终分解并使用了脚本在完成后删除的临时文件。有没有办法让子 shell 在更新之前等待同一个父 shell 的其他 shell 进程完成?这是我在更新可用信息时遇到的最初问题 - 外壳会重叠并争夺对光标的控制,从而产生非常扭曲的结果。更正代码here,感谢您的帮助!
  • @VYCanisMajoris:与其争夺光标,不如使用三个临时文件。在父级中,wait 之后,您可以根据需要将它们连接到一个文件中,或者您可以独立处理它们(在您的情况下,这会更简单)。我强烈推荐使用/tmp 目录(可能是一个ramdisk),同时也使用mktemp。如果需要多个文件,请使用mktemp -d 创建一个临时子目录。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2015-10-29
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多