【问题标题】:How to print specific object keys using jq?如何使用 jq 打印特定的对象键?
【发布时间】:2020-06-19 10:02:09
【问题描述】:

我想用 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,
  }
}

选项 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 命令中。

【问题讨论】:

  • 答案解决了你的问题吗?
  • 不,我需要完整的命令。您的答案有效,但在我编写的完整 jq 命令中不起作用。
  • 什么意思?您发布的示例 JSON 不包含 DomainStatus。包括它,我会更新我的答案
  • 完整的命令是 jq '.ElasticsearchClusterConfig |= {InstanceType, InstanceCount}'。这就是整个命令。考虑到您提供的输入 json,您还想要什么?
  • 天啊!对不起。我更新了问题并包含了完整的 JSON。

标签: json select key jq


【解决方案1】:

您不必重复任何代码。您可以指示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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多