#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 для каналов более идиоматично и менее подвержено ошибкам.