2015-09-15 1 views
0

Почтовые индексы Я хочу, чтобы перебирать в Баш над этой JSon строки (генерируемый jq):перебрать JSon строки в Баш для создания

{ 
    "hostname": "Arthhur", 
    "long": 10.234656, 
    "lat": 54.3454345 
} 
{ 
    "hostname": "Zaphod", 
    "long": 10.12344324, 
    "lat": 54.35672134 
} 
... 

генерировать Почтовые индексы от местоположения с помощью:

plz=`wget -qO - "http://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&sensor=true"|grep '"[0-9][0-9][0-9][0-9][0-9]"'|head -n1` 

    plz=${plz##*\ :\ \"} 
    plz=${plz%%\"*} 

Как я могу передать строку в цикл bash, поэтому я могу вызвать эту команду wget для каждого имени хоста, имея две переменные внутри цикла для long и lat?

+0

Я не уверен, что вы вернетесь из своего первоначального вызова 'wget', но, полагая, что это строка json, просто используйте' while read -r your vars ...; сделать ... ваш синтаксический анализ ...; done <<($ (wget -qO - "http: //maps.googleapis.com ....)) Это просто стандартная подстановка процесса *, если я понял ваш вопрос. –

+0

https://github.com/ dominictarr/JSON.sh является синтаксическим анализатором JSON в оболочке. – chicks

+0

Не совсем уверен, почему здесь имеет место геокодирование api/zip? [Как разобрать json в bash] (http://stackoverflow.com/questions/1955505/parsing-json -with-sed-and-awk) – BroSlow

ответ

1

Еще немного запутался, почему вы разобрали оригинальную json в то, что вам еще нужно разобрать, но что-то подобное должно вообще работать для конкретной строки

#!/bin/bash 
unset lat long hostname 
while IFS= read -r line; do 
    [[ $line =~ '"hostname": "'([^\"]+) ]] && hostname=${BASH_REMATCH[1]} 
    [[ $line =~ '"long": '([^,[:space:]]+) ]] && long=${BASH_REMATCH[1]} 
    [[ $line =~ '"lat": '([^,[:space:]]+) ]] && lat=${BASH_REMATCH[1]} 
    if [[ -n $hostname && -n $long && -n $lat ]]; then 
    echo "Hostname=[$hostname], Lat=[$lat], Long=[$long]" #or whatever else with them 
    unset lat long hostname 
    fi 
done < file 

т.е.

> cat file 
{ 
    "hostname": "Arthhur", 
    "long": 10.234656, 
    "lat": 54.3454345 
} 
{ 
    "hostname": "Zaphod", 
    "long": 10.12344324, 
    "lat": 54.35672134 
} 
> ./abovescript 
Hostname=[Arthhur], Lat=[54.3454345], Long=[10.234656] 
Hostname=[Zaphod], Lat=[54.35672134], Long=[10.12344324] 
Смежные вопросы