如何使用jq打印特定的对象键?

时间:2020-06-19 10:02:09

标签: json select key jq

我想使用 jq 做一件非常简单的事情,我不能。

对象是:

{
  "DomainStatus": {
    "DomainId": "12345",
    "DomainName": "test",
    "ARN": "arn:aws:es:eu-west-1:12345:domain/test",
    "Created": true,
    "Deleted": false,
    "Endpoint": "test.com",
    "Processing": false,
    "UpgradeProcessing": false,
    "ElasticsearchVersion": "5.3",
    "ElasticsearchClusterConfig": {
      "InstanceType": "t2.medium.elasticsearch",
      "InstanceCount": 2,
      "DedicatedMasterEnabled": false,
      "ZoneAwarenessEnabled": true,
      "ZoneAwarenessConfig": {
        "AvailabilityZoneCount": 2
      }
    },
    "EBSOptions": {
      "EBSEnabled": true,
      "VolumeType": "gp2",
      "VolumeSize": 30
    },
... more fields ...
  }
}

我想要这些选项中的任何一个:

选项1:

{
  "DomainName": "test",
  "Endpoint": "test.com",
  "ElasticsearchClusterConfig": {
    "InstanceType": "t2.medium.elasticsearch",
    "InstanceCount": 2,
  }
}

OR

选项2:

{
  "DomainName": "test",
  "Endpoint": "test.com",
  "InstanceType": "t2.medium.elasticsearch",
  "InstanceCount": 2,
}

我使用以下方法实现了选项2:

jq '.DomainStatus | {DomainName, Endpoint, InstanceType: .ElasticsearchClusterConfig.InstanceType, InstanceCount: .ElasticsearchClusterConfig.InstanceCount}'

但是问题是我不想编写冗余代码

我不要此行:InstanceType: .ElasticsearchClusterConfig.InstanceType

它想要这样的东西:.ElasticsearchClusterConfig | {InstanceType, InstanceCount}位于我之前编写的 jq 命令中。

1 个答案:

答案 0 :(得分:2)

您不必重复任何代码。您可以指示jq仅保留所需的字段。 |=赋值更新运算符通过在其右侧的字段重新创建对象来修改其左侧的对象。在我们的情况下,仅更新所需的内容。

.DomainStatus | { 
    DomainName, 
    Endpoint, 
    ElasticsearchClusterConfig: (
       .ElasticsearchClusterConfig | { 
           InstanceType, 
           InstanceCount 
       }
    )
}

option 1 - jq play

或选项2,如果您不想显式输入名称,请使用占位符,例如

.DomainStatus | .ElasticsearchClusterConfig as $ec | { 
    DomainName, 
    Endpoint, 
    InstanceType:  $ec.InstanceType, 
    InstanceCount: $ec.InstanceCount
}

option 2 - jq play