本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在中设置输出格式 AWS CLI
本主题介绍了 AWS Command Line Interface (AWS CLI) 的不同输出格式。 AWS CLI 支持以下输出格式:
如何选择输出格式
正如配置主题所述,输出格式可通过三种不同方式指定:
-
在
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 运行一次查询。因此,查询在每个页面上包括第一个匹配元素,这可能会导致意外的额外输出。要进一步筛选输出,您可以使用其他命令行工具,例如head
或tail
。 -
如果您指定
--output json
、--output yaml
或--output yaml-stream
,则在应用--query
筛选条件之前,输出会完全处理为单个本机结构。只对整个结构 AWS CLI 运行一次查询,生成经过筛选的结果,然后将其输出。
JSON 输出格式
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
对于可能无法使用命令行处理器的更高级的筛选--query
,可以考虑yq
使用命令行YAML处理器。你可以在上GitHub的 yq 存储库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
对于可能无法使用命令行处理器的更高级的筛选--query
,可以考虑yq
使用命令行YAML处理器。你可以在上GitHub的 yq 存储库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 文本工具(例如grep
sed
awk
、和)以及执行的文本处理配合使用 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
以下示例显示如何将 grep
和 awk
与来自 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 | +--------------+--------------+--------------+-----+