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

本文档 Amazon CLI 仅适用于版本 1。有关版本 2 的文档 Amazon CLI,请参阅版本 2 用户指南

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

设置 Amazon CLI 输出格式

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

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

  • 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 筛选条件之前,输出采用分页方式,并且 Amazon CLI 会一次性地在输出的每个页面 上运行查询。因此,查询在每个页面上包括第一个匹配元素,这可能会导致意外的额外输出。要进一步筛选输出,您可以使用其他命令行工具,例如 headtail

  • 如果您指定 --output json、,则在应用 --query 筛选条件之前,输出会完全处理为单个本机结构。Amazon CLI 仅针对整个结构运行查询一次,同时生成筛选的结果,然后将结果输出。

JSON 输出格式

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

文本输出格式

text 格式将 Amazon 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 字段,它对于最后两个条目为空,因为这些用户从未登录过 Amazon Web Services Management Console。

重要

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

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

在以下示例中,命令指定要显示的元素,并使用列表表示法 [key1, key2, ...]定义列的顺序。这可让您十分放心:正确的键值始终显示在预期的列中。最后请注意,对于不存在的键,Amazon 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 可用区中运行的所有实例的实例 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 分隔符将输出拆分为数组。以下命令在第一列 (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 对象和提取所需的列,但是 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 格式以表格形式生成复杂 Amazon 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 选项的更多信息,请参阅 过滤器 Amazon 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 | +--------------+--------------+--------------+-----+