如何在Bash脚本中用jq将JSON键值对导出为指定格式文本文件
解决Bash脚本中jq提取JSON生成键值对格式的问题
核心问题分析
- 原脚本两次调用jq,重复读取大JSON文件,效率极低
- 每次用
>重定向会覆盖文件内容,最终仅保留最后一行输出 - jq调用语法存在冗余(多余的
.参数),且未直接生成X=值的目标格式
最优解决方案(单次jq调用)
针对大JSON文件的场景,核心优化方向是仅调用一次jq,避免重复读取文件;同时直接通过jq生成目标格式,无需bash层面的额外处理。
简单版本(适合固定少量提取项)
修改后的脚本:
#!/usr/bin/env bash TestConfig="[...]/config_test.json" # 清空文件并生成目标格式,仅读取一次JSON jq -r '"X=" + .abc, "Y=" + .xyz' "$TestConfig" > test_sample.txt
- 逻辑说明:用jq直接构造
"X=" + .abc格式的字符串,通过逗号分隔多个输出项,一次生成两行目标内容并写入文件。
扩展版本(适合大量提取项或需要映射关系)
如果后续需要提取更多键,或者JSON键名与输出的变量名(如abc对应X)不一致,可以用映射对象统一管理对应关系:
#!/usr/bin/env bash TestConfig="[...]/config_test.json" # 通过映射对象定义JSON键到输出变量名的对应关系 jq -r ' {"abc": "X", "xyz": "Y"} as $var_map | to_entries[] | select(.key | IN($var_map[])) | "\($var_map[.key])=\(.value)" ' "$TestConfig" > test_sample.txt
- 逻辑说明:
- 定义
$var_map存储JSON键(如abc)到输出变量名(如X)的映射 to_entries[]将JSON对象转为键值对数组select筛选出在映射范围内的键- 拼接成
变量名=值的格式输出
- 定义
验证结果
执行脚本后,查看输出文件:
cat test_sample.txt
将得到预期结果:
X=test1 Y=test2
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

