使用JQ过滤AWS SQS标签

54次阅读
没有评论

问题描述

在尝试使用JQ运行查询时遇到了困惑。他拥有一个已应用标签的SQS队列,当运行以下命令时:

aws sqs list-queue-tags --region sa-east-1 --queue-url <my-url-queue> --output json | jq

输出如下:

{
  "Tags": {
    "owner": "foo",
    "Name": "bar-queue"
  }
}

他尝试使用以下方法进行过滤:
1.

aws sqs list-queue-tags --region sa-east-1 --queue-url <my-url-queue> --output json | jq '.Tags[] | [.Name]'
aws sqs list-queue-tags --region sa-east-1 --queue-url <my-url-queue> --output json | jq '.Tags[].Name'

但无论如何,都无法成功,一直输出以下错误:

jq: error (at <stdin>:6): Cannot index string with string "Name"

用户希望能够得到帮助,找到正确的过滤方法。

解决方案

以下解决方案基于已提供的问题和回答数据,如果遇到不同版本的问题或需要风险操作,请注意标明。

使用正确的JMESPath表达式

在你的问题中,问题并不在于JQ,而是在于你使用了错误的JMESPath表达式。由于Tags是一个JSON对象,而不是一个列表,因此在JMESPath表达式中使用[]会导致错误。正确的方法是直接访问Tags对象下的Name属性。以下是正确的JMESPath表达式:

aws sqs list-queue-tags --region sa-east-1 --queue-url <my-url-queue> --output json | jq '.Tags.Name'

这将输出:

"bar-queue"

利用AWS命令进行过滤

此外,你可以让aws命令为你完成过滤。尝试使用--query选项来实现:

aws sqs list-queue-tags --region sa-east-1 --queue-url <my-url-queue> --query 'Tags.Name'

如果你不想要输出中的引号,可以添加--output text选项。注意,aws命令中的表达式不需要前导的.字符。

bar-queue

学习更多关于JMESPath表达式

JMESPath表达式在jqaws命令中都有使用,但两者可能存在一些差异。如果你想深入了解JMESPath表达式的使用,可以参考以下教程:
jq : https://stedolan.github.io/jq/tutorial/
aws : https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html

另外,还有一个交互式试验JMESPath表达式的网站:https://jmespath.org。这个网站可以帮助你更好地理解和使用表达式。

请记得根据你的具体环境和需求进行适当调整,并在操作之前进行备份。

希望这些解决方案能够帮助你正确过滤AWS SQS标签数据。如果你有任何其他问题,请随时提问。

正文完