使用 jq 格式化 json 输出
Format json output with jq
我正在编写一个脚本,它将从我的 Kubernetes 集群中获取某些信息。
以下命令
kubectl get --context <my-context> svc --selector='<my-selectors>' -o json |
jq -r ' .items[]| {Name:.metadata.name, Port:.spec.ports[0].port} + {Group: "test", Group: "group name", SSLMode: "prefer", MaintenanceDB: "postgres"} '>file.json
会输出这样的东西
{
"Name": "db-name",
"Port": 3000,
"Group": "group name",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
{
"Name": "db-name",
"Port": 5432,
"Group": "group name",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
我一直在努力把上面的内容变成下面的格式
{
"Servers":{
"1": {
"Name": "db-name",
"Port": 3000,
"Group": "Server Group 1",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
},
"2": {
"Name": "db-name",
"Port": 5432,
"Group": "Server Group 1",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
}
}
才刚刚发现jq,所以我试过的几件事都不成功。不胜感激。
给定问题中显示的 JSON 个对象流,以下 jq 过滤器将产生所需的输出,假设该流以某种方式被“吞噬”:
. as $in
| reduce range(0;length) as $i ({};.[$i+1|tostring] = $in[$i])
| {Servers: .}
为了避免必须调用 jq 两次,您可以将过滤器放在方括号中,然后将其通过管道传递到上面;更好的是,你可以简化一切,例如按照以下几行:
.items
| [to_entries[]
| {(.key+1|tostring): .value}
| map_values(
{Name:.metadata.name,
Port:.spec.ports[0].port,
Group: "group name",
SSLMode: "prefer",
MaintenanceDB: "postgres"}) ]
| {Servers: add}
我正在编写一个脚本,它将从我的 Kubernetes 集群中获取某些信息。
以下命令
kubectl get --context <my-context> svc --selector='<my-selectors>' -o json |
jq -r ' .items[]| {Name:.metadata.name, Port:.spec.ports[0].port} + {Group: "test", Group: "group name", SSLMode: "prefer", MaintenanceDB: "postgres"} '>file.json
会输出这样的东西
{
"Name": "db-name",
"Port": 3000,
"Group": "group name",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
{
"Name": "db-name",
"Port": 5432,
"Group": "group name",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
我一直在努力把上面的内容变成下面的格式
{
"Servers":{
"1": {
"Name": "db-name",
"Port": 3000,
"Group": "Server Group 1",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
},
"2": {
"Name": "db-name",
"Port": 5432,
"Group": "Server Group 1",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
}
}
才刚刚发现jq,所以我试过的几件事都不成功。不胜感激。
给定问题中显示的 JSON 个对象流,以下 jq 过滤器将产生所需的输出,假设该流以某种方式被“吞噬”:
. as $in
| reduce range(0;length) as $i ({};.[$i+1|tostring] = $in[$i])
| {Servers: .}
为了避免必须调用 jq 两次,您可以将过滤器放在方括号中,然后将其通过管道传递到上面;更好的是,你可以简化一切,例如按照以下几行:
.items
| [to_entries[]
| {(.key+1|tostring): .value}
| map_values(
{Name:.metadata.name,
Port:.spec.ports[0].port,
Group: "group name",
SSLMode: "prefer",
MaintenanceDB: "postgres"}) ]
| {Servers: add}