Как распечатать определенные c объектные ключи с помощью jq? - PullRequest
1 голос
/ 19 июня 2020

Я хочу сделать очень простую вещь, используя 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 , которую я написал ранее.

1 Ответ

2 голосов
/ 19 июня 2020

Вам не нужно повторять код. Вы можете указать jq сохранять только те поля, которые вам нужны. Оператор обновления присваивания |= изменяет объект слева от него, воссоздавая его с полями справа. В нашем случае обновляйте только те, которые вам нужны.

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

вариант 1 - jq play

или вариант 2, если вы не хотите печатать имена явно используйте заполнитель, например

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

вариант 2 - jq play

...