将命令输出转换为有效的json?

时间:2019-02-05 14:59:51

标签: json bash awk sed

如何使用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解析器进行解析

3 个答案:

答案 0 :(得分:3)

将您的命令输出到

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可解析的结果