如何整合jq命令将ThreatFox的full_ip-port.json转为完整CSV
将ThreatFox的IP:Port JSON数据导出为包含ID的规范CSV
我需要把一个大型JSON文件(压缩包内的full_ip-port.json)导出为CSV格式。该JSON是结构规整的单个对象,以下是用[to_entries[0,1]] | from_entries提取的代表性片段:
{ "1122595": [ { "ioc_value": "103.100.159.212:443", "ioc_type": "ip:port", "threat_type": "botnet_cc", "malware": "win.cobalt_strike", "malware_alias": "Agentemis,BEACON,CobaltStrike,cobeacon", "malware_printable": "Cobalt Strike", "first_seen_utc": "2023-05-27 02:31:39", "last_seen_utc": null, "confidence_level": 100, "reference": null, "tags": "CLOUDIE-AS-AP Cloudie Limited,CobaltStrike,cs-watermark-666666", "anonymous": "0", "reporter": "drb_ra" } ], "1122593": [ { "ioc_value": "167.172.72.193:23", "ioc_type": "ip:port", "threat_type": "botnet_cc", "malware": "elf.bashlite", "malware_alias": "gayfgt,Gafgyt,qbot,torlus,lizkebab", "malware_printable": "Bashlite", "first_seen_utc": "2023-05-27 01:40:04", "last_seen_utc": null, "confidence_level": 75, "reference": "https://bazaar.abuse.ch/sample/6c901ba15327da68159712a9726807fb08868309726c55ef202818bfde22a5a7/", "tags": "Gafgyt", "anonymous": "0", "reporter": "abuse_ch" } ] }
我已经写了两段jq命令,分别用来获取数据内容和外层ID:
- 获取内容的命令:
jq -r '.[] | .[] | to_entries | map(.value) | @csv' full_ip-port.json - 获取ID的命令:
jq -r '{id: (. | keys[])} | to_entries | map(.value) | @csv' full_ip-port.json
现在需要把这两部分整合,生成一份字段顺序一致、包含ID的规范CSV。
解决方案:整合的jq命令
直接用一段jq命令完成ID与数据的合并,同时输出规范的表头和数据行:
jq -r ' # 提取原数据的所有字段名 (to_entries[0].value[0] | keys) as $original_fields # 组合完整字段列表(新增id字段) | ["id"] + $original_fields as $all_fields # 输出CSV表头 | $all_fields | @csv # 遍历每个键值对,将ID与对应数据合并后输出 | to_entries[] | .key as $id | .value[] | [$id] + [.[$original_fields[]]] | @csv ' full_ip-port.json
命令说明
- 表头处理:从第一个数据条目中提取原有字段名,加上新增的
id字段,生成完整的CSV表头,确保后续数据行的字段顺序与表头完全匹配。 - 数据合并:遍历JSON的每个外层键(即ID),将ID作为单独字段,与对应数组内的对象数据合并,按表头顺序提取所有值后转为CSV格式。
- 空值处理:jq的
@csv会自动将null值转为空字符串,符合CSV规范。
这样处理后,就能直接得到包含ID、字段顺序统一的规范CSV文件,无需分开处理再手动合并,避免了数据对应错误的风险。
内容的提问来源于stack exchange,提问作者user3022917
相关产品推荐
相关产品推荐

