当键包含 hyphens/dashes 时,如何使用 Bash 上的 JMESPath 查询按值过滤 Azure CLI 输出?
How to filter Azure CLI outputs by value using JMESPath queries on Bash when keys contain hyphens/dashes?
az keyvault secret list --vault-name "lofa"
的结果类似于下面的列表(但每种类型的元素更多):
[
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/conn-string",
"tags": {
"file-encoding": "utf-8"
}
},
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/a-password",
"tags": null
},
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/another-password",
"tags": {
"testThis": "miez",
"what": "else"
}
}
]
首先尝试过滤“简单”目标(即 JSON 键不包含连字符的对象),它按预期工作:
$ az keyvault secret list --vault-name "lofa" --query "[? tags.testThis=='vmi']"
同样对 file-encoding
键无效(导致 invalid jmespath_type value
):
$ az keyvault secret list --vault-name "lofa" --query "[?tags.file-encoding=='utf-8']"
所以接下来尝试了单引号,但没有成功:
$ az keyvault secret list --vault-name "lofa" --query "[?tags.'file-encoding'=='utf-8']"
解决方案正在使用
- 转义双引号 (
\"
) for JSON object keys (在这种情况下,for file-encoding
), 和
- 单引号 for JSON object values(在本例中,for
utf-8
)
az keyvault secret list --vault-name "lofa" --query "[?tags.\"file-encoding\"=='utf-8']"
注意:不确定这是为什么,或者到底发生了什么,但是当尝试用转义双引号替换单引号以及值部分时,
az keyvault secret list --vault-name "lofa" --query "[?tags.\"file-encoding\"==\"utf-8\"]"
它生成了一个包含所有条目的列表 除了 那些 tags.file-encoding
.
如果您确实想要一个不会强制您转义任何引号的解决方案,您可以使用:
- 您的 shell 脚本参数的简单引号
az keyvault secret list --vault-name 'lofa' --query '[]'
- 为您的密钥加双引号,因为它包含破折号
az keyvault secret list --vault-name 'lofa' --query '[?tags."file-encoding"]'
- backticks for your literal、
utf-8
az keyvault secret list --vault-name 'lofa' --query '[?tags."file-encoding"==`utf-8`]'
az keyvault secret list --vault-name "lofa"
的结果类似于下面的列表(但每种类型的元素更多):
[
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/conn-string",
"tags": {
"file-encoding": "utf-8"
}
},
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/a-password",
"tags": null
},
{
"attributes": { ... },
"id": "https://lofa.vault.azure.net/secrets/another-password",
"tags": {
"testThis": "miez",
"what": "else"
}
}
]
首先尝试过滤“简单”目标(即 JSON 键不包含连字符的对象),它按预期工作:
$ az keyvault secret list --vault-name "lofa" --query "[? tags.testThis=='vmi']"
同样对 file-encoding
键无效(导致 invalid jmespath_type value
):
$ az keyvault secret list --vault-name "lofa" --query "[?tags.file-encoding=='utf-8']"
所以接下来尝试了单引号,但没有成功:
$ az keyvault secret list --vault-name "lofa" --query "[?tags.'file-encoding'=='utf-8']"
解决方案正在使用
- 转义双引号 (
\"
) for JSON object keys (在这种情况下,forfile-encoding
), 和 - 单引号 for JSON object values(在本例中,for
utf-8
)
az keyvault secret list --vault-name "lofa" --query "[?tags.\"file-encoding\"=='utf-8']"
注意:不确定这是为什么,或者到底发生了什么,但是当尝试用转义双引号替换单引号以及值部分时,
az keyvault secret list --vault-name "lofa" --query "[?tags.\"file-encoding\"==\"utf-8\"]"
它生成了一个包含所有条目的列表 除了 那些 tags.file-encoding
.
如果您确实想要一个不会强制您转义任何引号的解决方案,您可以使用:
- 您的 shell 脚本参数的简单引号
az keyvault secret list --vault-name 'lofa' --query '[]'
- 为您的密钥加双引号,因为它包含破折号
az keyvault secret list --vault-name 'lofa' --query '[?tags."file-encoding"]'
- backticks for your literal、
utf-8
az keyvault secret list --vault-name 'lofa' --query '[?tags."file-encoding"==`utf-8`]'