Извлечь данные в строку из JSON в Bash

Как я могу извлечь IP-адрес и страну и поместить их по отдельности в строку без кавычек или любых других символов, присутствующих в тексте, с помощью следующей команды:

info_ip=`wget --tries=1 --timeout=10 -qO- http://ipinfo.io/?callback=callback; echo` 

Сейчас я ищу, чтобы отфильтровать данные по IP и стране

$ ip =?

$ страна =?

ipinfo.io настоящее время возвращает что-то вроде:

 /**/ typeof callback === 'function' && callback({ "ip": "198.51.100.123", "hostname": "host.example.com", "city": "Example City", "region": "Example Region", "country": "XY", "loc": "12.3456,-1.2345", "postal": "XXX", "org": "ASXXXX Example Organisation" }); 

Другой подход.

 A=($(wget -t1 -T10 -qO- ipinfo.io/?callback=callback|awk -F\" '/ip|country/{print$4}')) echo ${A[0]} 35.230.152.185 echo ${A[1]} US 

Как указывал Стефан Шазелас, это могло бы вести себя плохо, если бы «ip» или «страна» были видны где-то еще в выходных данных. Более надежное решение:

 A=($(wget -t1 -T10 -qO- ipinfo.io/?callback=callback|awk -F\" '$2~/^(ip|country)$/{print$4}')) 

Может быть что-то вроде:

 read -r ip country < <( wget --tries=1 --timeout=10 -qO- 'http://ipinfo.io/?callback=callback' | perl -MJSON -l -0777 -ne ' if (/callback\((.*)\);$/s) { $j = from_json($1); print "$j->{ip} $j->{country}" }' ) 

Оболочку со встроенной поддержкой JSON смотрите в ksh93v (в настоящее время в бета-версии):

 ipinfo=${ wget --tries=1 --timeout=10 -qO- 'http://ipinfo.io/?callback=callback' } || exit ipinfo=${ipinfo/%*"callback("@(*)");"/\1} IFS= read -rm json j <<< $ipinfo ip=${j.ip} country=${j.country} 

Обратите внимание, что вместо этого запроса ?callback (кстати, это подстановочный знак оболочки, поэтому его нужно заключить в кавычки), вы также можете использовать :

 curl -H 'Accept: application/json' ipinfo.io/json 

или же:

 wget --tries=1 --header='Accept: application/json' --timeout=10 -qO- http://ipinfo.io/json 

Который вы могли бы jq -r '.ip, .country' в jq -r '.ip, .country' :

 { read -r ip; read -r country; } < <( curl -H 'Accept: application/json' ipinfo.io/json | jq -r '.ip, .country' ) 
 info_ip=`wget --tries=1 --timeout=10 -qO- http://ipinfo.io/?callback=callback; echo` IFS=$'\n' IP_country=( $(awk -F'[:"]' '/ip/ || /country/{ print $5}' <<<"$info_ip") ) ip=${IP_country[0]} country=${IP_country[1]} echo $ip echo $country