jq查询中如何内联调用外部命令完成JSON字段值转换
jq调用外部命令处理字段值方案
1. 原生jq是否支持内联执行外部命令
原生官方版本的jq不支持在查询表达式内直接调用外部系统命令。jq的设计定位是轻量纯JSON处理工具,内置语法没有提供执行外部进程、调用shell命令的接口,所有字段转换逻辑只能通过jq内置的算子、函数实现,无法直接在jq语句里嵌入dig这类命令调用。
2. 极简bash结合jq的实现方案
不需要手动构建全量映射表、不需要硬编码字段遍历逻辑,用流式处理+jq原生JSON组装的方案即可,代码量少且不会出现手动拼JSON导致的格式错误,具体实现:
# 若原始JSON存储在文件中,将下方输入替换为你的文件路径即可 cat domains.json | # 第一步:将原JSON拆为【键\t域名】的平面TSV格式,适配任意数量、任意名称的字段 jq -r 'to_entries[] | [.key, .value] | @tsv' | # 第二步:逐行解析域名拿到IP,输出【键\t域名\tIP】格式 while IFS=$'\t' read -r key domain; do # 取dig返回的第一条IP记录,多IP场景可按需调整取值逻辑 ip=$(dig +short "$domain" | head -n1) printf '%s\t%s\t%s\n' "$key" "$domain" "$ip" done | # 第三步:将解析结果自动组装为目标JSON结构 jq -Rn ' reduce inputs as $line ( {}; ($line | split("\t")) as $seg | .[$seg[0]] = $seg[2] ) '
方案说明
- 无硬编码逻辑:自动适配原JSON里的所有顶层字段,不需要提前知道hostA、hostB这类字段名
- 格式安全:最终JSON完全由jq生成,自动处理特殊字符转义,不会出现语法错误
- 易扩展:如果需要加解析失败容错,只需要在while循环里判断
ip是否为空即可,比如解析失败时保留原域名值:ip=$(dig +short "$domain" | head -n1) ip=${ip:-$domain} # 解析失败则用原域名兜底
执行示例:输入为
{"hostA":"baidu.com","hostB":"qq.com"}时,输出为符合要求的IP映射JSON结构。
内容的提问来源于stack exchange,提问作者Vetal
相关产品推荐
相关产品推荐

