jq를 사용하여 JSON에서 일치하는 모든 값의 상위를 가져옵니다.

jq를 사용하여 JSON에서 일치하는 모든 값의 상위를 가져옵니다.

저는 jq를 처음 접했고 json 파일에서 일치하는 값의 상위(특정 수준)를 가져와야 하는 시나리오가 있습니다. 아래는 샘플 데이터입니다.

{
    "DevOps": {
        "us-east-1": {
            "i-049aa9a3bddb4****": {
                "AmiLaunchIndex": 0,
                "ImageId": "ami-00068cd7555f543d5",
                "InstanceId": "i-049aa9a3bddb4*****",
                "InstanceType": "t2.nano",
                "LaunchTime": "2019-11-24 18:39:25+00:00",
                "Monitoring": {
                    "State": "disabled"
                },
                "Placement": {
                    "AvailabilityZone": "us-east-1a",
                    "GroupName": "",
                    "Tenancy": "default"
                },
                "PrivateDnsName": "ip-10-250-128-77.ec2.internal",
                "PrivateIpAddress": "10.250.128.77",
                "ProductCodes": [],
                "PublicDnsName": "",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "Network-Test-Host"
                    }
                ],

            },
            "i-0368117434*****": {
                "AmiLaunchIndex": 0,
                "ImageId": "ami-078137ecf12552edf",
                "InstanceId": "i-0368117434******",
                "InstanceType": "c5.2xlarge",
                "KeyName": "infra-systems-prod-key",
                "LaunchTime": "2020-02-13 15:51:15+00:00",
                "Monitoring": {
                    "State": "disabled"
                },
                "Placement": {
                    "AvailabilityZone": "us-east-1a",
                    "GroupName": "",
                    "Tenancy": "default"
                },
                "PrivateDnsName": "ip-10-250-138-161.ec2.internal",
                "PrivateIpAddress": "10.250.138.161",
                "ProductCodes": [],
                "PublicDnsName": "",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "Network-Test-Host"
                    }
                ],

            },
        }
    }
}

예를 들어 검색 값이 "10.250.128.77"인 경우 "i-049aa9a3bddb4****"라는 상위 항목을 가져와야 합니다. 값이 "Network-Test-Host"이면 2개의 인스턴스 ID(i-049aa9a3bddb4****, i-0368117434*****) 목록이 제공됩니다. 그런 다음 이 시점부터 모든 키를 반복하여 호스트 이름, ImageId, 인스턴스 유형과 같은 해당 값을 얻을 수 있습니다.

이에 대한 도움을 주시면 대단히 감사하겠습니다.

답변1

특정 개인 IP 주소를 사용한 쿼리:

jq '.DevOps."us-east-1" | map_values(select( .PrivateIpAddress == "10.250.128.77" ))' file

명령줄 매개변수에서 쿼리 IP 주소를 가져오기 위한 매개변수화:

jq --arg addr 10.250.128.77 \
    '.DevOps."us-east-1" | map_values(select( .PrivateIpAddress == $addr ))' file

Key특정 태그를 사용한 쿼리 Value:

jq '.DevOps."us-east-1" | map_values(select( IN(.Tags[]; {Key: "Name", Value: "Network-Test-Host"}) ))' file

명령줄 인수에서 합계를 얻으려면 매개변수화하세요 Key.Value

jq --arg Key Name --arg Value Network-Test-Host \
    '.DevOps."us-east-1" | map_values(select( IN(.Tags[]; $ARGS.named) ))' file

.DevOps."us-east-1"이 명령은 쿼리와 일치하는 입력 문서 부분의 키+값을 포함하는 단일 개체를 포함하는 JSON 문서를 생성합니다 .

각 명령의 공통점은 select()섹션의 값에 명령문을 적용한다는 것입니다 .DevOps."us-east-1". 부울 표현식은 쿼리로 테스트하려는 섹션에 따라 달라집니다. 부울 표현식으로 평가되는 부분진짜다른 모든 비트는 삭제되는 동안 유지됩니다.

관련 정보