Json 使用jq通过搜索子键/值对来选择父项
使用,如果父对象包含满足两个筛选要求的子对象,如何选择该父对象 在本例中,我想选择所有子网元素,这些子网元素都有一个带有键“Name”和值“TheName”的子标记。我的示例有两个子网。第一个在错误的键中有“TheName”。第二个子网具有我要查找的名称/值对。i、 e.Json 使用jq通过搜索子键/值对来选择父项,json,bash,select,jq,Json,Bash,Select,Jq,使用,如果父对象包含满足两个筛选要求的子对象,如何选择该父对象 在本例中,我想选择所有子网元素,这些子网元素都有一个带有键“Name”和值“TheName”的子标记。我的示例有两个子网。第一个在错误的键中有“TheName”。第二个子网具有我要查找的名称/值对。i、 e.“键”:“名称”、“值”:“名称” 下面选择一个子网,该子网在其中一个标记中具有指定值,但在标记对中没有指定值。它返回两个子网,而不是仅返回第二个子网 jq '.Subnets[] | select(.Tags[].Value=
“键”:“名称”、“值”:“名称”
下面选择一个子网,该子网在其中一个标记中具有指定值,但在标记对中没有指定值。它返回两个子网,而不是仅返回第二个子网
jq '.Subnets[] | select(.Tags[].Value=="TheName")' output
如何使用jq仅选择具有我要查找的名称/值对的子网
{
"Subnets": [
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567a",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "TheName"
},
{
"Key": "Name",
"Value": "NotTheName"
}
]
},
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567b",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "ignore"
},
{
"Key": "Name",
"Value": "TheName"
}
]
}
]
}
所需的输出将是:
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567b",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "ignore"
},
{
"Key": "Name",
"Value": "TheName"
}
]
}
.Subnets[]
| select( any (.Tags[]; .Key == "Name" and .Value == "TheName") )
假设您的jq有
any/2
,一个简单而有效的解决方案是:
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567b",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "ignore"
},
{
"Key": "Name",
"Value": "TheName"
}
]
}
.Subnets[]
| select( any (.Tags[]; .Key == "Name" and .Value == "TheName") )
这将生成您想要的输出,因此我不会在这里重复
如果您的jq没有任何/2
,我建议升级,但如果这不方便或不是一个选项,您可以使用此def:
def any(f;g): reduce f as $i (false; . or ($i|g));
p、 s.
any(str;cond)
可以理解为:“e | cond
流中是否有任何元素str,使得e | cond
的值不是null
或false
?”<
与大多数编写良好的Unix命令一样,
jq
可以读取一个文件名参数,因此这是一个了不起的峰值!我不明白“任何”上的文件。jq上的文档和示例不是非常清晰。它需要更多这样的例子。希望问题标题能帮助其他人找到你的答案!