使用 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}