我尝试curl
在 macOS 上使用以下命令调用 JSON API:
curl https://api.ipify.org?format=json
它返回类似这样的内容:
{"ip":"xxx.xxx.xxx.xxx"}
我想从这个响应中提取 IP 地址并curl
用它运行另一个命令。
curl https://api.ipify.org?format=json | curl http://my.api.com?query=<IP RESULT>
sed
我的一些失败的尝试涉及通过带有正则表达式的命令传输结果。
答案1
curl 'https://api.ipify.org?format=json' | jq -r '.ip'
这将用于从中提取与 JSON 响应中的jq
顶级键关联的值。ip
curl
然后您可以使用它来拨打其他curl
电话:
ipaddr=$( curl 'https://api.ipify.org?format=json' | jq -r '.ip' )
curl "http://my.api.com?query=$ipaddr"
另请注意,URL 应始终在命令行上加引号,因为它们可能包含?
和&
以及 shell 将特殊处理的其他字符。
jq
可以通过自制在 macOS 上。
或者,你可以,正如 pLumo 在评论中建议的那样,只是不要从 请求 JSON 格式的响应api.ipfy.org
:
ipaddr=( curl 'https://api.ipify.org' )
curl "http://my.api.com?query=$ipaddr"
答案2
我会使用命令替换而不是管道。在 Linux 机器上,我会使用:
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json | grep -oP 'ip":"\K[0-9.]+')"
在没有 GNU 工具的机器上(例如 macOS),可以使用以下之一:
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json | sed -E 's/.*ip":"([0-9.]+).*/\1/')"
甚至
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json 2>/dev/null | tr -d '"' | sed 's/.*ip:\([0-9.]*\).*/\1/')"