Bash脚本用于创建JSON文件

时间:2016-04-05 15:55:58

标签: arrays json bash jq

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

10.204.99.15
10.204.99.12
10.204.99.41

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

输出 我不知道bash编程。但是我必须编写一个bash脚本来在下面的结构中创建一个JSON文件。这些IP地址必须处于循环中,因此JSON将根据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 + `}]}`

由于 Nissar Sheik

3 个答案:

答案 0 :(得分:1)

除了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

答案 1 :(得分:0)

awk救援!

模板awk解决方案可以

$ awk 'BEGIN{print "header"} 
     NR==FNR{c=NR;next} 
            {print "prefix",$1,"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

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

答案 2 :(得分:0)

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