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にはシェルが特別に処理するその他の文字を?
含めることができるため、コマンドラインから常に引用する必要があります。&
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/')"