парсинг вывода с помощью awk

Я пытаюсь создать небольшой сценарий оболочки, который берет вывод этой команды: nc 127.0.0.1 5556 2›/dev/null (вывод показан ниже) и анализирует его на отдельные переменные, чтобы я мог передавать через клиент mqtt. Я думаю, мне нужно использовать grep или, возможно, awk.

Так, например, если я хочу разобрать 5 значений, связанных с wind0, на 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

person Baobab    schedule 03.11.2020    source источник
comment
awk будет лучшим выбором для этого.   -  person l'L'l    schedule 03.11.2020


Ответы (2)


Вы можете сделать что-то вроде этого:

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, b=$b, c=$c, d=$d, e=$e"
done
person anubhava    schedule 03.11.2020
comment
Спасибо за ответ. Я попробовал ваше предложение и получил синтаксическую ошибку: неожиданное перенаправление. Немного исследований, и похоже, что, поскольку я использую OpenWRT, на самом деле он использует не bash, а ash или BusyBox. Я не уверен, что ash и BusyBox — это одно и то же или разные. Я полностью потерян, когда дело доходит до сценариев оболочки. - person Baobab; 04.11.2020

Итак, я наткнулся на исправление, которое, кажется, работает. Я понятия не имею, почему и как, но вот:

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 $2}')
EOF
person Baobab    schedule 04.11.2020
comment
Выполнение команды внутри документа здесь просто странно. Решение с трубкой Анубхавы более идиоматично и менее подвержено ошибкам. - person tripleee; 04.11.2020