sedを使用したカール応答の解析

sedを使用したカール応答の解析

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

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/')"

関連情報