Bash

使用 sed 解析 curl 響應

  • May 7, 2020

我正在嘗試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帶有正則表達式的命令傳遞結果。

我會使用命令替換而不是管道。在 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/')"
curl 'https://api.ipify.org?format=json' | jq -r '.ip'

這將用於從 .json 中提取與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 上的Homebrew獲得。


或者,您可以,正如 pLumo 在評論中所建議的那樣,只是不要從以下位置請求 JSON 格式的響應api.ipfy.org

ipaddr=( curl 'https://api.ipify.org' )
curl "http://my.api.com?query=$ipaddr"

引用自:https://unix.stackexchange.com/questions/585096