大多数 AWS CLI 命令都接受--query
选项。此选项将获取命令输出并应用 JMESPath 表达式来转换输出。JMESPath
是一种查询语言,它以 JSON 作为输入并根据提供的查询表达式转换数据, JMESPath 表达式生成的输出也是 JSON 数据。
该--query
选项可用于减少输出以仅显示您想要查看的值。在编写 shell 脚本以从输出中提取特定值时也经常使用此选项,以便我们可以在后续命令中使用它。
例如,假设我们想要获取我们的 AWS 账户 ID, aws sts get-caller-identity
命令输出:
$ aws sts get-caller-identity
{
"UserId": "AIDA2LXQ3EOQBID7ABCDE",
"Account": "12345",
"Arn": "arn:aws:iam::12345:user/admin"
}
如果我们只想提取Account
键的值,我们可以使用 JMESPath 表达式Account
来提取与该键关联的值。
$ aws sts get-caller-identity --query Account
"12345678910"
在上面的输出中,我们将字符串显示为 JSON,其中包含双引号。
在 shell 脚本中使用 AWS CLI 时的另一个常见模式是通过选项指定需要文本输出而不是 JSON 输出来删除双引号,--output text
这会删除值周围的引号:
$ aws sts get-caller-identity --query Account --output text
12345678910
为了将此值保存为我们可以稍后重用的变量,我们会经常看到使用以下模式:
account_id=$(aws sts get-caller-identity --query Account --output text)
echo "Your account id is $account_id"
要了解有关 JMESPath 查询语言的更多信息,请参阅JMESPath 教程 。
我们通常只对从服务返回的数据的子集感兴趣。我们可以使用multiselect-list 帮助我们提取我们感兴趣的子集。
许多 AWS 服务的list
或describe
命令都具有以下返回结构:
{
"SingleRootKey": [
{"Attr1": "foo", "Attr2": "bar", "Attr3": "baz"},
{"Attr1": "foor2", "Attr2": "barr2", "Attr3": "bazr2"},
]
}
如果我们只对 Attr1
感兴趣,可以提取出来。
例如,运行aws cloudformation describe-stacks
查看我们的帐户中部署了哪些 CloudFormation 堆栈:
aws cloudformation describe-stacks
让我们将输出范围缩小到堆栈的名称和堆栈的状态。该模式的一般格式如下:TopLevelKey[].[Attr1,Attr1,...]
在本例中,顶级键是Stacks
,我们要提取的两个属性是 StackName
和StackStatus
。
aws cloudformation describe-stacks --query Stacks[].[StackName,StackStatus]
在可能的情况下,建议先在服务端过滤结果,以避免不必要的带宽和客户端处理。
例如,假设我们想要查看状态为ROLLBACK_COMPLETE
的所有堆栈, 执行此操作的首选方法是使用--stack-status-filter
参数,因为过滤发生在服务端。因此,只有具有以下ROLLBACK_COMPLETE
状态的堆栈才会返回给您:
aws cloudformation list-stacks --stack-status-filter ROLLBACK_COMPLETE --query StackSummaries[].[StackName,StackStatus]
有时服务 API 参数中并未提供我们想要执行的过滤器类型。发生这种情况时,我们可以使用客户端过滤来--query
生成我们想要的结果。
该查询的格式为SingleRootKey[? QUERY_EXPRESSION ]
。然后,我们可以使用MultiSelect List
技巧中的查询来扩展该查询,以选择我们感兴趣的字段子集。
例如,我们将探讨要列出以特定前缀开头的Stack的场景。使用客户端过滤
运行list-stacks
命令以检索以eksctl
开头的堆栈:
aws cloudformation list-stacks --query "StackSummaries[?starts_with(StackName, 'eksctl')]"
如果仅想显示StackName
和StackStatus
属性:
aws cloudformation list-stacks \
--query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]"
--text
结合到目前为止,我们看到的输出都是 JSON 格式。但是,有时我们希望将输出格式化为Tab
分隔的基于文本的格式。这允许我们使用其他命令行工具,例如sed
、 awk
来继续处理
运行与上一步相同的命令, 并添加选项--output text
:
aws cloudformation list-stacks \
--query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]" \
--output text
如果我们想让CREATE_COMPLETE
/UPDATE_COMPLETE /
统一为COMPLETE
。我们还将通过对齐列来清理输出,以便输出更易于直观地解析。这演示了我们如何将该--output text
选项与其他 CLI 工具结合起来。
aws cloudformation list-stacks \
--query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]" \
--output text | \
sed 's/\(CREATE\|UPDATE\)_COMPLETE/COMPLETE/' | column -t