Linux Bash中如何用jq将JSON数组提取值转为单行列表?
提取JSON中服务镜像名称和标签为单行列表的最简方案
场景与需求
现有JSON文件 service-def-test.json,内容如下:
{ "definition": { "services": [{ "image": { "name": "img1", "tag": "2.0.1" } }, { "image": { "name": "img2", "tag": "1.4.0" } }, { "image": { "name": "img3", "tag": "1.2.5" } } ] } }
需要将其中services数组内的image.name和image.tag分别提取为单行列表格式,方便后续导出为Shell变量:
images=[img1, img2, img3] tags=[2.0.1, 1.4.0, 1.2.5]
当前使用jq命令仅能提取多行结果:
jq -r .definition.services[].image.name service-def-test.json
输出为:
img1 img2 img3
最简实现方案
方案1:纯jq直接生成目标格式
无需额外工具,用jq的字符串拼接和join函数直接输出需要的格式:
jq -r ' "images=[" + (.definition.services[].image.name | join(", ")) + "]", "tags=[" + (.definition.services[].image.tag | join(", ")) + "]" ' service-def-test.json
执行后直接输出:
images=[img1, img2, img3] tags=[2.0.1, 1.4.0, 1.2.5]
如果需要直接将结果赋值为Shell变量,可以用eval配合:
eval $(jq -r ' "images=[\(.definition.services[].image.name | join(", "))]", "tags=[\(.definition.services[].image.tag | join(", "))]" ' service-def-test.json)
执行后即可在当前Shell环境中使用$images和$tags变量。
方案2:jq+Shell工具快速转换
如果偏好先用jq提取多行结果,再用简单Shell工具转成单行,推荐用paste命令:
# 生成images变量 images="[$(jq -r .definition.services[].image.name service-def-test.json | paste -sd ", " -)]" # 生成tags变量 tags="[$(jq -r .definition.services[].image.tag service-def-test.json | paste -sd ", " -)]" # 验证输出 echo $images echo $tags
paste -sd ", " -的作用是将多行输入用", "连接成单行,再拼接前后方括号即可得到目标格式。
内容的提问来源于stack exchange,提问作者EricBDev
相关产品推荐
相关产品推荐

