Считывание входных данных построчно через цикл while
и read
:
while read line || [[ -n $line ]]; do
...
done
Проверка гарантирует, что мы не действуем при неверном вводе.
Захват компонентов в переменные с помощью подстановки команд :
ip="$(echo "$line" | sed 's/<capture pattern>/\n/')"
Вывести строки текста с заменами в тех местах, где вы хотите, с помощью printf
и раскрытия параметров :
printf "%s\n" "\"ip\":\"${ip}\","
Этого должно быть достаточно, чтобы собрать рабочий скрипт вместе. Кроме того, если выходные данные из arp надежно определены, вы можете избежать регулярных выражений и просто разбить строки на разделителе (здесь, пробел) и использовать индексы и расширение переменных для достижения того же.
Разделить строку на пустом месте в массив с помощью read
:
read -ra arr <<< "$line"
Доступ к array
элементам через:
${arr[index]}
Для захвата ip потребуется манипулирование строками для удаления скобок. Удалить их через:
ip=${arr[1]#(}
ip=${ip%)}
Соберите все вместе, и у вас будет что-то вроде этого:
#!/bin/bash
## we'll insert commas between items before inserting the next item
## rather than at the end so that we don't add a trailing comma.
## we'll need this flag to know if we're at the first insertion,
## where we won't insert a comma.
first=1
printf "%s\n" "["
while read line || [[ -n $line ]]; do
if [ $first -eq 0 ]; then
printf "%s\n" ","
else
first=0
fi
read -ra arr <<< "$line"
ip=${arr[1]#(}
ip=${ip%)}
printf "%s\n" " {"
printf "%s\n" " \"ip\":\"${ip}\","
printf "%s\n" " \"mac\":\"${arr[3]}\","
printf "%s\n" " \"hostname\":\"${arr[0]}\""
printf "%s" " }"
done
printf "\n%s\n" "]"
Я не знаком с arp, но если бы этот файл был назван, скажем, arp-to-json
, то вы, вероятно, использовали бы его через:
arp -a | arp-to-json
Вы можете быстро проверить, что json хорошо отформатирован, используя jq
:
arp -a | arp-to-json | jq --indent 4
Ожидаемый результат должен точно соответствовать указанному вами.