用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 $2}')
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 $2}' |
while read -r a b c d e; do
     echo "a=$a,e=$e"
done
,

因此,我遇到了一个似乎可行的修复程序。我不知道为什么或如何,但是在这里:

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