大多数 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
