从curl响应中Grep两个字符串,将它们输出到同一行的文件中

从curl响应中Grep两个字符串,将它们输出到同一行的文件中

我想自动化一个流程。

我有一个要在curl 请求中使用的IP 地址列表:

curl http://api.geoiplookup.net/?query=($ip)

从curl的输出中,我想获取城市并将一行写入格式为 的文本文件IP_address:city

为了 grep 城市,我发现了这个(谷歌示例):

curl http://api.geoiplookup.net/?query=216.58.198.206 | grep -oP '(?<=\<city\>).*(?=\<\/city\>)'

为了使我所做的过程自动化(但需要改进^^):

for ip in $(cat essai); do curl http://api.geoiplookup.net/?query=$ip & done

当我尝试添加grep命令时,它不显示城市并给出错误。

多谢。

答案1

首先,始终引用命令行上给出的 URL。某些 URL 可能包含字符&,该字符将被 shell 解释为您想要启动后台作业。某些 URL(如您所显示的 URL)包含文件名通配字符,并且某些 shell(根据其配置)将尝试将它们与当前目录中的文件进行匹配,如果不匹配,则可能会失败并出现错误:

$ curl http://api.geoiplookup.net/?query=216.58.198.206
zsh: no matches found: http://api.geoiplookup.net/?query=216.58.198.206

要从响应中的 XML 文档中解析出 IP 地址和城市,请使用xmlstarlet

$ curl -s "http://api.geoiplookup.net/?query=$ipaddr" | xmlstarlet sel -t -m '//result' -v 'concat(host, ":", city)' -nl
216.58.198.206:Mountain View

循环遍历文件中的所有 IP 地址essai,假设每行有一个地址:

while IFS= read -r ipaddr; do
    curl -s "http://api.geoiplookup.net/?query=$ipaddr" |
    xmlstarlet sel -t -m '//result' -v 'concat(host, ":", city)' -nl
done <essai

相关内容