AWS Command Line Interface
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

控制 AWS CLI 的命令输出

此部分介绍控制 AWS Command Line Interface (AWS CLI) 输出的不同方式。

如何选择输出格式

AWS CLI 支持三种不同的输出格式:

  • JSON (json)

  • 制表符分隔的文本 (text)

  • ASCII 格式的表 (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

AWS CLI 优先顺序规则适用。例如,使用 AWS_DEFAULT_OUTPUT 环境变量将覆盖在 config 文件中设置的任何值,使用 --output 传递到 AWS CLI 命令的值将覆盖在环境变量或 config 文件中设置的任何值。

json 选项是通过不同语言或 jq(命令行 JSON 处理器)以编程方式处理输出的最佳选择。

table 格式易于阅读。

text 格式适合在传统 Unix 文本工具(如 sedgrepawk)以及 PowerShell 脚本中使用。

可以使用 --query 参数自定义和筛选任何格式的结果。有关更多信息,请参阅 如何使用 --query 选项筛选输出

JSON 输出格式

JSON 是 AWS CLI 的默认输出格式。大多数语言都可以使用内置功能或公开提供的库轻松解码 JSON 字符串。正如上一个主题及输出示例所示,--query 选项可提供强大的方法来筛选和格式化 AWS CLI 的 JSON 格式输出。

如果您需要 --query 无法实现的更高级的功能,可以试试命令行 JSON 处理程序 jq。您可以在以下网址下载它并找到正式的教程:http://stedolan.github.io/jq/

Text 输出格式

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

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

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

下面是一个文本输出示例。

$ aws ec2 describe-volumes --output text VOLUMES us-west-2a 2013-09-17T00:55:03.000Z 30 snap-f23ec1c8 in-use vol-e11a5288 standard ATTACHMENTS 2013-09-17T00:55:03.000Z True /dev/sda1 i-a071c394 attached vol-e11a5288 VOLUMES us-west-2a 2013-09-18T20:26:15.000Z 8 snap-708e8348 in-use vol-2e410a47 standard ATTACHMENTS 2013-09-18T20:26:16.000Z True /dev/sda1 i-4b41a37c attached vol-2e410a47

重要

我们强烈建议,如果您指定 text 输出,则也始终使用 --query 选项以确保行为一致。这是因为文本格式按基础 JSON 对象的键名称以字母顺序对输出列进行排序,而类似的资源可能没有相同的键名称。例如,基于 Linux 的 EC2 实例的 JSON 表示形式中的元素在基于 Windows 的实例的 JSON 表示形式中可能不存在,反之亦然。此外,资源可能在未来的更新中添加或移除键/值元素,从而修改列的顺序。因此,可以使用 --query 补充文本输出的功能,以提供对输出格式的完全控制。在以下示例中,命令指定要显示的元素,并使用列表表示法 [key1, key2, ...] 定义列的顺序。这可让您十分放心:正确的键值始终显示在预期的列中。最后请注意,对于不存在的键,AWS CLI 将输出 None 作为键值。

$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size, FakeKey]' --output text vol-e11a5288 i-a071c394 us-west-2a 30 None vol-2e410a47 i-4b41a37c us-west-2a 8 None

以下示例显示如何将 grepawk 与来自 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

文本输出也适用于 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]; } } i-4b41a37c i-a071c394 i-3045b007 i-6fc67758

提示

如果使用 --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 输出格式

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

$ aws ec2 describe-volumes --output table --------------------------------------------------------------------------------------------------------------------- | DescribeVolumes | +-------------------------------------------------------------------------------------------------------------------+ || Volumes || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || AvailabilityZone | CreateTime | Size | SnapshotId | State | VolumeId | VolumeType || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || us-west-2a | 2013-09-17T00:55:03.000Z | 30 | snap-f23ec1c8 | in-use | vol-e11a5288 | standard || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| ||| Attachments ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| AttachTime | DeleteOnTermination | Device | InstanceId | State | VolumeId ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| 2013-09-17T00:55:03.000Z | True | /dev/sda1 | i-a071c394 | attached | vol-e11a5288 ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| || Volumes || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || AvailabilityZone | CreateTime | Size | SnapshotId | State | VolumeId | VolumeType || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || us-west-2a | 2013-09-18T20:26:15.000Z | 8 | snap-708e8348 | in-use | vol-2e410a47 | standard || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| ||| Attachments ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| AttachTime | DeleteOnTermination | Device | InstanceId | State | VolumeId ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| 2013-09-18T20:26:16.000Z | True | /dev/sda1 | i-4b41a37c | attached | vol-2e410a47 ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+||

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

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

如何使用 --query 选项筛选输出

AWS CLI 使用 --query 选项提供内置的基于 JSON 的输出筛选功能。--query 参数接受符合 JMESPath 规范的字符串。为了演示它的工作原理,我们首先从以下默认 JSON 输出开始,这些输出描述了两个 Amazon Elastic Block Store (Amazon EBS) 卷,它们附加到不同的 Amazon EC2 实例。

$ aws ec2 describe-volumes { "Volumes": [ { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }, { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-18T20:26:16.000Z", "InstanceId": "i-4b41a37c", "VolumeId": "vol-2e410a47", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-2e410a47", "State": "in-use", "SnapshotId": "snap-708e8348", "CreateTime": "2013-09-18T20:26:15.000Z", "Size": 8 } ] }

我们可以选择使用以下命令从 Volumes 列表中仅显示第一个卷,该命令为数组中的第一个卷编制索引

$ aws ec2 describe-volumes --query 'Volumes[0]' { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }

在下一个示例中,我们使用通配符表示法 [*] 循环访问列表中的所有卷:VolumeIdAvailabilityZoneSize。词典表示法要求您为每个 JSON 键提供一个别名,如:{Alias1:JSONKey1,Alias2:JSONKey2}。词典本身是无序的,因此,此种结构中的键别名的顺序可能不一致。

$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,AZ:AvailabilityZone,Size:Size}' [ { "AZ": "us-west-2a", "ID": "vol-e11a5288", "Size": 30 }, { "AZ": "us-west-2a", "ID": "vol-2e410a47", "Size": 8 } ]

在使用词典表示法时,您也可以将键链接起来(如 key1.key2[0].key3)来筛选深度嵌套在结构中的元素。以下示例利用 Attachments[0].InstanceId 键演示此功能,别名指定为简单的 InstanceId

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

您也可以使用列表表示法筛选多个元素:[key1, key2]。此表达式会将每个对象筛选出的所有属性放入单个排序列表中,不考虑类型。

$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]' [ [ "vol-e11a5288", "i-a071c394", "us-west-2a", 30 ], [ "vol-2e410a47", "i-4b41a37c", "us-west-2a", 8 ] ]

要按特定字段的值筛选结果,请使用 JMESPath "?" 运算符。以下示例查询仅输出 us-west-2a 可用区中的卷。

$ aws ec2 describe-volumes --query 'Volumes[?AvailabilityZone==`us-west-2a`]'

注意

在指定诸如以上 JMESPath 查询表达式中的“us-west-2”这样的文字值时,必须将该值放在反引号 (` `) 中,以便使它能够正确读取。

下面是一些其他示例,说明如何从命令输出中仅获取所需的详细信息。

以下示例列出了 Amazon EC2 卷。该服务在 us-west-2a 可用区中生成所有正在使用的卷的列表。--query 参数进一步将输出限制为只有 Size 值大于 50 的卷,并且仅显示具有用户定义名称的指定字段。

$ aws ec2 describe-volumes \ --filter "Name=availability-zone,Values=us-west-2a" "Name=status,Values=attached" \ --query 'Volumes[?Size > `50`].{Id:VolumeId,Size:Size,Type:VolumeType}' [ { "Id": "vol-0be9bb0bf12345678", "Size": 80, "Type": "gp2" } ]

以下示例检索满足多个条件的映像的列表。然后,它使用 --query 参数按 CreationDate 对输出进行排序,从而仅选择最新的。然后,它显示这一个映像的 ImageId

$ aws ec2 describe-images \ --owners amazon \ --filters "Name=name,Values=amzn*gp2" "Name=virtualization-type,Values=hvm" "Name=root-device-type,Values=ebs" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" \ --output text ami-00ced3122871a4921

以下示例使用 --query 参数在列表中查找特定的项目,然后提取该项目的的信息。此示例列出了与指定的服务终端节点相关联的所有可用区。它从 ServiceDetails 列表中提取具有指定 ServiceName 的项目,然后输出该选定项目的 AvailabilityZones 字段。

$ aws --region us-east-1 ec2 describe-vpc-endpoint-services --query 'ServiceDetails[?ServiceName==`com.amazonaws.us-east-1.ecs`].AvailabilityZones' [ [ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d", "us-east-1e", "us-east-1f" ] ]

--query 参数还允许您计算输出中的项目数量。以下示例显示超过 1000 IOPS 的可用卷数。

$ aws ec2 describe-volumes \ --filter "Name=status,Values=available" \ --query 'length(Volumes[?Iops > `1000`])' 3

以下示例显示如何列出在指定日期之后创建的所有快照,从而在输出中仅包括几个可用字段。

$ aws ec2 describe-snapshots --owner self --output json \ --query 'Snapshots[?StartTime>=`2018-02-07`].{Id:SnapshotId,VId:VolumeId,Size:VolumeSize}' \ [ { "id": "snap-0effb42b7a1b2c3d4", "vid": "vol-0be9bb0bf12345678", "Size": 8 } ]

以下示例列出了您创建的五个最新 AMI,从最新到最旧排序。

$ aws ec2 describe-images --owners self \ --query 'reverse(sort_by(Images,&CreationDate))[:5].{id:ImageId,date:CreationDate}' [ { "id": "ami-0a1b2c3d4e5f60001", "date": "2018-11-28T17:16:38.000Z" }, { "id": "ami-0a1b2c3d4e5f60002", "date": "2018-09-15T13:51:22.000Z" }, { "id": "ami-0a1b2c3d4e5f60003", "date": "2018-08-19T10:22:45.000Z" }, { "id": "ami-0a1b2c3d4e5f60004", "date": "2018-05-03T12:04:02.000Z" }, { "id": "ami-0a1b2c3d4e5f60005", "date": "2017-12-13T17:16:38.000Z" } ]

以下示例仅显示指定 AutoScaling 组中任何运行状况不佳的实例的 InstanceId

$ aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name My-AutoScaling-Group-Name --output text\ --query 'AutoScalingGroups[*].Instances[?HealthStatus==`Unhealthy`].InstanceId'

在以下部分中将更详细地解释如何组合使用这三种输出格式。--query 选项是十分强大的工具,您可用它来自定义输出的内容和样式。

有关底层 JSON 处理库 JMESPath 的更多示例和完整规范,请查看 http://jmespath.org/specification.html