gpt4 book ai didi

json - 如何根据JMESPath中的两个条件选择数组中的元素?

转载 作者:行者123 更新时间:2023-12-03 07:59:36 27 4
gpt4 key购买 nike

我尝试为不同的配置文件选择特定 AWS MFADeviceSerialNumber

此命令返回特定配置文件的 MFADevices 列表:

aws iam list-mfa-devices --profile xxx

这是一个示例 JSON 输出:

{
"MFADevices": [
{
"UserName": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e1878e8e838093a18499808c918d84cf828e8c" rel="noreferrer noopener nofollow">[email protected]</a>",
"SerialNumber": "arn:aws:iam::000000000000:mfa/foo",
"EnableDate": "2022-12-06T16:23:41+00:00"
},
{
"UserName": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc9e9d8e9a9393bc99849d918c9099d29f9391" rel="noreferrer noopener nofollow">[email protected]</a>",
"SerialNumber": "arn:aws:iam::111111111111:mfa/bar_cli",
"EnableDate": "2022-12-12T09:13:10+00:00"
}
]
}

我想选择包含字符串 cli 的设备的 SerialNumber。但如果列表中只有一个设备(无论是否存在字符串 cli),我想获取其 SerialNumber

我有这个表达式,它已经过滤了第一个条件,即所需的字符串:

aws iam list-mfa-devices --profile xxx --query 'MFADevices[].SerialNumber | [?contains(@,`cli`)] | [0]'

但是我仍然无法弄清楚如何添加if number_of_devices == 1 then return the single device

我可以使用此命令获取 MFADevices 的数量:

aws iam list-mfa-devices --profile yyy --query 'length(MFADevices)'

作为最终解决方案的第一步,我只想在列表只有一个元素的情况下才最初获取 SerialNumber,因此,我想到了这样的事情:

aws iam list-mfa-devices --profile yyy --query 'MFADevices[].SerialNumber | [?length(MFADevices) ==`1`]'

但实际上在这个阶段我已经得到了下面的错误(更不用说我仍然需要将它与 cli 部分结合起来):

In function length(), invalid type for value: None, expected one of: ['string', 'array', 'object'], received: "null"

有人知道如何实现我想要的吗?

我知道我可以将原始输出通过管道传输到 jq 并在那里进行过滤,但我想知道是否有一种方法可以使用一些 JMESPath 表达式直接在命令中执行此操作。

最佳答案

为了在 JMESPath 中执行此类条件,您必须依赖逻辑或 (||) 和逻辑与 (&&),因为该语言不本身没有条件关键字。

所以,在伪代码中,而不是这样做:

if length(MFADevices) == 1
MFADevices[0]
else
MFADevices[?someFilter]

你必须这样做,就像 中那样:

length(MFADevices) == 1 and MFADevices[0] or MFADevices[?someFilter]

所以,在 JMESPath 中:

length(MFADevices) == `1` 
&& MFADevices[0].SerialNumber
|| (MFADevices[?contains(SerialNumber, `cli`)] | [0]).SerialNumber

注意:这里假设,如果有多个元素但没有一个包含 cli,我们应该得到 null


如果您想要第一个元素,即使有多个设备并且 SerialNumber 包含 cli,那么您可以简化它当 contains 过滤器不返回任何内容时,进一步简单地执行逻辑 or(因为 null 结果将计算为 false):

(MFADevices[?contains(SerialNumber, `cli`)] | [0]).SerialNumber 
|| MFADevices[0].SerialNumber

关于json - 如何根据JMESPath中的两个条件选择数组中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74800790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com