bash에서 json에서 문자열로 데이터 추출

bash에서 json에서 문자열로 데이터 추출

다음 명령을 사용하여 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"
});

답변1

또 다른 방법.

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

Stéphane Chazelas가 지적했듯이 출력의 다른 곳에 "ip" 또는 "country"가 표시되면 이는 제대로 작동하지 않습니다. 더욱 강력한 솔루션:

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

답변2

어쩌면 다음과 같은 것일 수도 있습니다.

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'.

{ read -r ip; read -r country; } < <(
  curl -H 'Accept: application/json' ipinfo.io/json |
  jq -r '.ip, .country'
)

답변3

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

관련 정보