如何使用以下命令提取 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 支持的 shell,请参阅 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
查询(顺便说一句,?
是 shell 通配符,因此需要加引号),你也可以使用:
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