标签: jmespath

使用jmespath按日期排序

使用json输出:

{
   "Functions":[
      {
         "CodeSha256":"7NBvXXacp9x3aK3cKaI=",
         "FunctionName":"function_1",
         "FunctionArn":"arn:aws:lambda:eu-west-1:1111:function:function_1",
         "LastModified":"2015-02-09T11:35:31.084+0000"
      },
      {
         "CodeSha256":"7NBvXXacKaI=",
         "FunctionName":"function_3",
         "FunctionArn":"arn:aws:lambda:eu-west-1:1111:function:function_3",
         "LastModified":"2015-03-09T11:35:31.084+0000"
      },
      {
         "CodeSha256":"7NBvXXacaK3cKaI=",
         "FunctionName":"function_2",
         "FunctionArn":"arn:aws:lambda:eu-west-1:1111:function:function_2",
         "LastModified":"2015-02-11T11:35:31.084+0000"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

如何返回按LastModified排序的两个最新函数?

amazon-web-services jmespath

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

JMESPathTypeError 在 Ansible 中使用 json_query 过滤器和 starts_with 时出错

我正在尝试过滤从 Ansible 中的 boto3 到达的结果。

当我在没有“[?starts_with(...)]”的结果上使用 json 查询时,它运行良好,但是在添加 starts_with 语法时:

"state_machines[?starts_with(name,'hello')].state_machine_arn"
Run Code Online (Sandbox Code Playgroud)

为了过滤结果:

{u'boto3': u'1.4.4', u'state_machines': 
[{u'state_machine_arn': u'<state machine arn 1>', u'name': u'hello_world_sfn', u'creation_date': u'2017-05-16 14:26:39.088000+00:00'}, 
{u'state_machine_arn': u'<state machine arn 2>', u'name': u'my_private_sfn', u'creation_date': u'2017-06-08 07:25:49.931000+00:00'}, 
{u'state_machine_arn': u'<state machine arn 3>', u'name': u'alex_sfn', u'creation_date': u'2017-06-14 08:35:07.123000+00:00'}], 
u'changed': True}" }
Run Code Online (Sandbox Code Playgroud)

我希望得到第一个 state_machine_arn 值:“状态机 arn 1”

但相反,我得到了例外:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: JMESPathTypeError: In function contains(), invalid type for value: <lamdba_name>, expected …
Run Code Online (Sandbox Code Playgroud)

ansible boto3 jmespath

6
推荐指数
1
解决办法
4177
查看次数

描述实例的排序输出?

我看到了关于这个主题的上一个问题,但答案只是"将其用于脚本语言!",我觉得这不令人满意.我知道JMESPath有sort_by,sort但是,我无法弄清楚如何使用它们.

我有

aws ec2 describe-instances \
   --filters "Name=tag:Group,Values=production" "Name=instance-state-name,Values=running" "Name=tag:Name,Values=prod-*-${CURRENT_SHA}-*" \
   --query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]' \
   --output table
Run Code Online (Sandbox Code Playgroud)

它只是以随机顺序输出正确的数据.我想按数据的最后一列排序,Tag Name,aka Tags[?Key==`Name`],原始形式如下所示:

{
  "Tags": [{
    "Value": "application-server-ab3634b34364a-2",
    "Key": "Name"
  }, {
    "Value": "production",
    "Key": "Group"
  }]
}
Run Code Online (Sandbox Code Playgroud)

思考?

aws-cli jmespath

6
推荐指数
3
解决办法
5044
查看次数

使用 contains 过滤 JMESPath

JMESPath 是 Azure 使用的 JSON 查询语言。

使用http://jmespath.org/给出的自己的示例

{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何列出名称中包含字母"l"或字符串的所有位置"le"?谢谢。

json filtering filter jmespath

6
推荐指数
1
解决办法
4177
查看次数

使用 JMESPath 过滤一个简单的数组

我正在尝试过滤从 Azure CLI 获得的普通列表,并且正在努力构建一个正确过滤列表的查询。一个封装了我要完成的任务的示例是尝试过滤列表[1, 2, 3, 4, 5]并尝试获取大于 2 的所有值。

使用 jq,我可以这样做:echo "[1, 2, 3, 4, 5]" | jq "map(select(. > 2))"[3, 4, 5 ]. 据我所知,问题在于无法在 JMESPath 中指示“当前元素”,而没有特定的键可供参考。

我将如何使用 JMESPath 查询过滤像这样的简单列表?

arrays jmespath map-function

6
推荐指数
1
解决办法
4866
查看次数

JMESPath 搜索嵌套数据中的键

我正在尝试使用 JMESPath 的 Python 库从大型 JSON 文件中提取信息,这里有一个简单得多的示例:

{
  "high_name":"test",
  "sections":[
     {
        "name":"section1",
        "item":"string1"
     },
     {
        "name":"section2",
        "item":"string2",
        "items_sub":[
           {
              "item":"deeper string1"
           }
        ]
     }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试获得这样的输出:

{
  "high_name":"test",
  "sections":[
     {
        "name":"section1",
        "items":[
           "string1"
        ]
     },
     {
        "name":"section2",
        "items":[
           "string1",
           "deeper string1"
        ]
     }
  ]
}
Run Code Online (Sandbox Code Playgroud)

更深的字符串可以是 1 到 3 层深,具体取决于部分的类型。我需要搜索键来获取所有匹配的item名称。

我已经使用 jsonpath-rw-ext 成功完成了此操作,但想知道是否可以使用 JMESPath 来消除对两个库的依赖?

我似乎无法找到一种方法来搜索所有子键,无论它们在 JMESPath 中的级别如何。

JSONPATH-RW-EXT 的工作字符串:

$.sections[*]..item
Run Code Online (Sandbox Code Playgroud)

使用 JMESPath 的最佳尝试(不起作用):

sections[*].*.item
Run Code Online (Sandbox Code Playgroud)

python json python-3.x jmespath

6
推荐指数
0
解决办法
576
查看次数

当这些属性处于同一级别时,aws cli 查询多个属性

我使用以下内容来查找与特定安全组关联的实例的信息

aws ec2 describe-network-interfaces --filters Name=group-id,Values=sg-123456 --output json
Run Code Online (Sandbox Code Playgroud)

这返回(部分输出)

{
    "NetworkInterfaces": [
        {
            "Attachment": {
                "AttachTime": "2019-10-09T07:15:44+00:00",
                "AttachmentId": "eni-attach-01234567",
                "InstanceId": "i-12345678",
                "InstanceOwnerId": "123456789",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1c",
            "Description": "Primary network interface",
            "Groups": [
                {
                    "GroupName": "sg-number1",
                    "GroupId": "sg-123456"
                },
                {
                    "GroupName": "sg-number_2",
                    "GroupId": "sg-654321"
                }
            ],
Run Code Online (Sandbox Code Playgroud)

如果我只想获取实例 ID,那么我可以使用 --query 并沿着树向下查找

--query 'NetworkInterfaces[*].Attachment.InstanceId'
Run Code Online (Sandbox Code Playgroud)

我也可以做类似的事情来获得所有 SG

--query 'NetworkInterfaces[*].Groups[*].GroupId'
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在一个查询中获取 InstanceID 和 Group.GroupName ?

或者更好的是,当这些属性处于同一级别时,如何查询多个属性?

以下内容无效:

--query 'NetworkInterfaces[*].Attachment.InstanceId','NetworkInterfaces[*].Groups[*].GroupName'
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services aws-cli jmespath aws-security-group

6
推荐指数
1
解决办法
2328
查看次数

JMESPath 过滤器表达式中的引用父元素

我有以下 JMESPath 查询

query="Reservations[].Instances[].{ \
    InstanceId: InstanceId, \
    RootDeviceVolumeId: BlockDeviceMappings[?DeviceName==\`/dev/sda1\`] \
       | [].Ebs.VolumeId | [0], \
    RootDeviceName: RootDeviceName \
}"

aws ec2 describe-instances --query $query
Run Code Online (Sandbox Code Playgroud)

给出这样的输出

+------------+------------------+----------------------+
| InstanceId | RootDeviceName   | RootDeviceVolumeId   |
+------------+------------------+----------------------+
|  i-12345678|  /dev/sda1       |  vol-abcdef12        |
|  i-98765432|  /dev/sda1       |  vol-ef123456        |
|  i-23456789|  /dev/sda1       |  vol-fedcba09        |
|  i-aabbccdd|  /dev/xvda       |  None                |
+------------+------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

我想找到一种RootDeviceName从过滤器表达式中引用的方法BlockDeviceMappings,而不是对/dev/sda1设备名称进行硬编码,因为有时是/dev/xvda这样。但是,我找不到在过滤器表达式中引用父元素的方法。

另一种选择是将 and 映射RootDeviceNameInstanceId所有设备的投影上,然后将其通过管道传输到过滤器表达式,但语法似乎也不支持在投影中包含父元素。

我是否遗漏了某些内容,或者这只是 JMESPath 语法的限制?

amazon-web-services aws-cli jmespath

5
推荐指数
1
解决办法
3188
查看次数

ansible json-query路径按内容选择项目

有谁知道在下面的示例JSON中可以使用什么json查询过滤器来选择Tigger的食物?JSON是大规模且相对复杂的AWS blob的简化替代.

一些背景:我很高兴发现Ansible有一个json查询过滤器.鉴于我试图从AWS JSON blob中选择一个元素,这看起来就像我需要的那样.但是我很快遇到了麻烦,因为AWS对象有标签,我需要按标签选择项目.我尝试了相当于Foods[Tags[(Key='For') & (Value='Tigger')]]和类似的选择器路径,但没有设法让它工作.使用独立的JSON-查询库如https://www.npmjs.com/package/json-query我可以使用parent属性,但是,这并不似乎是在Ansible,撇开是从核心理念的偏差JSON查询.

回避问题并使用jsonpath选择器可能会更好.jsonpath类似于json-query,是xpath的翻译.

{ "Foods" :
  [ { "Id": 456
    , "Tags":
      [ {"Key":"For", "Value":"Heffalump"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  , { "Id": 678
    , "Tags":
      [ {"Key":"For", "Value":"Tigger"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  , { "Id": 911
    , "Tags":
      [ {"Key":"For", "Value":"Roo"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

参考文献:

我想用json-query来标记这个问题,但是缺乏这样做的要点.

json ansible jmespath json-query

5
推荐指数
1
解决办法
2万
查看次数

如何过滤Jinja中的字典?

我有一个字典,其中package-name是的字典,一些细节的字典是value

{
        "php7.1-readline": {
            "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1", 
            "origins": [
                "ppa.launchpad.net"
            ], 
            "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1", 
            "www": "http://www.php.net/"
        }, 
        "php7.1-xml": {
            "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1", 
            "origins": [
                "ppa.launchpad.net"
            ], 
            "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1", 
            "www": "http://www.php.net/"
        }, 
        "plymouth": {
            "version": "0.8.8-0ubuntu17.1"
        },
    ....
}
Run Code Online (Sandbox Code Playgroud)

我想将以上内容简化为仅包含latest其属性为-attribute 的包的字典。

似乎json_query是要使用的过滤器,但是我无法弄清楚语法。那里的例子似乎都是在词典列表上操作的,而不是相同词典列表 ...

例如,如果我将上述字典“管道”到中json_query('*.latest'),我会得到实际最新版本的列表

[
  "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
  "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
  "7.1.6-2~ubuntu14.04.1+deb.sury.org+1"
]
Run Code Online (Sandbox Code Playgroud)

我如何获取整个字典元素呢?

有希望吗

dictionary jinja2 ansible jmespath

5
推荐指数
1
解决办法
4931
查看次数