我想使用 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 命令中。
答案 0 :(得分:2)
您不必重复任何代码。您可以指示jq
仅保留所需的字段。 |=
赋值更新运算符通过在其右侧的字段重新创建对象来修改其左侧的对象。在我们的情况下,仅更新所需的内容。
.DomainStatus | {
DomainName,
Endpoint,
ElasticsearchClusterConfig: (
.ElasticsearchClusterConfig | {
InstanceType,
InstanceCount
}
)
}
或选项2,如果您不想显式输入名称,请使用占位符,例如
.DomainStatus | .ElasticsearchClusterConfig as $ec | {
DomainName,
Endpoint,
InstanceType: $ec.InstanceType,
InstanceCount: $ec.InstanceCount
}