过滤且表格化输出结果
阿里云 CLI 命令的返回结果为 JSON 格式。通过 --cli-query 选项可使用 JMESPath 表达式提取特定字段(输出仍为 JSON),通过 --output 选项可将结果转为表格显示。两者也可组合使用:先过滤,再表格化。
使用本文中的命令前,需要先安装并配置阿里云 CLI。具体操作,请参见安装CLI(Linux) 和配置凭证。
使用 --cli-query 过滤 JSON 输出
--cli-query 选项接受 JMESPath 表达式,过滤 API 返回的 JSON 结果。输出仍为 JSON 格式,适合在脚本中使用或通过 jq 等工具进一步处理。
基本语法:
aliyun <product> <operation> --cli-query "<JMESPath表达式>"以下示例均基于 ECS describe-instances 的返回结果,演示常见过滤用法。
示例一:提取单个字段列表
提取所有实例的 InstanceId。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --cli-query "Instances.Instance[].InstanceId"返回结果示例:
[
"i-1234567891234567****",
"i-abcdefghijklmnop****"
]示例二:提取多个字段
同时提取 InstanceId 和 Status 两个字段。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --cli-query "Instances.Instance[].[InstanceId,Status]"返回结果示例:
[
[
"i-1234567891234567****",
"Stopped"
],
[
"i-abcdefghijklmnop****",
"Running"
]
]示例三:条件过滤
仅返回状态为 Running 的实例 ID。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --cli-query "Instances.Instance[?Status=='Running'].InstanceId"返回结果示例:
[
"i-abcdefghijklmnop****"
]示例四:重塑输出结构
使用 JMESPath 的多选哈希表达式,将返回结果重新组织为自定义键名的对象数组。
aliyun ecs describe-instances --biz-region-id cn-hangzhou --cli-query "Instances.Instance[].{id:InstanceId,status:Status}"返回结果示例:
[
{
"id": "i-1234567891234567****",
"status": "Stopped"
},
{
"id": "i-abcdefghijklmnop****",
"status": "Running"
}
]以上示例仅覆盖常用语法。JMESPath 还支持管道表达式、内置函数等高级功能,完整语法请参见 JMESPath Tutorial。
如果 --cli-query 返回 null,请检查表达式中的字段名是否与 API 返回的 JSON 键名完全一致(区分大小写)。
选型指引
根据使用场景选择合适的选项:
场景 | 适用选项 | 说明 |
在脚本中提取特定值 |
| 输出为 JSON,方便 |
在终端中快速浏览数据 |
| 表格形式更易读 |
先过滤数据再表格化显示 | 两者组合使用 |
|
--output 选项字段说明
阿里云 CLI 提供 --output 选项,用于提取返回结果中的指定字段并以表格形式输出。
--output 选项包含以下字段:
字段名 | 描述 | 示例值 |
cols | 表格列名。 使用
|
|
rows | 表格行数据的来源路径,使用 JMESPath 语法指定 JSON 结果中的数据位置。 | rows="Instances.Instance[]" |
num | 开启行号显示。 设置为 | num="true" |
过滤示例
示例场景
阿里云产品的查询接口会返回 JSON 结构化数据,不方便阅读。
以查询所有 ECS 实例信息为例,执行如下命令。
aliyun ecs describe-instances --biz-region-id cn-hangzhou系统显示类似如下输出结果(部分省略)。
{ "PageNumber": 1, "TotalCount": 2, "PageSize": 10, "RequestId": "2B76ECBD-A296-407E-BE17-7E668A609DDA", "Instances": { "Instance": [ { "ImageId": "ubuntu_16_0402_64_20G_alibase_20171227.vhd", "InstanceTypeFamily": "ecs.xn4", "VlanId": "", "InstanceId": "i-1234567891234567****", "Status": "Stopped", "SecurityGroupIds": { "SecurityGroupId": [ "sg-bp12345678912345****", "sg-bp98765432198765****" ] } }, { "ImageId": "ubuntu_16_0402_64_20G_alibase_20171227.vhd", "InstanceTypeFamily": "ecs.xn4", "VlanId": "", "InstanceId": "i-abcdefghijklmnop****", "Status": "Running", "SecurityGroupIds": { "SecurityGroupId": [ "sg-bp1abcdefghijklm****", "sg-bp1zyxwvutsrqpon****" ] } } ] } }
示例一
执行如下命令,过滤示例场景返回结果中的字段
RequestId。该字段作为根元素,无需指定rows字段。aliyun ecs describe-instances --biz-region-id cn-hangzhou --output cols=RequestId系统显示类似如下输出结果。
RequestId --------- 2B76ECBD-A296-407E-BE17-7E668A609DDA
示例二
执行如下命令,过滤示例场景返回结果中的字段
InstanceId以及Status。这两个字段所在的 JMESPath 路径为Instances.Instance[],因此指定rows="Instances.Instance[]"。具体 JMESPath 书写方法,请参见 JMESPath Tutorial。aliyun ecs describe-instances --biz-region-id cn-hangzhou --output cols="InstanceId,Status" rows="Instances.Instance[]"系统显示类似如下输出结果。
InstanceId | Status ---------- | ------ i-12345678912345678123 | Stopped i-abcdefghijklmnopqrst | Running如果需要输出行号,则指定
num=true,系统显示类似如下输出结果。Num | InstanceId | Status --- | ---------- | ------ 0 | i-12345678912345678123 | Stopped 1 | i-abcdefghijklmnopqrst | Running
示例三
执行如下命令,过滤示例场景返回结果中的数组类型字段
SecurityGroupId的具体元素。数组所在的 JMESPath 路径为Instances.Instance[].SecurityGroupIds.SecurityGroupId。aliyun ecs describe-instances --biz-region-id cn-hangzhou --output cols="sg1:0,sg2:1" rows="Instances.Instance[].SecurityGroupIds.SecurityGroupId"系统显示类似如下输出结果。
sg1 | sg2 --- | --- sg-bp11234567891234**** | sg-bp19876543219876**** sg-bp1abcdefghijklm**** | sg-bp1zyxwvutsrqpon****