首页 > 解决方案 > 当键包含连字符/破折号时,如何使用 Bash 上的 JMESPath 查询按值过滤 Azure CLI 输出?

问题描述

结果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']"

标签: bashazure-clijmespath

解决方案


解决方案是使用

  • \"JSON 对象(在本例中为 for )的转义双引号( )file-encoding
  • JSON 对象值的单引号(在本例中为 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.


推荐阅读