使用 sed 解析curl响应

使用 sed 解析curl响应

我尝试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顶级键关联的值。ipcurl

然后您可以使用它来拨打其他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/')"

相关内容