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

コマンドライン引数から合計を取得するには、パラメータ化してくださいKeyValue

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"。ブール式は、クエリでテストするセクションによって異なります。ブール式で評価される部分本物他のすべてのビットは消去中に保持されます。

関連情報