我有一个JSON输出作为curl命令的一部分生成,并希望根据模式拆分结果文件:
文件内容如下所示
{
"clusters" : [ {
"name" : "subject",
"version" : "XXX",
"services" : [ {
"name" : "initiator",
"config" : {
"items" : [ {
"name" : "enableSecurity",
"value" : "true",
"sensitive" : false
}, {
"name" : "service_config_suppression_server_count_validator",
"value" : "true",
"sensitive" : false
} ]
},
"roles" : [ {
"name" : "intiator-role1",
"type" : "SERVER",
"hostRef" : {
"hostId" : "754389-8989db-8743ty"
},
"config" : {
"items" : [ {
"name" : "role_creds",
"value" : "sdfujnvhdsg87909",
"sensitive" : true
}, {
"name" : "serverId",
"value" : "1",
"sensitive" : false
} ]
},
"roleConfigGroupRef" : {
"roleConfigGroupName" : "initiator-group"
}
} ]
} ]
},
....bunch of lines in between
..........
{
"name" : "subject2",
"version" : "XXX",
"services" : [ {
"name" : "ingestor",
"config" : {
"items" : [ ]
},
"roles" : [ {
"name" : "ingestor-role1",
"type" : "service",
"hostRef" : {
"hostId" : "754389-8989db-8743ty"
},
"config" : {
"items" : [ {
"name" : "role_code",
"value" : "sdfujnvhdsg67340",
"sensitive" : true
} ]
},
"roleConfigGroupRef" : {
"roleConfigGroupName" : "ingestor-group"
}
} ]
} ]
}
]
}每当字符串"version":"XXX“重复时,我想将这个文件拆分为不同的文件。因此,生成文件内容应该从字符串前两行开始,直到下一个字符串出现。
这只是一个巨大的json文件的摘录,在这个数据集中,我只保留了两个字符串模式,因此需要两个包含以下内容的文件:
文件1应具有:
"clusters" : [ {
"name" : "subject",
"version" : "XXX",
"services" : [ {
"name" : "initiator",
"config" : {
"items" : [ {
"name" : "enableSecurity",
"value" : "true",
"sensitive" : false
}, {
"name" : "service_config_suppression_server_count_validator",
"value" : "true",
"sensitive" : false
} ]
},
"roles" : [ {
"name" : "intiator-role1",
"type" : "SERVER",
"hostRef" : {
"hostId" : "754389-8989db-8743ty"
},
"config" : {
"items" : [ {
"name" : "role_creds",
"value" : "sdfujnvhdsg87909",
"sensitive" : true
}, {
"name" : "serverId",
"value" : "1",
"sensitive" : false
} ]
},
"roleConfigGroupRef" : {
"roleConfigGroupName" : "initiator-group"
}
} ]
} ]
},
....bunch of lines in between
..........和文件2应该有
{
"name" : "subject2",
"version" : "XXX",
"services" : [ {
"name" : "ingestor",
"config" : {
"items" : [ ]
},
"roles" : [ {
"name" : "ingestor-role1",
"type" : "service",
"hostRef" : {
"hostId" : "754389-8989db-8743ty"
},
"config" : {
"items" : [ {
"name" : "role_code",
"value" : "sdfujnvhdsg67340",
"sensitive" : true
} ]
},
"roleConfigGroupRef" : {
"roleConfigGroupName" : "ingestor-group"
}
} ]
} ]
}
]
}希望通过bash实现这一点,最好是awk,提前谢谢。
发布于 2018-11-01 12:42:03
如果您只想在每次"version“重复时将文件拆分成一个新文件,在"version”之前以2行开头和结尾,您可能可以这样做:
#!/bin/bash
awk '
BEGIN {
i = 0
}
{
prevLn2 = prevLn1
prevLn1 = currentLn
currentLn = $0
if(currentLn ~ /^[ ]{0,}\"version\"/) {
i++
}
if(i > 0) {
print prevLn2 >> "file" i ".txt"
}
}
'这会将前面的两行保存在变量prevLn1和prevLn2中,并且对于输入中的每一行,检查当前行是否与正则表达式版本匹配-这意味着行的开头,然后是零个或多个空格,以及文字文本“^[ ]{0,}\"version\"”。如果匹配,则增加变量i。然后将前面的第二行附加到使用变量i命名的文件。
将代码保存在一个文件中,例如splitfile.sh,并使其成为可执行的chmod 755 splitfile.sh。用法:./splitfile.sh < jsonfile.txt将生成文件file1.txt,file2.txt,file3.txt...在同一目录中。
https://stackoverflow.com/questions/53073330
复制相似问题