我如何使用bash命令“kubectl集群信息转储”的输出转换为有效的JSON?
由于是,现在,它出来像这样(极其略):
{
"selfLink": "/api/v1/nodes",
"resourceVersion": "24393",
"Items": [tons of json]
}
{
"selfLink": "/api/v1/namespaces/default/events",
"resourceVersion": "24393",
"Items": [tons of json]
}
...
{
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "24393",
"Items": [tons of json]
}
我想通过awk或者sed管这个命令的输出到这个输出到有效的JSON翻译,是这样的:
[{"k","v","k2","v2"},
{"k","v","k2","v2"},
...
{"k","v","k2","v2"}]
我可以很容易使用JSON解析器像JQ解析
如果如所示的布局,则:
kubectl cluster-info dump |
{ echo "["; sed -e 's/^}$/},/' -e '$s/^},$/}/'; echo "]"; }
会做的工作。这依赖于“吨JSON”不是只有}
中间包含的任何行。由于JSON解析器不能用空格和换行担心,没有必要做更多。
您可避免与外壳{ …; }
符号:
kubectl cluster-info dump |
sed -e '1s/^/[/' -e 's/^}$/},/' -e '$s/^},$/}]/'
第一sed
命令添加[
到第一行的开始;每行包括只在第二个变化}
到},
(包括最后一行),但第三撤销的损害,并增加了]
代替。
你甚至可以结合这些-e
命令到一个用分号隔开。就个人而言,我更喜欢单独-e
选项,使其easer阅读。如果他们是更复杂的,我把每一个在其自己的行,用反斜杠继续多行全面指挥。
管你的命令的输出jq:
jq -s
我想出了这个解决方案
kubectl cluster-info dump | sed "s/^}$/},/g" | tr '\n' "~" | sed 's/^/[/g' | sed 's/$/]/g' | tr "~" "\n"
其产生的可解析JSON结果