使用 Azure CLI 和 JMESPath 进行筛选

Filtering with Azure CLI and JMESPath

我正在使用 Azure CLI 获取 vnet 对等互连列表:az network vnet peering list。这个returnsjson结构如下:

[
  {
    ...
    "name": "prefix1-name",
    ...
  },
  {
    ...
    "name": "prefix2-name",
    ...
  }
]

我正在尝试按以某个前缀开头的名称过滤结果。我尝试了以下各种组合: az network vnet peering list --resource-group my-rg --vnet-name my-vnet --query "[?starts_with(name,'prefix1-')].{name}" 但是,这总是失败并显示 ].{name} was unexpected at this time.

之类的消息

我错过了什么?

尝试使用az network vnet peering list --resource-group my-rg --vnet-name my-vnet --query "[?starts_with(name,'prefix1-')].name"。您不需要在 name 中包含 {}。这对我有用。

编辑

对于错误消息,我可以在 windows 10 机器的本地 PowerShell 中使用这些 Azure CLI 命令重现它。但是这个并没有出现在我的本地Linux Bash Shell如上面的截图。此错误也不会出现在 PowerShell 和 Azure 云 shell.

中的 Bash

经我验证,它看起来像是本地 PowerShell 上的特定场景。当你用 JMESPath 过滤时,我只是试过函数 starts_withcontains 需要函数之间的 space,它的工作原理如下:

--query "[?starts_with(name, 'vnet')].name" --query "[?starts_with (name,'vnet')].name" --query "[?starts_with(name,'vnet') ].name" --query "[?starts_with(name,'vnet')] .name"

但这不起作用,如下所示。

--query "[?starts_with(name,'vnet')].name"

答案显然是在 )] 之间放置一个 space,所以 az network vnet peering list --resource-group my-rg --vnet-name my-vnet --query "[?starts_with(name,'prefix1-') ].name 对我有用。不知道为什么,也没有找到任何提及此类内容的文档。如果我删除 space 我会收到 ].name was unexpected at this time 消息。

这是一个 Windows PowerShell 问题:https://github.com/Azure/azure-cli/blob/dev/doc/use_cli_effectively.md#argument-parsing-issue-in-powershell。要解决此问题,请在 az 之后插入 --% 以强制 PowerShell 将该行中的剩余字符视为文字。