You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:45:04