格式 json 输出 jq

format json output jq

我正在 Kubernetes 中部署 redis-commander。我正在为 Redis-Commander 创建一个配置连接文件。我的 bash 脚本中有一个命令,用于根据 link 获取连接文件所需的参数。设法通过哨兵在 redis-commander 和 1 个 redis 服务器之间进行本地连接,但在非产品中还有更多,所以我需要配置下面的命令以获得所需的 json 输出。

这个命令

kubectl get svc --selector='app.kubernetes.io/component=sentinel' --all-namespaces -o json |
jq -r '
.items[]
   | {label:"my-label",
   sentinels: [{host: (.metadata.name + "."
   + .metadata.namespace + "."
   + "svc" + "."
   + "cluster" + "."
   + "local"),port: .spec.ports[0].port}],
   sentinelName:"mymaster",
   dbIndex: 0
   }
| {connections: [.]}'

有类似的输出(我已经更改了名称部分):

{
  "connections": [
    {
      "label": "my-label",
      "sentinels": [
        {
          "host": "name1.development.svc.cluster.local",
          "port": 26379
        }
      ],
      "sentinelName": "mymaster",
      "dbIndex": 0
    }
  ]
}
{
  "connections": [
    {
      "label": "my-label",
      "sentinels": [
        {
          "host": "name2.development.svc.cluster.local",
          "port": 26379
        }
      ],
      "sentinelName": "mymaster",
      "dbIndex": 0
    }
  ]
}
{
  "connections": [
    {
      "label": "my-label",
      "sentinels": [
        {
          "host": "name3.staging.svc.cluster.local",
          "port": 26379
        }
      ],
      "sentinelName": "mymaster",
      "dbIndex": 0
    }
  ]
}

我要实现的输出是这样的:

{
  "connections": [
    {
      "label": "my-label",
      "sentinels": [
        {
          "host": "name1.development.svc.cluster.local",
          "port": 26379
        },
        {
          "host": "name2.development.svc.cluster.local",
          "port": 26379
        },
        {
          "host": "name3.staging.svc.cluster.local",
          "port": 26379
        }
      ],
      "sentinelName": "mymaster",
      "dbIndex": 0
    }
  ]
}

没有多次使用 jq,因此不胜感激。

map 与 .items 一起使用可能是更好的方法,方法如下:

.items
| {
    label: "my-label",
    sentinels: map(
      { host: (.metadata.name + "."
          + .metadata.namespace + "."
          + "svc" + "."
          + "cluster" + "."
          + "local"),
        port: .spec.ports[0].port
      } ),
    sentinelName: "mymaster",
    dbIndex: 0
  }
| {connections: [.] }