使用 AWK 并将输出捕获到 Bash 中的变量

Using AWK and Fping to capture out put to variable in Bash

我正在尝试将 fping 的输出保存到 Bash 中的一个变量中,这应该很容易,但我就是无法让它工作。我尝试了各种方法,尝试在捕获的变量上使用 AWK 和 CUT 之类的东西,但得到的是空变量。

我的思考过程如下。

  1. 输入 fping 8.8.8.8 -c 2 给我输出
8.8.8.8 : [0], 84 bytes, 15.1 ms (15.1 avg, 0% loss)
8.8.8.8 : [1], 84 bytes, 15.0 ms (15.0 avg, 0% loss)

8.8.8.8 : xmt/rcv/%loss = 2/2/0%, min/avg/max = 15.0/15.0/15.1
  1. 输入 fping -c 1 8.8.8.8 | awk '/min/' 仅 returns 我想要的最后一行。

8.8.8.8 : xmt/rcv/%loss = 2/2/0%, min/avg/max = 15.0/15.0/15.1

  1. 所以输入输出=$(fping -c 1 8.8.8.8 | awk '/min/')

我希望将最后一行保存到一个变量中,然后我可以进一步处理。但是我得到一个空白变量,即使它显示如下行??

$ output=$(fping -c 1 8.8.8.8 | awk '/min/')

8.8.8.8 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 15.1/15.1/15.1

我也在考虑首先使用 AWK 提取第 5 列和第 6 列值以使 post 处理更容易

类似于

output=$(fping -c 1 8.8.8.8 | awk '/min/ {loss= , time=}')

这个语法目前可能是错误的,但是给一个像 bwlow 这样的变量,所有的值都准备好提取

"2/2/0% 15.0/15.0/15.1"

我做错了什么?如何将输出的最后一行保存到变量中?我可以将它拆分,但为什么 AWK 不提取正确的位并保存它?

谢谢

这是您的 complete, unabbreviated output 尝试:

user@host$ output=$(fping -c 1 8.8.8.8 | awk '/min/')

8.8.8.8 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.66/0.66/0.66
user@host$

您在屏幕上获得输出这一事实至关重要,这意味着数据未被捕获。这通常表示数据改为写入 stderr。这是将 stdout 重定向到 stderr 时得到的结果:

user@host$ output=$(fping -c 1 8.8.8.8 2>&1 | awk '/min/')
(no output)

事实上,变量现在有一个值:

user@host$ printf '%s\n' "$output"
8.8.8.8 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.77/0.77/0.77