jq 명령을 사용하여 STDIN에서 두 개의 서로 다른 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
은 두 개의 호스트를 쿼리합니다. 각각은 JSON 문서를 반환합니다. jq -s
이를 배열의 두 항목으로 함께 추가합니다. 첫 번째 항목(예: 예상 출력으로 렌더링하는 것)을 얻으려면 다음 에서 요청 first
(또는 .[0]
) 하면 됩니다.jq
curl -s ipinfo.io 'api.ipify.org/?format=json' | jq -s 'first'
또는 처음부터 첫 번째 호스트를 사용하십시오.
curl ipinfo.io
실제로병합이 두 문서는 반환된 목록에 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
.
답변2
echo '
[
{
"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": "127.0.0.1",
"country": "UK",
"additional": "added Value"
}
]' | jq "add"
결과
{
"ip": "127.0.0.1",
"hostname": "businessproservices.com",
"city": "London",
"region": "England",
"country": "UK",
"loc": "51.5142,-0.0931",
"postal": "EC2V",
"org": "AS63949 Linode, LLC",
"additional": "added Value"
}```