синтаксический анализ выходных данных с помощью awk

#awk #grep #busybox #ash

#авк #grep #деловитый ящик #пепел #awk #busybox

Вопрос:

Я пытаюсь создать небольшой сценарий оболочки, который принимает выходные данные из этой команды: 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
  

Комментарии:

1. awk было бы выбором для этого.

Ответ №1:

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

 while read -r a b c d e; do
     echo "a=$a, b=$b, c=$c, d=$d, e=$e"
done < <(nc ... 2>amp;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>amp;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
  

Комментарии:

1. Спасибо за ответ. Я попробовал ваше предложение и получил «синтаксическая ошибка: неожиданное перенаправление». Небольшое исследование, и похоже, что, поскольку я использую OpenWRT, на самом деле он использует не bash, а ash или BusyBox. Я не уверен, являются ли ash и BusyBox одинаковыми или разными. Я полностью теряюсь, когда дело доходит до сценариев оболочки.

Ответ №2:

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

 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>amp;1 | awk -F '[[:blank:]] wind0[[:blank:]] ' 'NF>1{print $2}')
EOF
  

Комментарии:

1. Выполнение команды внутри документа here просто странно. Решение Anubhava для каналов более идиоматично и менее подвержено ошибкам.