设置 AWS CLI 输出格式 - AWS Command Line Interface
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Python 2.7、3.4 和 3.5 已被弃用 AWS CLI 版本 1。有关更多信息,请参阅 关于AWS CLI版本 的 AWS CLI 版本 1 部分。

设置 AWS CLI 输出格式

本主题介绍了 AWS Command Line Interface (AWS CLI) 的不同输出格式。AWS CLI 支持以下输出格式:

  • json – 输出采用 JSON 字符串的格式。

  • yaml – 输出采用 YAML 字符串的格式。(仅在 AWS CLI 版本 2 中可用。)

  • yaml-stream – 输出被流式处理并采用 YAML 字符串的格式。流式处理支持更快地处理大型数据类型。(仅在 AWS CLI 版本 2 中可用。)

  • text – 输出采用多个制表符分隔字符串值行的格式。这对于将输出传递到文本处理器(如 grepsedawk)很有用。

  • table – 输出采用表格形式,使用字符 +|- 以形成单元格边框。它通常以“人性化”格式呈现信息,这种格式比其他格式更容易阅读,但从编程方面来讲不是那么有用。

如何选择输出格式

正如配置主题所述,输出格式可通过三种不同方式指定:

  • config 文件的命名配置文件中使用 output 选项 – 以下示例将默认输出格式设置为 text

    [default] output=text
  • 使用 AWS_DEFAULT_OUTPUT 环境变量 – 对于此命令行会话中的命令,以下输出将格式设置为 table,直到更改此变量或会话结束。使用此环境变量将覆盖在 config 文件中设置的任何值。

    $ export AWS_DEFAULT_OUTPUT="table"
  • 在命令行上使用 --output 选项 – 以下示例仅将这一个命令的输出设置为 json。对此命令使用此选项将覆盖任何当前设置的环境变量或 config 文件中的值。

    $ aws swf list-domains --registration-status REGISTERED --output json

JSON 输出格式

JSON 是 AWS CLI 的默认输出格式。大多数编程语言可以使用内置函数或公开提供的库轻松解码 JSON 字符串。您可以通过强有力的方式将 JSON 输出与 --query 选项结合使用,以筛选和格式化 AWS CLI JSON 格式的输出。

对于您可能无法使用 --query 执行的更高级的筛选,可以考虑使用 jq,这是一个命令行 JSON 处理器。您可以在以下网址下载它并找到正式的教程:http://stedolan.github.io/jq/

以下是 JSON 输出的示例。

$ aws iam list-users --output json
{ "Users": [ { "Path": "/", "UserName": "Admin", "UserId": "AIDA1111111111EXAMPLE", "Arn": "arn:aws:iam::123456789012:user/Admin", "CreateDate": "2014-10-16T16:03:09+00:00", "PasswordLastUsed": "2016-06-03T18:37:29+00:00" }, { "Path": "/backup/", "UserName": "backup-user", "UserId": "AIDA2222222222EXAMPLE", "Arn": "arn:aws:iam::123456789012:user/backup/backup-user", "CreateDate": "2019-09-17T19:30:40+00:00" }, { "Path": "/", "UserName": "cli-user", "UserId": "AIDA3333333333EXAMPLE", "Arn": "arn:aws:iam::123456789012:user/cli-user", "CreateDate": "2019-09-17T19:11:39+00:00" } ] }

YAML 输出格式

此功能仅适用于 AWS CLI 版本 2。

仅当您使用 AWS CLI 版本 2 时,以下功能才可用。如果您运行 AWS CLI 版本 1,则此功能不可用。有关如何安装版本 2 的信息,请参阅安装、更新和卸载 AWS CLI 版本 2

对于使用某些服务和工具(这些工具发出或使用 YAML 格式的字符串)以编程方式处理输出的情况,如 AWS CloudFormation 及其对 YAML 格式的模板的支持,YAML 是一个很好的选择。

对于您可能无法使用 --query 执行的更高级的筛选,可以考虑使用 yq,这是一个命令行 YAML 处理器。您可以通过 https://mikefarah.gitbook.io/yq/ 下载它并查找文档。

以下是 YAML 输出的示例。

$ aws iam list-users --output yaml
Users: - Arn: arn:aws:iam::123456789012:user/Admin CreateDate: '2014-10-16T16:03:09+00:00' PasswordLastUsed: '2016-06-03T18:37:29+00:00' Path: / UserId: AIDA1111111111EXAMPLE UserName: Admin - Arn: arn:aws:iam::123456789012:user/backup/backup-user CreateDate: '2019-09-17T19:30:40+00:00' Path: /backup/ UserId: AIDA2222222222EXAMPLE UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19 - Arn: arn:aws:iam::123456789012:user/cli-user CreateDate: '2019-09-17T19:30:40+00:00' Path: / UserId: AIDA3333333333EXAMPLE UserName: cli-user

YAML 流输出格式

此功能仅适用于 AWS CLI 版本 2。

仅当您使用 AWS CLI 版本 2 时,以下功能才可用。如果您运行 AWS CLI 版本 1,则此功能不可用。有关如何安装版本 2 的信息,请参阅安装、更新和卸载 AWS CLI 版本 2

yaml-stream 格式利用 YAML 格式,同时通过流式传输数据给您,使您在查看大型数据集时的响应能力更高/速度更快。您可以在整个查询下载之前开始查看和使用 YAML 数据。

对于您可能无法使用 --query 执行的更高级的筛选,可以考虑使用 yq,这是一个命令行 YAML 处理器。您可以通过 http://mikefarah.github.io/yq/ 下载它并查找文档。

下面是 yaml-stream 输出的一个示例。

$ aws iam list-users --output yaml-stream
- IsTruncated: false Users: - Arn: arn:aws:iam::123456789012:user/Admin CreateDate: '2014-10-16T16:03:09+00:00' PasswordLastUsed: '2016-06-03T18:37:29+00:00' Path: / UserId: AIDA1111111111EXAMPLE UserName: Admin - Arn: arn:aws:iam::123456789012:user/backup/backup-user CreateDate: '2019-09-17T19:30:40+00:00' Path: /backup/ UserId: AIDA2222222222EXAMPLE UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19 - Arn: arn:aws:iam::123456789012:user/cli-user CreateDate: '2019-09-17T19:30:40+00:00' Path: / UserId: AIDA3333333333EXAMPLE UserName: cli-user

下面是一个 yaml-stream 输出示例,并且使用 --page-size 参数对流式 YAML 内容进行分页。

$ aws iam list-users --output yaml-stream --page-size 2
- IsTruncated: true Marker: ab1234cdef5ghi67jk8lmo9p/q012rs3t445uv6789w0x1y2z/345a6b78c9d00/1efgh234ij56klmno78pqrstu90vwxyx Users: - Arn: arn:aws:iam::123456789012:user/Admin CreateDate: '2014-10-16T16:03:09+00:00' PasswordLastUsed: '2016-06-03T18:37:29+00:00' Path: / UserId: AIDA1111111111EXAMPLE UserName: Admin - Arn: arn:aws:iam::123456789012:user/backup/backup-user CreateDate: '2019-09-17T19:30:40+00:00' Path: /backup/ UserId: AIDA2222222222EXAMPLE UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19 - IsTruncated: false Users: - Arn: arn:aws:iam::123456789012:user/cli-user CreateDate: '2019-09-17T19:30:40+00:00' Path: / UserId: AIDA3333333333EXAMPLE UserName: cli-user

文本输出格式

text 格式将 AWS CLI 输出组织为制表符分隔的行。此格式适合在传统 Unix 文本工具(如 grepsedawk)和由 PowerShell 执行的文本处理中使用。

text 输出格式遵循以下所示的基本结构。这些列根据底层 JSON 对象相应的键名称按字母顺序排序。

IDENTIFIER sorted-column1 sorted-column2 IDENTIFIER2 sorted-column1 sorted-column2

下面是 text 输出的一个示例。每个字段都用标签与其他字段分开,并带有一个额外的标签,其中有一个空字段。

$ aws iam list-users --output text
USERS arn:aws:iam::123456789012:user/Admin 2014-10-16T16:03:09+00:00 2016-06-03T18:37:29+00:00 / AIDA1111111111EXAMPLE Admin USERS arn:aws:iam::123456789012:user/backup/backup-user 2019-09-17T19:30:40+00:00 /backup/ AIDA2222222222EXAMPLE backup-user USERS arn:aws:iam::123456789012:user/cli-user 2019-09-17T19:11:39+00:00 / AIDA3333333333EXAMPLE cli-user

第四列是 PasswordLastUsed 字段,它对于最后两个条目为空,因为这些用户从未登录过 AWS 管理控制台。

重要

我们强烈建议,如果您指定 text 输出,则也始终使用 --query 选项以确保行为一致

这是因为文本格式按由 AWS 服务返回的基础 JSON 对象的键名称以字母顺序对输出列进行排序,而类似的资源可能没有相同的键名称。例如,基于 Linux 的 Amazon EC2 实例的 JSON 表示形式中的元素在基于 Windows 的实例的 JSON 表示形式中可能不存在,反之亦然。此外,资源可能在未来的更新中添加或移除键/值元素,从而修改列的顺序。因此,可以使用 --query 补充 text 输出的功能,以提供对输出格式的完全控制。

在以下示例中,命令指定要显示的元素,并使用列表表示法 [key1, key2, ...]定义列的顺序。这可让您十分放心:正确的键值始终显示在预期的列中。最后请注意,对于不存在的键,AWS CLI 将输出 None 作为键值。

$ aws iam list-users --output text --query 'Users[*].[UserName,Arn,CreateDate,PasswordLastUsed,UserId]'
Admin arn:aws:iam::123456789012:user/Admin 2014-10-16T16:03:09+00:00 2016-06-03T18:37:29+00:00 AIDA1111111111EXAMPLE backup-user arn:aws:iam::123456789012:user/backup-user 2019-09-17T19:30:40+00:00 None AIDA2222222222EXAMPLE cli-user arn:aws:iam::123456789012:user/cli-backup 2019-09-17T19:11:39+00:00 None AIDA3333333333EXAMPLE

以下示例显示如何将 grepawk 与来自 aws ec2 describe-instances 命令的 text 输出结合使用。第一个命令在 text 输出中显示每个实例的可用区、当前状态和实例 ID。第二个命令处理该输出,以仅输出在 us-west-2a 可用区中运行的所有实例的实例 ID。

$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text
us-west-2a running i-4b41a37c us-west-2a stopped i-a071c394 us-west-2b stopped i-97a217a0 us-west-2a running i-3045b007 us-west-2a running i-6fc67758
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | grep us-west-2a | grep running | awk '{print $3}'
i-4b41a37c i-3045b007 i-6fc67758

以下示例更进一步,不仅说明如何筛选输出,还介绍如何使用该输出自动更改每个已停止实例的实例类型。

$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[State.Name, InstanceId]' --output text | > grep stopped | > awk '{print $2}' | > while read line; > do aws ec2 modify-instance-attribute --instance-id $line --instance-type '{"Value": "m1.medium"}'; > done

text 输出也适用于 PowerShell。因为 text 输出中的列使用制表符分隔,所以可以轻松地使用 PowerShell 的 `t 分隔符将输出拆分为数组。以下命令在第一列 (AvailabilityZone) 与字符串 us-west-2a 匹配的情况下显示第三列 (InstanceId) 的值。

PS C:\>aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | %{if ($_.split("`t")[0] -match "us-west-2a") { $_.split("`t")[2]; } }
-4b41a37c i-a071c394 i-3045b007 i-6fc67758

注意,尽管上一个示例的确显示了如何使用 --query 参数解析底层 JSON 对象和提取所需的列,但是 PowerShell 有自己处理 JSON 的功能(如果跨平台兼容性不是问题)。不像大多数命令 shell 需要的那样将输出处理为文本,PowerShell 让您可以使用 ConvertFrom-JSON cmdlet 生成具有层次结构的对象。然后,您可以直接从该对象访问所需的成员。

(aws ec2 describe-instances --output json | ConvertFrom-Json).Reservations.Instances.InstanceId
提示

如果使用 --query 参数输出文本并将输出筛选到单个字段,则输出是单行制表符分隔值。要将每个值放到单独的行上,可以将输出字段放在括号中,如以下示例所示。

制表符分隔的单行输出:

$ aws iam list-groups-for-user --user-name susan --output text --query "Groups[].GroupName"
HRDepartment Developers SpreadsheetUsers LocalAdmins

通过将 [GroupName] 放在括号中,让每个值都在自己的行上:

$ aws iam list-groups-for-user --user-name susan --output text --query "Groups[].[GroupName]"
HRDepartment Developers SpreadsheetUsers LocalAdmins

表输出格式

table 格式以表格形式生成复杂 AWS CLI 输出的易于人阅读的表示。

$ aws iam list-users --output table
----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ListUsers | +---------------------------------------------------------------------------------------------------------------------------------------------------------------+ || Users || |+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+| || Arn | CreateDate | PasswordLastUsed | Path | UserId | UserName || |+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+| || arn:aws:iam::123456789012:user/Admin | 2014-10-16T16:03:09+00:00 | 2016-06-03T18:37:29+00:00 | / | AIDA1111111111EXAMPLE | Admin || || arn:aws:iam::123456789012:user/backup/backup-user | 2019-09-17T19:30:40+00:00 | | /backup/ | AIDA2222222222EXAMPLE | backup-user || || arn:aws:iam::123456789012:user/cli-user | 2019-09-17T19:11:39+00:00 | | / | AIDA3333333333EXAMPLE | cli-user || +---------------------------------------------------------------------------------------------------------------------------------------------------------------+

您可以将 --query 选项与 table 格式结合使用,以显示从原始输出中预先选择的一系列元素。请注意字典和列表表示法之间的输出区别:在第一个示例中,列名按字母顺序排序;在第二个示例中,未命名的列按用户指定的顺序排序。有关 --query 选项的更多信息,请参阅 筛选 AWS CLI 输出

$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output table
------------------------------------------------------ | DescribeVolumes | +------------+----------------+--------------+-------+ | AZ | ID | InstanceId | Size | +------------+----------------+--------------+-------+ | us-west-2a| vol-e11a5288 | i-a071c394 | 30 | | us-west-2a| vol-2e410a47 | i-4b41a37c | 8 | +------------+----------------+--------------+-------+
$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId,Attachments[0].InstanceId,AvailabilityZone,Size]' --output table
---------------------------------------------------- | DescribeVolumes | +--------------+--------------+--------------+-----+ | vol-e11a5288| i-a071c394 | us-west-2a | 30 | | vol-2e410a47| i-4b41a37c | us-west-2a | 8 | +--------------+--------------+--------------+-----+