在中设置输出格式 AWS CLI - AWS Command Line Interface

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在中设置输出格式 AWS CLI

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

  • json— 输出格式化为字符JSON串。

  • yaml— 输出格式化为字符YAML串。

  • yaml-stream— 输出被流式传输并格式化为YAML字符串。串流支持更快地处理大型数据类型。

  • 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
重要

指定的输出类型更改--query 选项的运行方式:

  • 如果您指定--output text,则会在应用--query过滤器之前对输出进行分页,并且会在输出的每一页上 AWS CLI 运行一次查询。因此,查询在每个页面上包括第一个匹配元素,这可能会导致意外的额外输出。要进一步筛选输出,您可以使用其他命令行工具,例如 headtail

  • 如果您指定 --output json --output yaml--output yaml-stream,则在应用 --query 筛选条件之前,输出会完全处理为单个本机结构。只对整个结构 AWS CLI 运行一次查询,生成经过筛选的结果,然后将其输出。

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 输出格式

YAML对于使用发出或使用YAML格式化字符串的服务和工具(例如 AWS CloudFormation 支持格式化模板),以编程方式处理输出是一个不错的YAML选择。

对于可能无法使用命令行处理器的更高级的筛选--query,可以考虑yq使用命令行YAML处理器。你可以在上GitHubyq 存储库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流输出格式

yaml-stream格式利用了该YAML格式,同时通过将数据流式传输给您,从而可以更快地/更快地查看大型数据集。您可以在下载整个查询之前开始查看和使用YAML数据。

对于可能无法使用命令行处理器的更高级的筛选--query,可以考虑yq使用命令行YAML处理器。你可以在上GitHubyq 存储库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

以下是结合使用--page-size参数对流媒体YAML内容进行分页的yaml-stream输出示例。

$ 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 Management Console。

重要

我们强烈建议,如果您指定 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 与来自 text 命令的 aws ec2 describe-instances 输出结合使用。第一个命令在 text 输出中显示每个实例的可用区、当前状态和实例 ID。第二个命令处理的输出仅显示us-west-2a可用区中所有正在运行IDs的实例的实例。

$ 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输出中的列是用制表符分隔的,因此您可以使用的分`t隔符轻松地将输出拆分为数组。 PowerShell以下命令在第一列 (InstanceId) 与字符串 AvailabilityZone 匹配的情况下显示第三列 (us-west-2a) 的值。

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对象并提取所需的列,但如果不考虑跨平台兼容性JSON,则 PowerShell 有自己的处理能力。您可以使用 ConvertFrom-JSON cmd PowerShell let 生成分层结构对象,而不是像大多数命令 shell 所要求的那样将输出作为文本处理。然后,您可以直接从该对象访问所需的成员。

(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 | +--------------+--------------+--------------+-----+