标签: jmespath

带有bash变量的JMESPath查询表达式

使用简单的aws cli查询来检查是否存在Lambda函数并回显相关角色(如果存在):

#!/bin/bash

fname=$1
role=$(aws lambda list-functions --query 'Functions[?FunctionName == `$fname`].Role' --output text)

echo "$fname role: $role"
Run Code Online (Sandbox Code Playgroud)

但是,$ fname似乎正在解析为aws命令中的空字符串.我试图逃避后面的嘀嗒声,交换`到'以及其他捶打编辑的镜像(是的,我在调用脚本时在cl上传递一个字符串:)

如何在bash脚本中将变量正确传递给JMESPath查询?

bash aws-cli jmespath

9
推荐指数
2
解决办法
5055
查看次数

使用JMESPath计算数组中实例的数量

在本问题底部的示例JSON中,如何"Tags"使用JMESPath 计算数组中键/值对的数量?

根据JMESPath文档,我可以使用count()函数执行此操作-

例如,以下表达式创建一个数组,其中包含foo对象中元素的总数,后跟foo ["bar"]的值.

但是,文档似乎不正确.使用JMESPath网站,查询Reservations[].Instances[].[count(@), Tags]结果[ [ null ] ].然后我通过AWS命令行测试并返回错误 -

未知功能:count()

实际上是否有使用JMESPath的方法?

示例JSON -

{
    "Reservations": [
        {
            "Instances": [
                {
                    "InstanceId": "i-asdf1234",
                    "InstanceName": "My Instance",
                    "Tags": [
                        {
                            "Value": "Value1",
                            "Key": "Key1"
                        },
                        {
                            "Value": "Value2",
                            "Key": "Key2"
                        },
                        {
                            "Value": "Value3",
                            "Key": "Key3"
                        },
                        {
                            "Value": "Value4",
                            "Key": "Key4"
                        }
                    ]
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

arrays syntax json jmespath

9
推荐指数
2
解决办法
3544
查看次数

用于展平对象数组的 JMESPath 表达式,每个对象都具有嵌套的对象数组

我有包含数据库数组的 JSON,每个数据库都有一个用户数组,例如

{"databases": [
  {"db": "db_a", "users": [{"name": "alice"}, {"name": "alex"}]},
  {"db": "db_b", "users": [{"name": "bob"}, {"name": "brienne"}]}
]}
Run Code Online (Sandbox Code Playgroud)

我想生成一个数据库和用户的平面数组,即

[
  {"db": "db_a", "name": "alice"},
  {"db": "db_a", "name": "alex"},
  {"db": "db_b", "name": "bob"},
  {"db": "db_b", "name": "brienne"}
]
Run Code Online (Sandbox Code Playgroud)

在 SQL 术语中,这将是笛卡尔连接或笛卡尔积,但我不确定树结构中的正确术语。到目前为止我最接近的是

databases[].users[]
Run Code Online (Sandbox Code Playgroud)

产生

databases[].users[]
Run Code Online (Sandbox Code Playgroud)

databases[].{db: db, name: users[].name}
Run Code Online (Sandbox Code Playgroud)

产生

[{"name": "alice"}, {"name": "alex"}, {"name": "bob"}, {"name": "brienne"}]
Run Code Online (Sandbox Code Playgroud)

附录:我很高兴接受“你不能用 JMESPath 做到这一点,这就是原因......”作为答案。HN 评论` `暗示了这一点

进行迭代时无法引用父级。为什么?迭代、[*] 和映射的所有选项都使用迭代项作为任何表达式的上下文。没有机会获得任何其他值

json ansible jmespath

8
推荐指数
1
解决办法
5351
查看次数

如何使用JMESPath将两个数组(`keys`和`values`)组合成一个对象?

我有一个带有两个数组的JSON对象 - 一个keys数组和一个values数组,两者长度相同.使用jmespath,我想构造一个新对象,使用keys数组的值作为键,values数组的值作为值,就像array_combine在PHP中一样.

例如,这是输入:

{
    "keys": [
        "a",
        "b",
        "c"
    ],
    "values": [
        1,
        2,
        3
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是我期待的输出:

{
    "a": 1,
    "b": 2,
    "c": 3
}
Run Code Online (Sandbox Code Playgroud)

有没有内置功能来实现这一目标?

jmespath

7
推荐指数
1
解决办法
1949
查看次数

AWS CLI和JMESPath

我想使用CLI工具来检索具有特定cname /别名的CloudFront分配的分发ID.

这就是我想出的:

aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items!='null']|DistributionList.Items[?contains(Aliases.Items,'cname.cdn.mycompany.com') == 'true'].{Id:Id}"
Run Code Online (Sandbox Code Playgroud)

我不是JMESPath的专家,我不明白为什么我的查询不会返回结果.存在具有指定域作为别名的分发.

amazon-web-services amazon-cloudfront aws-cli jmespath

7
推荐指数
1
解决办法
1039
查看次数

如何在jmespath查询中获取数组中的唯一值?

在aws cli jmespath查询中,例如输出["a","a","b","a","b"],如何提取它的唯一值["a","b"]

amazon-web-services aws-cli jmespath

7
推荐指数
2
解决办法
1311
查看次数

具有多个匹配项的JMESPath JSON过滤器

我有一个看起来有点像这样的json块(你猜到了AWS)

{ "Vpcs":[ 
  {
    "VpcId":"vpc-blabla1",
    "OtherKey":"Value"
  },
  {
    "VpcId":"vpc-blabla2",
    "OtherKey":"Value"
  },
  {
    "VpcId":"vpc-blabla3",
    "OtherKey":"Value"
  },
  {
    "VpcId":"vpc-blabla4",
    "OtherKey":"Value"
  }]
}
Run Code Online (Sandbox Code Playgroud)

我想使用JMESPath获取vpc-blabla1和vpc-blabla3的OtherKey值(示例,可以是任何vpc-id列表)

我可以使用JMESpath过滤器获得blabla1

Vpcs[?VpcId=='blabla1'].OtherKey
Run Code Online (Sandbox Code Playgroud)

但我找不到多个值的语法?我试过了Or语法|| 和复合语法| 但都不起作用? - 见下面我尝试过的事情.

 Vpcs[?VpcId=='blabla1' || 'blabla1'].OtherKey
 Vpcs[?VpcId=='blabla1' || ?VpcId=='blabla1'].OtherKey
 Vpcs[(?VpcId=='blabla1') || (?VpcId=='blabla1')].OtherKey
 Vpcs[?VpcId=='blabla1' | ?VpcId=='blabla1'].OtherKey
Run Code Online (Sandbox Code Playgroud)

有什么建议?这是可能的还是我将不得不一次收集一个结果集并重新组合我想要的结果?

json aws-cloudformation jmespath

7
推荐指数
1
解决办法
2639
查看次数

JMESPath中的动态/计算键?

从ES2015具有计算的属性Array.reduce / Array.map / Object.assign,您可以执行以下操作:

[{name: 'foo', age: 43}, {name: 'bar', age: 55}].map(
    o => ({[o.name]: o.age})).reduce((a, b) => Object.assign(a,b), {})
Run Code Online (Sandbox Code Playgroud)

…并获得:

{ foo: 43, bar: 55 }
Run Code Online (Sandbox Code Playgroud)

如何从JMESPath获得此信息?


尝试:

$echo '[{"name": "foo", "age": 43}, {"name": "bar", "age": 55}]' | jp [].{name:age}
[
  {
    "name": 43
  },
  {
    "name": 55
  }
]
Run Code Online (Sandbox Code Playgroud)

javascript arrays computed-properties jmespath

7
推荐指数
1
解决办法
276
查看次数

JMESPath-将原始字符串解析为对象

我有一个使用JMESPath解析的对象,其中属性的值是编码为字符串的JSON对象。我希望能够将该字符串属性解析为JSON对象,并仅使用JMESPath来使用它(我知道我可以使用JSON编码器解析该值)。

这是对象:

{
    "ARN": "arn:aws:secretsmanager:us-east-1:xxxxx:secret:todobackend/db/credentials-AP57Kn",
    "Name": "todobackend/db/credentials",
    "VersionId": "c95fae54-e7b4-4c7f-80d6-2c5649f86570",
    "SecretString": "{\"MYSQL_USER\":\"todobackend\",\"MYSQL_PASSWORD\":\"password\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1523276277.046
}
Run Code Online (Sandbox Code Playgroud)

所以我想将SecretString属性解析为JSON对象。

关于这是否可能的任何想法?

jmespath

7
推荐指数
1
解决办法
347
查看次数

如何在 jmespath 中对字符串执行子字符串之类的函数

  • 我想知道 JMESPATH 中是否有可以利用的子字符串函数(由 az cli 支持)。
  • 我有以下 az cli 请求,我只想提取具有安全组的链接子网的名称,但与其他云提供商不同,azure 不会以相同的方式存储关联的资源名称。

可以在subnet.id节点中提取名称, 如下所示

$ az network nsg show -g my_group -n My_NSG --query "subnets[].id" -o json
[
  "/subscriptions/xxxxxx2/resourceGroups/my_group/providers/Microsoft.Network/virtualNetworks/MY-VNET/subnets/My_SUBNET"
]
Run Code Online (Sandbox Code Playgroud)
  • 我只想 从结果中提取“MY_SUBNET” 。

我知道有一种叫做搜索的东西应该模仿子字符串(此处解释 https://github.com/jmespath/jmespath.jep/issues/5),但它对我不起作用。

$ az network nsg show -g my_group -n My_NSG  --query "subnets[].search(id,'@[120:-1]')" -o json
InvalidArgumentValueError: argument --query: invalid jmespath_type value: "subnets[].search(id,'@[120:-1]')"

CLIInternalError: The command failed with an unexpected error. Here is the traceback:
Unknown function: search()
Run Code Online (Sandbox Code Playgroud)

谢谢


编辑 :

我实际上运行的请求包括其他元素,这就是为什么在新行中使用带有 bash 的子字符串不是我想要的。这是完整查询的示例:

az network …
Run Code Online (Sandbox Code Playgroud)

substring slice jmespath azure-cli2

7
推荐指数
1
解决办法
5953
查看次数