Bash 创建 JSON 文件的脚本

Bash Script to create a JSON file

输入: 我有一个名为 'myseedips' 的文件名,其中包含一组 IP 地址,结构如下

10.204.99.15
10.204.99.12
10.204.99.41

这些可以是逐行 'n' 个 IP 地址。

输出 我对 bash 编程一窍不通。但是我必须编写一个 bash 脚本来在下面的结构中创建一个 JSON 文件。这些 IP 地址必须处于循环中,以便 JSON 将 change/extend 取决于 myseedips 文件的长度。

"cassandra": {
        "nodes": [
         {"ip_address": "10.204.99.15","type": "seed"},
         {"ip_address": "10.204.99.12","type": "seed"},
         {"ip_address": "10.204.99.41","type": "seed"}]
    },

还需要添加逻辑以在除最后一个节点之外的所有节点的每个节点末尾添加逗号。如果只有一个节点,不要添加逗号。

示例: 可能类似于下面的代码逻辑,但是在 bash 编程中。

j string
j = `"cassandra": {"nodes": [`
for i =0;i<len(ips);i++ {
    j = j + `{"ip_address": "` + ips[i] + `","type": "seed"},`
}
j = j + `}]}`

谢谢 尼萨尔酋长

awk 救援!

一个模板awk解决方案即可

$ awk 'BEGIN{print "header"} 
     NR==FNR{c=NR;next} 
            {print "prefix",,"suffix" (FNR<c?",":"]")}
         END{print "footer"}' myseedips{,}

header
prefix 10.204.99.15 suffix,
prefix 10.204.99.12 suffix,
prefix 10.204.99.41 suffix]
footer

您可以替换页眉、页脚、前缀和后缀。

使用 jq,您需要额外的传递才能将原始文本转换为可用的数组,但很简单:

$ jq -R '.' myseedips | jq -s '{cassandra:{nodes:map({ip_address:.,type:"seed"})}}'

这会产生以下结果:

{
  "cassandra": {
    "nodes": [
      {
        "ip_address": "10.204.99.15",
        "type": "seed"
      },
      {
        "ip_address": "10.204.99.12",
        "type": "seed"
      },
      {
        "ip_address": "10.204.99.41",
        "type": "seed"
      }
    ]
  }
}

关于 Jeff 的回答,请注意,转换可以通过一次调用 jq 来完成。如果您的 jq 有 inputs 过滤器:

jq -Rn '[inputs] | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' 

否则:

jq -Rs 'split("\n") | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' ips.txt