将 JSON "Pretty" 格式解析为一行
Parsing JSON "Pretty" format to one liner
我在我的一个系统上 运行 命令,它输出 JSON "pretty" 格式,如下所示:
[
{
"server": "servename1",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
},
{
"server": "servename2",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
},
{
"server": "servename3",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
}
]
我需要像这样在一行中解析这些段落:
[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]
最简单的方法是什么?我尝试使用 SED 和 JQ,但无法使用。
如果您的输入总是那么规律:
$ awk '{ORS=(/},|\]/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},")}1' file
[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]
如果这对您的真实输入不起作用,请编辑您的问题以包含更具代表性的样本输入。
要跳过 [
和 ]
行:
$ awk '!/^[][]/{ORS=(/},/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},\n"); print}' file
{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
如果你对换行符没有问题,你可以在 jq 中试试这个 JSON:
$ jq -c ".[]" test.json
{"server":"servename1","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename2","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename3","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
请注意,我不得不引用您示例中的 IP 地址,因为您发布的 JSON 无效 JSON。
我在我的一个系统上 运行 命令,它输出 JSON "pretty" 格式,如下所示:
[
{
"server": "servename1",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
},
{
"server": "servename2",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
},
{
"server": "servename3",
"i.p": 127.0.0.1,
"domain": "generic",
"OS": "RHEL",
"Version": 7.0
}
]
我需要像这样在一行中解析这些段落:
[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]
最简单的方法是什么?我尝试使用 SED 和 JQ,但无法使用。
如果您的输入总是那么规律:
$ awk '{ORS=(/},|\]/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},")}1' file
[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]
如果这对您的真实输入不起作用,请编辑您的问题以包含更具代表性的样本输入。
要跳过 [
和 ]
行:
$ awk '!/^[][]/{ORS=(/},/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},\n"); print}' file
{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
如果你对换行符没有问题,你可以在 jq 中试试这个 JSON:
$ jq -c ".[]" test.json
{"server":"servename1","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename2","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename3","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
请注意,我不得不引用您示例中的 IP 地址,因为您发布的 JSON 无效 JSON。