如何用jq map()正确处理EVTX转JSON后的子对象?
处理EVTX转JSON后的EventData.Data数组,生成键值对
问题场景
我在Linux环境下构建处理管道,将Windows .evtx二进制日志转换为可搜索过滤的JSON格式,当前bash管道为:
./evtx_dump.py <File.evtx> \ | sed -e 's/version="1.1"/version="1.0"/g' \ | yq -p xml -o json \ | sed -e 's/+@//g' -e 's/+//g' \ | jq '.Events' > <File.json>
转换后的JSON输出中,.Event[].EventData.Data为数组结构,部分元素无content字段(推测存在该字段代表值为TRUE)。之前尝试的jq过滤器要么只能处理单个事件、因空值报错,要么无法正确实现键值对映射。
正确的jq解决方案
方案1:保留完整Event结构,替换Data数组为键值对
这个过滤器会遍历每个Event,将其EventData.Data数组转换为键值对对象,同时处理content字段缺失的情况:
.Event[] | .EventData.Data = (.EventData.Data | map( { (.Name|tostring): (.content // "true" | tostring) } ) | add)
逻辑说明:
.Event[]:遍历所有Event对象.EventData.Data = (...):用处理后的键值对对象替换原Data数组map(...):遍历Data数组中的每个元素(.Name|tostring):确保Name字段为字符串类型(.content // "true" | tostring):如果content存在则取其值,不存在则用"true"填充,同时转成字符串避免类型问题{ (.Name): ... }:将每个元素转换为单个键值对对象
| add:把所有单个键值对对象合并为一个完整的对象
方案2:仅提取每个Event的EventData键值对
如果不需要保留原Event的其他结构,只想输出处理后的键值对集合:
.Event[] | .EventData.Data | map( { (.Name|tostring): (.content // "true" | tostring) } ) | add
原写法问题分析
- 第一个过滤器
.Event[].EventData.Data | map(...) | add:会把所有Event的Data数组元素合并到一起,而非每个Event单独处理,最终得到的是所有事件的混合键值对,不符合单个事件的处理需求。 - 第二个过滤器
.Event[] | map(...) | add:map作用于Event对象本身,而非EventData.Data数组,逻辑错误导致无法遍历Data元素实现映射。
内容的提问来源于stack exchange,提问作者user31024636
相关产品推荐
相关产品推荐

