jqコマンドを使用して、STDINで2つの異なるJSON文字列をマージしようとしています(ファイルではなくパイプを使用)。試したコマンドは次のとおりです。
curl ipinfo.io api.ipify.org/?format=json 2>/dev/null | jq -s
出力:
[
{
"ip": "139.162.244.103",
"hostname": "businessproservices.com",
"city": "London",
"region": "England",
"country": "GB",
"loc": "51.5142,-0.0931",
"postal": "EC2V",
"org": "AS63949 Linode, LLC"
},
{
"ip": "139.162.244.103"
}
]
予想出力:
{
"ip": "139.162.244.103",
"hostname": "businessproservices.com",
"city": "London",
"region": "England",
"country": "GB",
"loc": "51.5142,-0.0931",
"postal": "EC2V",
"org": "AS63949 Linode, LLC"
}
ベストアンサー1
コマンドcurl
は2つのホストを照会します。それぞれはJSONドキュメントを返します。 jq -s
これを配列の2つの項目として一緒に追加します。最初の項目(たとえば、期待される出力としてレンダリングするなど)を取得するには、次のように要求first
(または.[0]
)します。jq
curl -s ipinfo.io 'api.ipify.org/?format=json' | jq -s 'first'
または、最初から最初のホストを使用します。
curl ipinfo.io
実際にマージこれら2つの文書は、返されたリストにjq
コマンドを適用します。add
curl -s ipinfo.io 'api.ipify.org/?format=json' | jq -s 'add'
JSONオブジェクトには同じ名前の複数のキーを含めることはできないため、後続のすべてのキーは変える同等の古いキーを使用して文書jq -s
を
[
{
"ip": "139.162.244.103",
"hostname": "businessproservices.com",
"city": "London",
"region": "England",
"country": "GB",
"loc": "51.5142,-0.0931",
"postal": "EC2V",
"org": "AS63949 Linode, LLC"
},
{
"ip": "39.62.44.1",
"country": "UK"
}
]
その後、これは次にマージされます。
{
"ip": "39.62.44.1",
"hostname": "businessproservices.com",
"city": "London",
"region": "England",
"country": "UK",
"loc": "51.5142,-0.0931",
"postal": "EC2V",
"org": "AS63949 Linode, LLC"
}
jq -s add
代わりに使用する場合jq -s
。