首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jq基于另一个值的子字符串构建父键?

如何使用jq基于另一个值的子字符串构建父键?
EN

Stack Overflow用户
提问于 2020-07-28 14:30:13
回答 1查看 86关注 0票数 1

我正在重新构建一个JSON文件,其中的基本内容是API调用的输出。从原始输出中,我目前正在提取对我想要的格式感兴趣的字段,除了激发这个问题的一个小细节。

具体来说,我的输入来自aws rds describe-db-instances命令的输出,并包含多个RDS实例的信息。以两个实例为例,如下所示:

代码语言:javascript
复制
{
"DBInstances": [
    {
        "DBInstanceIdentifier": "db1-name",
        "DBInstanceClass": "db.m5.xlarge",
        "Engine": "oracle-ee",
        "DBInstanceStatus": "available",
        "MasterUsername": "user",
        "DBName": "RANDOM",
        "Endpoint": {
            "Address": "some-endpoint.rds.amazonaws.com",
            "Port": 5698,
            "HostedZoneId": "GHDSFHFSDHSDH"
        },
        "AllocatedStorage": 4000,
        "InstanceCreateTime": "2018-07-23T23:21:42.361000+00:00",
        "PreferredBackupWindow": "09:30-07:00",
        "BackupRetentionPeriod": 14,
        "DBSecurityGroups": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-xxxxxxxxxxxxxxxxx",
                "Status": "active"
            },
            {
                "VpcSecurityGroupId": "sg-xxxxxxxxxxxxxxxxx",
                "Status": "active"
            }
        ],
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "DB1-parameter",
                "ParameterApplyStatus": "in-sync"
            }
        ],
        "AvailabilityZone": "ZONE1",
        "DBSubnetGroup": {
            "DBSubnetGroupName": "dbsubnetgroup-1",
            "DBSubnetGroupDescription": "dbsubnetgroup-1",
            "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
            "SubnetGroupStatus": "Complete",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-xxxxxxxxxxxxxxxxx",
                    "SubnetAvailabilityZone": {
                        "Name": "az1"
                    },
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-xxxxxxxxxxxxxxxxx",
                    "SubnetAvailabilityZone": {
                        "Name": "az2"
                    },
                    "SubnetStatus": "Active"
                }
            ]
        },
        "PreferredMaintenanceWindow": "sat:07:00-sat:07:30",
        "PendingModifiedValues": {},
        "LatestRestorableTime": "2020-03-27T18:54:25+00:00",
        "MultiAZ": false,
        "EngineVersion": "X.X.X",
        "AutoMinorVersionUpgrade": false,
        "ReadReplicaDBInstanceIdentifiers": [],
        "LicenseModel": "bring-your-own-license",
        "Iops": 5000,
        "OptionGroupMemberships": [
            {
                "OptionGroupName": "optiongroupName",
                "Status": "in-sync"
            }
        ],
        "CharacterSetName": "WE8ISO8859P15",
        "PubliclyAccessible": false,
        "StorageType": "io1",
        "DbInstancePort": 0,
        "StorageEncrypted": true,
        "KmsKeyId": "someKey",
        "DbiResourceId": "db-xxxxxxxxxxxxxxxxxxxxxxxxx",
        "CACertificateIdentifier": "rds-ca-2019",
        "DomainMemberships": [],
        "CopyTagsToSnapshot": true,
        "MonitoringInterval": 0,
        "DBInstanceArn": "someARN",
        "IAMDatabaseAuthenticationEnabled": false,
        "PerformanceInsightsEnabled": false,
        "DeletionProtection": false,
        "AssociatedRoles": []
    },
    {
        "DBInstanceIdentifier": "db2-name",
        "DBInstanceClass": "db.m5.large",
        "Engine": "oracle-ee",
        "DBInstanceStatus": "available",
        "MasterUsername": "user2",
        "DBName": "XXXX",
        "Endpoint": {
            "Address": "endpoint2.rds.amazonaws.com",
            "Port": 8974,
            "HostedZoneId": "FASDFDS54FSA"
        },
        "AllocatedStorage": 100,
        "InstanceCreateTime": "2020-04-23T21:38:53.023000+00:00",
        "PreferredBackupWindow": "01:00-05:30",
        "BackupRetentionPeriod": 35,
        "DBSecurityGroups": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-xxxxxxxxxxxxxxxxx",
                "Status": "active"
            }
        ],
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "default",
                "ParameterApplyStatus": "in-sync"
            }
        ],
        "AvailabilityZone": "AZ-2",
        "DBSubnetGroup": {
            "DBSubnetGroupName": "subnet-group",
            "DBSubnetGroupDescription": "",
            "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
            "SubnetGroupStatus": "Complete",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-xxxxxxxxxxxxxxxxx",
                    "SubnetAvailabilityZone": {
                        "Name": "AZ-1"
                    },
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-xxxxxxxxxxxxxxxxx",
                    "SubnetAvailabilityZone": {
                        "Name": "AZ-2"
                    },
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-xxxxxxxxxxxxxxxxx",
                    "SubnetAvailabilityZone": {
                        "Name": "AZ-3"
                    },
                    "SubnetStatus": "Active"
                }
            ]
        },
        "PreferredMaintenanceWindow": "sun:08:39-sun:09:09",
        "PendingModifiedValues": {},
        "LatestRestorableTime": "2020-07-27T18:53:18+00:00",
        "MultiAZ": false,
        "EngineVersion": "X.X.X",
        "AutoMinorVersionUpgrade": false,
        "ReadReplicaDBInstanceIdentifiers": [],
        "LicenseModel": "bring-your-own-license",
        "Iops": 2000,
        "OptionGroupMemberships": [
            {
                "OptionGroupName": "optiongroup-name",
                "Status": "in-sync"
            }
        ],
        "CharacterSetName": "AL32UTF8",
        "PubliclyAccessible": false,
        "StorageType": "io1",
        "DbInstancePort": 0,
        "StorageEncrypted": true,
        "KmsKeyId": "someARN",
        "DbiResourceId": "db-xxxxxxxxxxxxxxxxx",
        "CACertificateIdentifier": "rds-ca-2019",
        "DomainMemberships": [],
        "CopyTagsToSnapshot": false,
        "MonitoringInterval": 0,
        "DBInstanceArn": "someARN",
        "IAMDatabaseAuthenticationEnabled": false,
        "PerformanceInsightsEnabled": false,
        "DeletionProtection": false,
        "AssociatedRoles": []
    }
]

}

这是我目前的输出:

代码语言:javascript
复制
[
  {
    "DBInstancePrefix": {
      "DBInstanceClass": "db.m5.xlarge",
      "DBInstanceIdentifier": "db1-name",
      "DBName": "RANDOM",
      "DBParameterGroupName": "DB1-parameter",
      "DBSubnetGroupName": "dbsubnetgroup-1",
      "KmsKeyId": "someKey",
      "OptionGroupName": "optiongroupName",
      "VpcSecurityGroupIds": [
        "sg-xxxxxxxxxxxxxxxxx",
        "sg-xxxxxxxxxxxxxxxxx"
      ]
    }
  },
  {
    "DBInstancePrefix": {
      "DBInstanceClass": "db.m5.large",
      "DBInstanceIdentifier": "db2-name",
      "DBName": "XXXX",
      "DBParameterGroupName": "default",
      "DBSubnetGroupName": "subnet-group",
      "KmsKeyId": "someARN",
      "OptionGroupName": "optiongroup-name",
      "VpcSecurityGroupIds": [
        "sg-xxxxxxxxxxxxxxxxx"
      ]
    }
  }
]

这是我目前的JQ过滤器:

代码语言:javascript
复制
. | [.[] | map(.) | .[] | {DBInstancePrefix: {DBInstanceClass: .DBInstanceClass, DBInstanceIdentifier: .DBInstanceIdentifier, DBName: .DBName, DBParameterGroupName:.DBParameterGroups[].DBParameterGroupName, DBSubnetGroupName: .DBSubnetGroup.DBSubnetGroupName, KmsKeyId:.KmsKeyId, OptionGroupName: .OptionGroupMemberships[].OptionGroupName, VpcSecurityGroupIds: [.VpcSecurityGroups | .[] | .VpcSecurityGroupId] }}] 

您可以在jqplay.org上的这个片段上验证它。

我需要的是基于"DBInstanceIdentifier“键中的子字符串来转换父键"DBInstancePrefix”动态。因此,对于我编写的示例名称,应该是:

“db1-名称”>>> "db1“”db2-名称“”>>>“db2

所以,我想要的输出是:

代码语言:javascript
复制
[
  {
    "db1": {
      "DBInstanceClass": "db.m5.xlarge",
      "DBInstanceIdentifier": "db1-name",
      "DBName": "RANDOM",
      "DBParameterGroupName": "DB1-parameter",
      "DBSubnetGroupName": "dbsubnetgroup-1",
      "KmsKeyId": "someKey",
      "OptionGroupName": "optiongroupName",
      "VpcSecurityGroupIds": [
        "sg-xxxxxxxxxxxxxxxxx",
        "sg-xxxxxxxxxxxxxxxxx"
      ]
    }
  },
  {
    "db2": {
      "DBInstanceClass": "db.m5.large",
      "DBInstanceIdentifier": "db2-name",
      "DBName": "XXXX",
      "DBParameterGroupName": "default",
      "DBSubnetGroupName": "subnet-group",
      "KmsKeyId": "someARN",
      "OptionGroupName": "optiongroup-name",
      "VpcSecurityGroupIds": [
        "sg-xxxxxxxxxxxxxxxxx"
      ]
    }
  }
]

有什么想法或建议吗?感谢您的阅读。

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 20:50:08

我走了很长的路,因为我无法在相同的过滤器上解析它,我又做了一个,它接受了第一个过滤器的输出,从而达到了预期的结果。但与选择的答案相比,这是很糟糕的。

基于尼安 回答,我做了一个小的修改,因为我的实际DBInstanceIdentifier值有以下格式:<name>-db-<environment>和I需要DBInstancePrefix变成<name>-db

所以,我的最后一个过滤器是:

代码语言:javascript
复制
.DBInstances |
map
(      
  {        
    ( .DBInstanceIdentifier|split("-")[0:2] | join("-") ): {
      DBInstanceClass,
      DBInstanceIdentifier,
      DBName,
      DBParameterGroupName:.DBParameterGroups[].DBParameterGroupName,
      DBSubnetGroupName: .DBSubnetGroup.DBSubnetGroupName,
      KmsKeyId,
      OptionGroupName: .OptionGroupMemberships[].OptionGroupName,
      VpcSecurityGroupIds: [.VpcSecurityGroups[] | .VpcSecurityGroupId ]        
      }     
  } 
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63136507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档