LINUX.ORG.RU

Bash json массив

 ,


0

1

Добрый вечер уважаемые форумчане! просьба помочь решить задачу

Есть локальный довольно большой json файл

{"ip":"10.10.10.15","processort":"Intel(R) Celeron(R) CPU 1000M @ 1.80GHz","location":"Бокс 1"},
{"ip":"10.10.10.17","processort":"Intel(R) Celeron(R) CPU 1000M @ 1.80GHz","location":"Бокс 2"}
Распарсиваю файл через jq
arr=( $(jq -r '.[2] | .data[] | .ip, .processort, .location' file.json) )
for i in ${arr[@]}
do
ip=$(printf '%s\n' "${i[0]}")
if ping -c1 -w3 $ip >/dev/null 2>&1; 
then
       echo "ONLINE" 
else
       echo "OFFLINE"
fi
done
Задача пройтись по каждому объекту ip, проверить его на доступность, и записать в новый json файл но с добавлением новых объектов Должно выйти так
{"ip":"10.10.10.15","processort":"Intel(R) Celeron(R) CPU 1000M @ 1.80GHz","location":"Бокс 1","status":"online", "date":"18.01.2020"},
{"ip":"10.10.10.17","processort":"Intel(R) Celeron(R) CPU 1000M @ 1.80GHz","location":"Бокс 2", "status":"offline", "date":"18.01.2020"}


Ответ на: комментарий от vesta

а на bash ?

jq вроде умеет что-то добавлять в json. Вычитываешь нужный тебе объёкт, перегоняешь в json-строку, дальше парсишь её, пингуешь хост. Потом опять парсишь её, добавляешь свойство и сохраняешь в файл. Всё это выглядит геморно очень, подумай, надо ли оно тебе настолько. У меня была парсилка api на jq. Поддерживать её было сомнительным удовольствием.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)

У вас уже алгоритм почти получился. Надо вначале создать массив с каждым объектом по отдельности, а уже потом доставать из элемента IP. Потом через jq добавлять ONLINE/OFLINE свойство и записывать новый json просто печатая все элементы массива.

vodz ★★★★★ ()
Ответ на: комментарий от crutch_master

На ноде всё будет лаконичнее,

Да лана, тривиальный скрипт вырисовывается. У ТС-а исходный файл не валидный json, у него уже массив а не список объектов.

vodz ★★★★★ ()

Массив тут вообще не нужен, в баше надо в первую очередь думать о пайплайнах. jq не поддерживает вызов внешних функций, поэтому приходится извращаться. Парсим json | читаем и обрабатываем переменные в баше | формируем новый json.

jq -r '... | [.ip, .processort, .location] | @tsv' | \
while IFS=$'\t' read -r addr proc loc; do
  printf "$addr\t$proc\t$loc\n"
done | \
jq --raw-input 'split("\t") | ...'
anonymous ()
Ответ на: комментарий от anonymous

Массив тут вообще не нужен, в баше надо в первую очередь думать о пайплайнах. jq не поддерживает вызов внешних функций, поэтому приходится извращаться.

Вы сами себе противоречите. Вот массив bash-а и будет той самой внешней подмогой. Заодно можно будет параллельно пинговать.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

ну ОП делает последовательно, значит массив ему не нужен. Меньше используемой оперативки - меньше проблем. А параллельную обработку можно сделать, например разбив исходный файл на несколько частей.

anonymous ()
Ответ на: комментарий от anonymous

Меньше используемой оперативки - меньше проблем.

Если у ТСа именно такой json, там что не нужно, так это jq, читаем строки в массив, разбиваем по полям, добавляем результат ONLINE/OFFLINE и выводим массив одним движением руки. :)

vodz ★★★★★ ()