Extrai dados para string do json no bash [duplicate]

0

Como posso extrair o endereço IP e o país e colocá-los individualmente em uma string sem quaisquer aspas ou quaisquer outros caracteres que estejam presentes no texto usando o próximo comando:

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

Agora estou procurando filtrar os dados para ip e país

$ ip =?

$ country =?

ipinfo.io atualmente retorna algo como:

/**/ 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"
});
    
por John Doe 07.09.2018 / 10:54

3 respostas

3

Outra abordagem.

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

Como Stéphane Chazelas apontou, isso se comportaria mal se "ip" ou "country" fossem vistos em outras partes da saída. Uma solução mais robusta:

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

Talvez algo como:

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}"
       }'
)

Para um shell com suporte a JSON incorporado, consulte ksh93v (atualmente em beta):

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

Observe que, em vez de ?callback query (btw, ? é um caractere curinga de shell, portanto, precisa ser citado), você também pode usar :

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

ou:

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

Que você poderia canalizar para jq -r '.ip, .country' :

{ read -r ip; read -r country; } < <(
  curl -H 'Accept: application/json' ipinfo.io/json |
  jq -r '.ip, .country'
)
    
por 07.09.2018 / 11:05
1
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
    
por 07.09.2018 / 11:10

Tags