嵌套数组结构的 JMESPath 查询
JMESPath query for nested array structures
由于 aws logs get-query-results,我有以下数据结构:
{
"status": "Complete",
"statistics": {
"recordsMatched": 2.0,
"recordsScanned": 13281.0,
"bytesScanned": 7526096.0
},
"results": [
[
{
"field": "time",
"value": "2019-01-31T21:53:01.136Z"
},
{
"field": "requestId",
"value": "a9c233f7-0b1b-3326-9b0f-eba428e4572c"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
[
{
"field": "time",
"value": "2019-01-25T13:13:01.062Z"
},
{
"field": "requestId",
"value": "a4332628-1b9b-a9c2-0feb-0cd4a3f7cb63"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
]
}
AWS CLI 支持使用 JMESPath 语言过滤输出。我需要应用查询字符串,以在 returned "results" 中过滤包含 "callerId" 作为 "field" 的对象,检索 "value" 属性 并获得以下输出:
[
{
callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]
我做的第一步是用查询字符串修饰结果数组:results[]
这将读取其他根属性(状态、统计信息)和 return 只有一个包含所有 {field: ..., value: ...} 相似对象的大数组。但在此之后我无法正确过滤那些匹配字段=="callerId"的对象。除其他外,我尝试了以下表达式但没有成功:
'results[][?field=="callerId"]'
'results[][*][?field=="callerId"]'
'results[].{ callerId: @[?field=="callerId"].value }'
我不是 JMESPath 方面的专家,我正在学习 jmespath.org 网站的教程,但无法让它发挥作用。
谢谢!
我无法完全重现,因为我的日志流中没有相同的日志,但我能够使用 jq 并将示例 JSON 对象放入文件中来做到这一点
cat sample_output.json | jq '.results[][] | select(.field=="callerId") | .value'
输出:
"a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
"a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
您可以将 aws cli 的输出通过管道传输到 jq。
我能够非常接近本机 JMESPath 查询并使用本网站中的内置编辑器
http://jmespath.org/examples.html#filtering-and-selecting-nested-data
results[*][?field==`callerId`][]
输出:
[
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]
但我不确定如何让 callerId
成为键,而值成为另一个键的值。
使用 jq 是一件好事,因为它是更完整的语言,但如果您想使用 JMES Path,请在此处解决:
results[*][?field=='callerId'].{callerId: value}[]
获得:
[
{
"callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
"callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]
由于 aws logs get-query-results,我有以下数据结构:
{
"status": "Complete",
"statistics": {
"recordsMatched": 2.0,
"recordsScanned": 13281.0,
"bytesScanned": 7526096.0
},
"results": [
[
{
"field": "time",
"value": "2019-01-31T21:53:01.136Z"
},
{
"field": "requestId",
"value": "a9c233f7-0b1b-3326-9b0f-eba428e4572c"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
[
{
"field": "time",
"value": "2019-01-25T13:13:01.062Z"
},
{
"field": "requestId",
"value": "a4332628-1b9b-a9c2-0feb-0cd4a3f7cb63"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
]
}
AWS CLI 支持使用 JMESPath 语言过滤输出。我需要应用查询字符串,以在 returned "results" 中过滤包含 "callerId" 作为 "field" 的对象,检索 "value" 属性 并获得以下输出:
[
{
callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]
我做的第一步是用查询字符串修饰结果数组:results[]
这将读取其他根属性(状态、统计信息)和 return 只有一个包含所有 {field: ..., value: ...} 相似对象的大数组。但在此之后我无法正确过滤那些匹配字段=="callerId"的对象。除其他外,我尝试了以下表达式但没有成功:
'results[][?field=="callerId"]'
'results[][*][?field=="callerId"]'
'results[].{ callerId: @[?field=="callerId"].value }'
我不是 JMESPath 方面的专家,我正在学习 jmespath.org 网站的教程,但无法让它发挥作用。
谢谢!
我无法完全重现,因为我的日志流中没有相同的日志,但我能够使用 jq 并将示例 JSON 对象放入文件中来做到这一点
cat sample_output.json | jq '.results[][] | select(.field=="callerId") | .value'
输出:
"a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
"a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
您可以将 aws cli 的输出通过管道传输到 jq。
我能够非常接近本机 JMESPath 查询并使用本网站中的内置编辑器 http://jmespath.org/examples.html#filtering-and-selecting-nested-data
results[*][?field==`callerId`][]
输出:
[
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]
但我不确定如何让 callerId
成为键,而值成为另一个键的值。
使用 jq 是一件好事,因为它是更完整的语言,但如果您想使用 JMES Path,请在此处解决:
results[*][?field=='callerId'].{callerId: value}[]
获得:
[
{
"callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
},
{
"callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
]