使用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排序的两个最新函数?
我正在尝试过滤从 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) 我看到了关于这个主题的上一个问题,但答案只是"将其用于脚本语言!",我觉得这不令人满意.我知道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)
思考?
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"?谢谢。
我正在尝试过滤从 Azure CLI 获得的普通列表,并且正在努力构建一个正确过滤列表的查询。一个封装了我要完成的任务的示例是尝试过滤列表[1, 2, 3, 4, 5]并尝试获取大于 2 的所有值。
使用 jq,我可以这样做:echo "[1, 2, 3, 4, 5]" | jq "map(select(. > 2))"给[3, 4, 5 ]. 据我所知,问题在于无法在 JMESPath 中指示“当前元素”,而没有特定的键可供参考。
我将如何使用 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) 我使用以下内容来查找与特定安全组关联的实例的信息
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
我有以下 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 映射RootDeviceName到InstanceId所有设备的投影上,然后将其通过管道传输到过滤器表达式,但语法似乎也不支持在投影中包含父元素。
我是否遗漏了某些内容,或者这只是 JMESPath 语法的限制?
有谁知道在下面的示例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来标记这个问题,但是缺乏这样做的要点.
我有一个字典,其中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)
我如何获取整个字典元素呢?
有希望吗
jmespath ×10
ansible ×3
aws-cli ×3
json ×3
amazon-ec2 ×1
arrays ×1
boto3 ×1
dictionary ×1
filter ×1
filtering ×1
jinja2 ×1
json-query ×1
map-function ×1
python ×1
python-3.x ×1