Amazon web services AWS CLI命令/JMESPATH查询出现问题

Amazon web services AWS CLI命令/JMESPATH查询出现问题,amazon-web-services,aws-cli,jmespath,Amazon Web Services,Aws Cli,Jmespath,你们中的任何人都可以帮助我识别下面“什么不起作用”一节中CLI命令/JMESPATH查询的问题吗 下面给出的p.S.JSON输出是有效的,您可以使用该输出在JMESPATH.org上测试其中的JMESPATH查询部分 什么有效? 1) aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[] 2) aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[]

你们中的任何人都可以帮助我识别下面“什么不起作用”一节中CLI命令/JMESPATH查询的问题吗

下面给出的p.S.JSON输出是有效的,您可以使用该输出在JMESPATH.org上测试其中的JMESPATH查询部分

什么有效? 1) aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[]
2) aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[]。FromPort
3)
aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[]IpProtocol

什么不起作用? 1) aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[?IpProtocol=='tcp']。IpProtocol
2)
aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[?FromPort='22']。FromPort

JSON输出 预期/实际结果
aws ec2描述安全组--查询安全组[?GroupId='sg-0a26abc0a00000000']。IpPermissions[?IpProtocol=='tcp']。IpProtocol

结果 预期-tcp,实际-不返回任何结果

SecurityGroups[?GroupId=='sg-0a26abc0a00000000'].IpPermissions[] | [?IpProtocol=='tcp'].IpProtocol | [0]

SecurityGroups[?GroupId=='sg-0a26abc0a00000000'].IpPermissions[] | [?FromPort==`22`].FromPort | [0]
aws ec2描述安全组--查询安全组[?组ID='sg-0a26abc0a00000000']。IpPermissions[?FromPort='22']。FromPort

结果 预期为-22,实际为-不返回结果

SecurityGroups[?GroupId=='sg-0a26abc0a00000000'].IpPermissions[] | [?IpProtocol=='tcp'].IpProtocol | [0]

SecurityGroups[?GroupId=='sg-0a26abc0a00000000'].IpPermissions[] | [?FromPort==`22`].FromPort | [0]
或者,为bash报价/调整:

'SecurityGroups[?GroupId==`"sg-0a26abc0a00000000"`].IpPermissions[] | [?IpProtocol==`"tcp"`].IpProtocol | [0]'

'SecurityGroups[?GroupId==`"sg-0a26abc0a00000000`"].IpPermissions[] | [?FromPort==`22`].FromPort | [0]'
您会注意到IpPermissions末尾的
[]
,这会使列表变平。如果不这样做(或执行
SecurityGroups[?GroupId=='sg-0a26abc0a00000000'][]
),则筛选器将应用于列表的顶层,而IpPermissions不存在


我不清楚为什么会这样。这似乎是错误的,因为如果没有前面的筛选器,后面的筛选器将应用于子列表。

以下是我尝试过并获得预期数据的筛选器。请告诉我这是否适用于您

aws ec2 describe-security-groups --query 'SecurityGroups[?GroupId==`sg-xxxxxx`].[IpPermissions[?IpProtocol==`tcp`] | [0].IpProtocol]' --output text
//tcp
aws ec2 describe-security-groups --query 'SecurityGroups[?GroupId==`sg-xxxxxx`].[IpPermissions[?FromPort==`22`] | [0].FromPort]' --output text
//22
注-

  • 最好将查询用单引号括起来,以便CLI能够正确解析整个查询
  • 您可以使用反引号(`)填充条件

  • 我尝试在上使用在线JMESPATH evaluator,但它似乎不支持筛选结果中的筛选器。ABNF语法描述了列表筛选器expr,但无法从语法中的任何其他位置引用它(这可能是文档中的错误)。我猜JMESPATH根本不支持这种用法,您可以在上与他们讨论。它在我的Mac电脑上使用了
    aws ec2 descripe security groups--query'SecurityGroups[].IpPermissions[?FromPort=='22`].FromPort'
    ,但也提供了空集。@约翰罗滕斯坦,我们是不是在AWS CLI中发现了一个错误?坦白说,我发现通过SDK查询此类信息比试图强制JMESPath生成特定结果更容易。例如:我也在这方面花费了一些时间,我还认为JMESPath已损坏。请在下面查找测试结果er使用修改后的jmespath查询$aws ec2描述安全组--查询安全组[?GroupId=“'sg-0a26abc0a00000000'”).IpPermissions[]|[?IpProtocol=='tcp'].IpProtocol |[0]bash:[?IpProtocol==tcp]。IpProtocol:未找到命令bash:0:未找到命令在:OSError:[Errno 22]中忽略异常无效参数您需要适当地引用查询,以便bash不会解释管道。在这种情况下,我建议在整个过程中使用双引号将是最简单的。双引号技巧适用于text-IpProtocol='tcp',但不适用于number FromPort=22。请查找下面的结果可能是误解,但这似乎是错误的JMESPath的解决方法被破坏了,我仍然无法理解为什么需要强制一个数组,然后再次获取该数组的第一个元素。@Alexarvey我完全同意。使用类似于
    IpPermissions[?IpProtocol==
    tcp
    ]的表达式.IpProtocol
    使它变得非常简单,我正在使用
    jq
    表达式只想尝试这种方式。顺便说一句,在上面的表达式中
    [0]
    是不必要的,您可以给出
    [].IpProtocol
    因为数组已经过滤到单行。我确实发现JMESPATH存在问题,这与引号及其用法有关。只有以某种方式放置或使用它们时,它才有效。请在下面找到我对不同引号组合所做的一些测试。当您不确定是哪一行时,这也会让人困惑要使用的是e。我不确定是否有任何关于引号使用的文档。请在下面的注释中找到我的测试。Test1->NoOutsideQuotes/DoubleQuotes--------------------aws ec2描述安全组--查询安全组[?GroupId==“sg-xxxxxxxxxxxxxxxx”]。IpPermissions[]结果--query SecurityGroups[?GroupId==sg-xxxxxxxxxxxxxxxx]的值不正确。IpPermissions[]应为:rbracket,get:number:第27列的解析错误,标记“0”(数字),用于表达式:“SecurityGroups[?GroupId==sg-xxxxxxxxxxxx]。IpPermissions[]“@imran,原因是,我无法将所有的测试结果放在一条评论中。我会接受你的回答,再次感谢你。