合并jq命令提取JSON字段无输出,求修正方案
合并jq命令提取JSON字段的修正方案
问题描述
需要将两个独立运行正常的jq命令合并为一个,提取指定JSON字段,但合并后的命令无法输出结果。
原命令1(提取基础属性)
jq -r '.objects[] | "\(.name),\(.uid),\(.type),\(.\"ipv4-address\"),\(.\"nat-settings\".\"ipv4-address\"),\(.\"nat-settings\".\"ipv6-address\"),\(.\"nat-settings\".\"install-on\"),\(.\"nat-settings\".method)"'
原命令2(提取所属组名)
jq -r '.objects[].groups[].name'
失败的合并命令
jq -r '.objects[] | "\(.name),\(.uid),\(.type),\(.[\"ipv4-address\"]),\(.[\"nat-settings\"][\"ipv4-address\"]),\(.[\"nat-settings\"][\"ipv6-address\"]),\(.[\"nat-settings\"][\"install-on\"]),\(.[\"nat-settings\"].method),\(.groups[]?.name)"'
输入JSON
{ "from" : 1, "to" : 1, "total" : 1, "objects" : [ { "uid" : "11c758bf-15d7-47ba-af1a-200ffa171587", "name" : "BL_2.2.2.2", "type" : "host", "domain" : { "uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde", "name" : "SMC User", "domain-type" : "domain" }, "ipv4-address" : "2.2.2.2", "interfaces" : [ ], "nat-settings" : { "auto-rule" : true, "ipv4-address" : "66.66.66.66", "ipv6-address" : "", "hide-behind" : "ip-address", "install-on" : "All", "method" : "hide" }, "groups" : [ { "uid" : "eebedbc9-ef19-4c68-91d2-cd6ea3fec11d", "name" : "network11111", "type" : "group", "domain" : { "uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde", "name" : "SMC User", "domain-type" : "domain" }, "members" : [ "11c758bf-15d7-47ba-af1a-200ffa171587" ], "groups" : [ ], "comments" : "", "color" : "black", "icon" : "General/group", "tags" : [ ], "meta-info" : { "lock" : "unlocked", "validation-state" : "ok", "last-modify-time" : { "posix" : 1683719146105, "iso-8601" : "2023-05-10T17:15+0530" }, "last-modifier" : "admin", "creation-time" : { "posix" : 1683719146105, "iso-8601" : "2023-05-10T17:15+0530" }, "creator" : "admin" }, "read-only" : false, "available-actions" : { "edit" : "true", "delete" : "true", "clone" : "true" } }, { "uid" : "f04b042d-0a37-4a10-b470-08ca0e18a129", "name" : "workrrorxzdg", "type" : "group", "domain" : { "uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde", "name" : "SMC User", "domain-type" : "domain" }, "members" : [ "11c758bf-15d7-47ba-af1a-200ffa171587" ], "groups" : [ ], "comments" : "", "color" : "black", "icon" : "General/group", "tags" : [ ], "meta-info" : { "lock" : "unlocked", "validation-state" : "ok", "last-modify-time" : { "posix" : 1683719351164, "iso-8601" : "2023-05-10T17:19+0530" }, "last-modifier" : "admin", "creation-time" : { "posix" : 1683719351164, "iso-8601" : "2023-05-10T17:19+0530" }, "creator" : "admin" }, "read-only" : false, "available-actions" : { "edit" : "true", "delete" : "true", "clone" : "true" } } ], "comments" : "", "color" : "black", "icon" : "Objects/host", "tags" : [ ], "meta-info" : { "lock" : "unlocked", "validation-state" : "ok", "last-modify-time" : { "posix" : 1683514434876, "iso-8601" : "2023-05-08T08:23+0530" }, "last-modifier" : "admin", "creation-time" : { "posix" : 1683514434876, "iso-8601" : "2023-05-08T08:23+0530" }, "creator" : "admin" }, "read-only" : false, "available-actions" : { "edit" : "true", "delete" : "true", "clone" : "true" } } ] }
期望输出
BL_2.2.2.2,11c758bf-15d7-47ba-af1a-200ffa171587,host,2.2.2.2,66.66.66.66,,All,hide,network11111,workrrorxzdg
问题原因
失败的合并命令中,\(.groups[]?.name)试图在字符串插值里直接迭代数组元素,这会导致jq将每个组名单独生成一条记录,而非将所有组名拼接成逗号分隔的字符串,最终无法得到期望的单行结果。
修正后的命令
方式1(字符串插值拼接)
将组名数组先提取再拼接成字符串,嵌入原有字段串:
jq -r '.objects[] | "\(.name),\(.uid),\(.type),\(.\"ipv4-address\"),\(.\"nat-settings\".\"ipv4-address\"),\(.\"nat-settings\".\"ipv6-address\"),\(.\"nat-settings\".\"install-on\"),\(.\"nat-settings\".method)\(if .groups then "," + (.groups | map(.name) | join(",")) else "" end)"'
方式2(数组拼接后统一join)
将所有需要的字段放入数组,再合并组名数组,最后统一用逗号连接:
jq -r '.objects[] | [.name, .uid, .type, ."ipv4-address", ."nat-settings"."ipv4-address", ."nat-settings"."ipv6-address", ."nat-settings"."install-on", ."nat-settings".method] + (.groups | map(.name)) | join(",")'
验证结果
执行任意一个修正后的命令,都会输出与期望完全一致的单行结果:
BL_2.2.2.2,11c758bf-15d7-47ba-af1a-200ffa171587,host,2.2.2.2,66.66.66.66,,All,hide,network11111,workrrorxzdg
内容的提问来源于stack exchange,提问作者DrGeek
相关产品推荐
相关产品推荐

