![다른 필드가 true인 JSON 개체의 특정 필드를 가져오는 방법](https://linux55.com/image/209711/%EB%8B%A4%EB%A5%B8%20%ED%95%84%EB%93%9C%EA%B0%80%20true%EC%9D%B8%20JSON%20%EA%B0%9C%EC%B2%B4%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%ED%95%84%EB%93%9C%EB%A5%BC%20%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
아래 명령에서 특정 정보를 얻고 싶습니다.
[root@test opc]# /bin/oci compute instance list-vnics --instance-id ocid1.instance.oc1.ap-mumbai-1.anrg6ljrkfvuezyc6w4ytv75l55nscz7gg7rwzg55twubrza2uz4j7kzu66a
출력은 다음과 같습니다
{
"data": [
{
"availability-domain": "ucJX:AP-MUMBAI-1-AD-1",
"compartment-id": "ocid1.tenancy.oc1..aaaaaaaaqtzldjhvlvbaoheda67fuwkaldini7h6txiglp7yrx2nc4pm3nka",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "oracleidentitycloudservice/[email protected]",
"CreatedOn": "2022-08-23T12:08:39.326Z"
}
},
"display-name": "xx",
"freeform-tags": {},
"hostname-label": null,
"id": "ocid1.vnic.oc1.ap-mumbai-1.abrg6ljrdvonadtpflqh2zqd5f4i6nuhppq2pzdvuvr75w4mz6mvy7hdhuia",
"is-primary": false,
"lifecycle-state": "AVAILABLE",
"mac-address": "02:00:17:02:F1:53",
"nsg-ids": [],
"private-ip": "100.10.10.227",
"public-ip": null,
"skip-source-dest-check": false,
"subnet-id": "ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaaa2s7zfva3efszqdlacsel7pg2doxcc5yhqt4xt25jrzah5e6ntbq",
"time-created": "2022-08-23T12:08:41.807000+00:00",
"vlan-id": null
},
{
"availability-domain": "ucJX:AP-MUMBAI-1-AD-1",
"compartment-id": "ocid1.tenancy.oc1..aaaaaaaaqtzldjhvlvbaoheda67fuwkaldini7h6txiglp7yrx2nc4pm3nka",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "oracleidentitycloudservice/[email protected]",
"CreatedOn": "2022-08-21T16:40:37.685Z"
}
},
"display-name": "test",
"freeform-tags": {},
"hostname-label": "test",
"id": "ocid1.vnic.oc1.ap-mumbai-1.abrg6ljriaxzes5wtacij7lwhcihv72sva3s5od5ngo6i4v6kv4d6zamypza",
"is-primary": true,
"lifecycle-state": "AVAILABLE",
"mac-address": "02:00:17:01:DE:74",
"nsg-ids": [
"ocid1.networksecuritygroup.oc1.ap-mumbai-1.aaaaaaaadfnpmigo5wnx6ybvjwqziabtzqtgabhsnkbsnv7qjp3euk5jpwva"
],
"private-ip": "100.10.10.214",
"public-ip": "140.238.162.238",
"skip-source-dest-check": false,
"subnet-id": "ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaaa2s7zfva3efszqdlacsel7pg2doxcc5yhqt4xt25jrzah5e6ntbq",
"time-created": "2022-08-21T16:40:41.532000+00:00",
"vlan-id": null
},
{
"availability-domain": "ucJX:AP-MUMBAI-1-AD-1",
"compartment-id": "ocid1.tenancy.oc1..aaaaaaaaqtzldjhvlvbaoheda67fuwkaldini7h6txiglp7yrx2nc4pm3nka",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "oracleidentitycloudservice/[email protected]",
"CreatedOn": "2022-08-23T12:19:59.985Z"
}
},
"display-name": "yy",
"freeform-tags": {},
"hostname-label": null,
"id": "ocid1.vnic.oc1.ap-mumbai-1.abrg6ljrllmihlbt4rlhsag5jr6hewpofg6fzodmkbqnsdjqdmccyvcetpaa",
"is-primary": false,
"lifecycle-state": "AVAILABLE",
"mac-address": "02:00:17:01:B1:78",
"nsg-ids": [],
"private-ip": "100.10.10.43",
"public-ip": null,
"skip-source-dest-check": false,
"subnet-id": "ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaaa2s7zfva3efszqdlacsel7pg2doxcc5yhqt4xt25jrzah5e6ntbq",
"time-created": "2022-08-23T12:20:03.295000+00:00",
"vlan-id": null
}
]
}
해당 부분의 특정 ID "is-primary": true,
값을
id
private-ip
위의 경우 출력은 다음과 같아야 합니다.
100.10.10.214
ocid1.vnic.oc1.ap-mumbai-1.abrg6ljriaxzes5wtacij7lwhcihv72sva3s5od5ngo6i4v6kv4d6zamypza
이 상황에서 누구든지 나를 도와줄 수 있나요? 감사해요:)
답변1
jq
JSON 개체에서 데이터를 추출하는 데 사용할 수 있는 여러 도구 중 하나입니다.
- JSON 출력:
$ jq '.data[] | select(."is-primary") | [.id, ."private-ip"]' file.json
[
"ocid1.vnic.oc1.ap-mumbai-1.abrg6ljriaxzes5wtacij7lwhcihv72sva3s5od5ngo6i4v6kv4d6zamypza",
"100.10.10.214"
]
- .csv 출력:
$ jq -r '.data[] | select(."is-primary") | [.id, ."private-ip"] | @csv' file.json
"ocid1.vnic.oc1.ap-mumbai-1.abrg6ljriaxzes5wtacij7lwhcihv72sva3s5od5ngo6i4v6kv4d6zamypza","100.10.10.214"
- 별도의 줄에:
$ jq -r '.data[] | select(."is-primary") | [.id, ."private-ip"] | join("\n")' file.json
ocid1.vnic.oc1.ap-mumbai-1.abrg6ljriaxzes5wtacij7lwhcihv72sva3s5od5ngo6i4v6kv4d6zamypza
100.10.10.214
1 기술적으로 여러 객체가 true인 경우 is-primary
각 객체에 대해 하나의 json 배열을 연결하게 되며 jq
전체 표현식을 [...]
래퍼로 래핑하여 얻을 수 있습니다.하나json 출력은 배열로 구성됩니다.