使用 awk 解析输出

parsing output with awk

我正在尝试构建一个小的 shell 脚本来获取此命令的输出:nc 127.0.0.1 5556 2>/dev/null(如下所示的输出)并将其解析为单个变量,因此我可以通过 mqtt 客户端传输。我想我需要使用 grep 或者 awk。

例如,如果我想将与 wind0 关联的 5 个值解析为 5 个单独的变量,我该怎么做。我需要以 $a=220、$b=0.0、$c=0.0、$d=8.2 和 $e=0.

结尾

谢谢!

猴面包树

编辑:原来我正在尝试的系统是基于 OpenWRT 的,所以显然使用的是 ash 或 BusyBox 而不是 bash。

20201103061623 th0 8.2 39 -4.9 0
20201103061629 wind0 220 0.0 0.0 8.2 0
20201103061611 rain0 0.0 153.8 0.0 0
20201103061547 thb0 22.3 32 4.8 901.7 1004.5 0 1
20201103061628 data10 0.00 0
20201103061628 data11 1.29 0
20201103061628 data12 0.00 0
20201103061628 data13 11.00 0
20201103061628 data15 108.00 0
20201103061628 data16 3.00 0
20201103061628 t9 50.5 0

你可以这样做:

while read -r a b c d e; do
     echo "a=$a, b=$b, c=$c, d=$d, e=$e"
done < <(nc ... 2>&1 | awk -F '[[:blank:]]+wind0[[:blank:]]+' 'NF>1{print }')
a=220, b=0.0, c=0.0, d=8.2, e=0

nc ... 替换为您实际的 nc 命令行。


如果您不使用 bash,则使用:

nc ... 2>&1 | awk -F '[[:blank:]]+wind0[[:blank:]]+' 'NF>1{print }' |
while read -r a b c d e; do
     echo "a=$a, b=$b, c=$c, d=$d, e=$e"
done

所以我遇到了一个似乎有效的修复程序。我不知道为什么或如何,但在这里:

while read -r a b c d e; do
     echo "a=$a, b=$b, c=$c, d=$d, e=$e"
done <<EOF     
$(nc 127.0.0.1 5556 2>&1 | awk -F '[[:blank:]]+wind0[[:blank:]]+' 'NF>1{print }')
EOF