如何使用bash命令将“ kubectl cluster-info dump”的输出转换为有效的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]
}
我想将此命令的输出通过sed或awk传递,以将该输出转换为有效的json,例如:
[{"k","v","k2","v2"},
{"k","v","k2","v2"},
...
{"k","v","k2","v2"}]
然后我可以轻松地使用jq之类的json解析器进行解析
答案 0 :(得分:3)
将您的命令输出到jq:
jq -s
答案 1 :(得分:1)
如果布局如图所示,则:
kubectl cluster-info dump |
{ echo "["; sed -e 's/^}$/},/' -e '$s/^},$/}/'; echo "]"; }
会做这份工作。这依赖于“吨JSON”,中间没有任何行仅包含}
。由于JSON解析器无需担心空格和换行符,因此无需执行更多操作。
您可以通过以下方式避免使用shell { …; }
表示法:
kubectl cluster-info dump |
sed -e '1s/^/[/' -e 's/^}$/},/' -e '$s/^},$/}]/'
第一个sed
命令将[
添加到第一行的开头;第二个将每行仅由}
更改为},
(包括最后一行),但是第三个将撤消损坏并添加]
。
您甚至可以将这些-e
命令合并为一个用分号分隔的命令。就个人而言,我更喜欢使用单独的-e
选项,以使其更易于阅读。如果它们更复杂,我将每个命令放在自己的行上,并使用反斜杠在多行上继续执行总体命令。
答案 2 :(得分:0)
我想出了这个解决方案
kubectl cluster-info dump | sed "s/^}$/},/g" | tr '\n' "~" | sed 's/^/[/g' | sed 's/$/]/g' | tr "~" "\n"
产生json可解析的结果