MacOSで次のcurl
コマンドを使用してJSONAPIを呼び出そうとしています。
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'
これは、jq
を使用して、JSON応答のトップレベルのip
キーに関連付けられた値をcurl
から抽出します。
次に、これを使用して他のcurl
呼び出しを行うことができます。
ipaddr=$( curl 'https://api.ipify.org?format=json' | jq -r '.ip' )
curl "http://my.api.com?query=$ipaddr"
また、URLには、?
と&
、およびシェルが特別に処理するその他の文字が含まれている可能性があるため、コマンドラインで常に引用符で囲む必要があることにも注意してください。
jq
は、macOSでは Homebrew から入手できます。
または、 pLumoがコメントで示唆しているように 、api.ipfy.org
からJSON形式の応答を要求しないでください。
ipaddr=( curl 'https://api.ipify.org' )
curl "http://my.api.com?query=$ipaddr"