Azure CLI 使用查询来选择和修改 Azure CLI 命令的输出。 查询在客户端执行,并在 Azure CLI 命令返回的 JSON 对象上进行操作,然后再进行任何格式化显示。

查询中所需的转义字符因不同环境而异。 建议在 Azure Cloud Shell 或 cmd 中运行查询,因为这些 shell 需要更少的转义字符。 若要确保查询示例语法正确,请选择所使用的 shell 的选项卡。

字典和列出 CLI 结果

CLI 命令结果首先被视为查询的 JSON,即使输出格式不是 JSON。 CLI 结果为 JSON 数组或字典。 数组是可以编制索引的对象序列,字典是使用键访问的无序对象。

这是数组的示例:

这是字典的示例:

"isRunning": false, "time": "12:00", "number": 1

可以返回多个对象的命令返回数组,始终只返回单个对象的命令返回字典。

获取字典中的属性

使用字典结果时,只需使用键即可从顶级访问属性。 . 使用 ( subexpression ) 字符访问嵌套字典的属性。 在引入查询之前,请查看 az vm show 命令的未修改输出:

若要避免旧版 PowerShell 中可能存在的引用问题,请确保使用的是最新版本。 若要安装最新版本的 PowerShell,请参阅在 Windows、Linux 和 macOS 上安装 PowerShell

az vm show --resource-group QueryDemo --name TestVM
    "bootDiagnostics": {
      "enabled": true,
      "storageUri": "https://xxxxxx.blob.core.windows.net/"
  "osProfile": {
    "adminPassword": null,
    "adminUsername": "azureuser",
    "allowExtensionOperations": true,
    "computerName": "TestVM",
    "customData": null,
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "provisionVmAgent": true,
      "ssh": {
        "publicKeys": [
            "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
            "path": "/home/azureuser/.ssh/authorized_keys"
    "secrets": [],
    "windowsConfiguration": null

以下命令通过添加查询获取经授权连接到 VM 的 SSH 公钥:

"keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso", "path": "/home/azureuser/.ssh/authorized_keys"

查询字符串区分大小写。 例如,在之前的查询中,将“osProfile”更改为“OsProfile”,不会返回正确的结果。

获取多个值

若要获取多个属性,请将用逗号分隔的表达式放在方括号 [ ] 中( 多选列表)。 以下命令一次性获取 VM 名称、管理员用户和 SSH 密钥:

"TestVM", "azureuser", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"

这些值按查询中给出的顺序在结果数组中列出。 由于结果是数组,因此没有与结果关联的键。 若要获取字典而不是数组,请参阅下一部分。

重命名查询中的属性

若要在查询多个值时获取字典而不是数组,请使用 { }多选哈希) 运算符。 多选哈希的格式为 {displayName:JMESPathExpression, ...}displayName 是输出中显示的字符串,而 JMESPathExpression 是要计算的 JMESPath 表达式。 通过将多选列表更改为哈希,修改最后一节中的示例:

如果选择在新列名中使用空格,例如VM nameVMName,引用规则将在 Bash 和 PowerShell 中更改。 示例请参阅 在 Azure CLI 参数中传递空格

"VMName": "TestVM", "admin": "azureuser", "ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"

获取数组中的属性

数组本身没有属性,但可以为其编制索引。 这个功能在最后一个示例中以表达式 publicKeys[0] 的形式展示,它用于获取数组 publicKeys 的第一个元素。 没有保证 CLI 输出是有序的,因此请避免使用索引,除非您确定输出是有序的,或者不在意获取的是哪个元素。 若要访问数组中元素的属性,请执行以下两项作之一: 平展筛选。 本章节介绍如何平展数组。

使用 JMESPath 运算符 [] 展开数组。 运算符后 [] 的所有表达式都应用于当前数组中的每个元素。 如果 [] 在查询的开头出现,它会简化 CLI 命令结果。 可以使用此功能检查 az vm list 的结果。 以下查询获取资源组中每个 VM 的名称、OS 和管理员名称:

任何数组都可以被平展,而不仅仅是命令返回的顶级级结果。 在最后一节中,表达式 osProfile.linuxConfiguration.ssh.publicKeys[0].keyData 用于获取用于登录的 SSH 公钥。 若要获取 每个 SSH 公钥,表达式可以改为编写为 osProfile.linuxConfiguration.ssh.publicKeys[].keyData。 此查询表达式平展 osProfile.linuxConfiguration.ssh.publicKeys 数组,然后在 keyData 每个元素上运行表达式:

"admin": "azureuser", "sshKeys": [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"

使用布尔表达式筛选数组

用于从数组获取数据的另一个作是 筛选。 筛选是使用 JMESPath 运算符 [?...] 完成的。 此运算符采用谓词作为其内容。 谓词是可以计算为truefalse的任何语句(包括布尔属性)。 谓词计算结果为 true 的表达式将包含在输出中。

第一个查询演示如何列出与你的账户相连并且其isDefault属性为 true 的所有 Azure 订阅的名称。 第二个和第三个查询显示了列出其 isDefault 属性为 false 的所有订阅的两种不同的方法。

# Boolean values are assumed to be true, so you can directly evaluate the isDefault property to return the default subscription.
az account list --query "[?isDefault].name"
# To check if a Boolean property is false, you can use the comparison operator == or the logical operator !.
az account list --query '[?!isDefault].name'
az account list --query "[?isDefault == \`false\`].name"
# Boolean values are assumed to be true, so you can directly evaluate the isDefault property to return the default subscription.
az account list --query "[?isDefault].name"
# To check if a Boolean property is false, you can use the comparison operator == or the logical operator !.
az account list --query "[?!isDefault].name"
az account list --query "[?isDefault == ``false``].name"

请注意上一命令中值false周围的额外转义字符(`)。 存在这些额外的转义字符,因为 Azure CLI 命令被视为命令提示符脚本,因此需要考虑 PowerShell 和命令提示符分析。 如果 Azure CLI 在经过两轮分析后仍存在,则仅会收到一个符号。 有关 PowerShell 中的其他可能引用问题的详细信息,请参阅 有关在 PowerShell 脚本语言中运行 Azure CLI 的注意事项

REM Boolean values are assumed to be true, so you can directly evaluate the isDefault property to return the default subscription.
az account list --query "[?isDefault].name"
REM To check if a Boolean property is false, you can use the comparison operator == or the logical operator !.
az account list --query "[?!isDefault].name"
az account list --query "[?isDefault == `false`].name"

上面的示例仅在以交互方式使用命令提示符时有效。 若要使用命令提示符在批处理脚本中执行多个 az 命令,请在每个 az 命令前面加上前缀 call。 例如,请使用 call az account list 而不是 az account list

JMESPath 提供标准比较和逻辑运算符。 这些包括<<=>>===!=。 JMESPath 还支持逻辑和(&&)或(||),而不是(!)。 表达式可以在括号内分组,从而允许更复杂的谓词表达式。 有关谓词和逻辑操作的完整详细信息,请参阅 JMESPath 规范

在最后一节中,您展平数组以获取资源组中所有虚拟机的完整清单。 使用筛选器时,此输出只能限制为 Linux VM:

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=``50``].{Name:name,  admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table

请注意上一个命令中数字 50 周围的额外转义字符(`)。 存在这些额外的转义字符,因为 Azure CLI 命令被视为命令提示符脚本,因此需要考虑 PowerShell 和命令提示符分析。 如果 Azure CLI 在经过两轮分析后仍存在,则仅会收到一个符号。 有关 PowerShell 中的其他可能引用问题的详细信息,请参阅有关在 PowerShell 脚本语言中运行 Azure CLI 的注意事项

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=`50`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table

JMESPath 函数

JMESPath 还具有内置函数,可用于更复杂的查询和修改查询输出。 本部分重点介绍如何使用 JMESPath 函数创建查询,而 使用函数操作输出 部分演示了如何使用函数修改输出。

表达式是在调用函数之前计算的,因此参数本身可以是 JMESPath 表达式。 以下示例使用 contains(string, substring)此概念来演示此概念,该概念检查字符串是否包含子字符串。 此命令查找使用 SSD 存储的所有 VM 的 OS 磁盘:

有关函数的完整列表,请参阅 JMESPath 规范 - 内置函数

设置查询结果的格式

Azure CLI 使用 JSON 作为其默认输出格式,但不同的输出格式可能更适合查询,具体取决于其用途和结果。 查询始终先在 JSON 输出上运行,然后格式化。

本部分将介绍 tsvtable 设置格式以及每个格式的一些用例。 有关输出格式的详细信息,请参阅 Azure CLI 命令的输出格式

TSV 输出格式

tsv 输出格式返回以制表符和换行符分隔的值,并且没有多余的格式、键或其他符号。 当输出存储在参数中并在另一个命令中使用时,此格式非常有用。

格式设置的 tsv 一个用例是,从 CLI 命令(例如 Azure 资源 ID 或资源名称)中检索值,并将值存储在本地环境变量中。 默认情况下,结果以 JSON 格式返回,在处理用字符括起来 " 的 JSON 字符串时,这可能是个问题。 如果命令输出直接分配给环境变量, shell 可能无法解释 引号。 以下示例中显示了向环境变量分配查询结果的问题:

USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
$USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
FOR /f %i IN ('az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername"') DO SET USER=%i
echo %USER%
USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
$USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
FOR /f %i IN ('az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv') DO SET USER=%i
echo %USER%

表输出格式

table 格式以 ASCII 表的形式列显输出,因此可以轻松阅读和扫描输出。 并非所有字段都包含在表中,因此此格式最好用作可搜索的数据概述。 表中未包含的字段仍可以作为查询的一部分进行筛选。

某些键被筛选掉,并且不会打印在表视图中。 这些键是 idtypeetag。 若要查看这些值,可以在多选哈希中更改密钥名称。

az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table

可以使用前面的查询来演示此概念。 原始查询返回了一个 JSON 对象,其中包含资源组中每个 VM 的名称、OS 和管理员名称:

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=``50``].{Name:name,  admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table

请注意上一命令中 50 周围的额外转义字符(`)。 存在额外的转义字符,因为 Azure CLI 命令被视为命令提示符脚本。 考虑到 PowerShell 和命令提示符的内置解析功能。 Azure CLI 只有在某个符号在经过 2 轮分析后仍然存在的情况下,才会接收到该符号。 有关 PowerShell 中的其他可能引用问题的详细信息,请参阅 有关在 PowerShell 脚本语言中运行 Azure CLI 的注意事项

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=`50`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table