bash中的json过滤



我想问你是否可以帮助我过滤json中的数据。我有以下json:

{
"cluster_name": "k8s-cluster-1",
"cluster_env": "PROD",
"cluster_hosts": [
{
"host_type": "MASTER",
"host_hostname": "aa083",
"host_username": "kubeadm",
"host_kubernetes_version": "",
},
{
"host_type": "NODE",
"host_hostname": "aa084",
"host_username": "kubeadm",
"host_kubernetes_version": "",
},
{
"host_type": "NODE",
"host_hostname": "aa085",
"host_username": "kubeadm",
"host_kubernetes_version": "",
}
],
},
{
"cluster_name": "k8s-cluster-2",
"cluster_env": "PROD",
"cluster_hosts": [
{
"host_type": "MASTER",
"host_hostname": "ab093",
"host_username": "kubeadm",
"host_kubernetes_version": "",
},
{
"host_type": "NODE",
"host_hostname": "ab094",
"host_username": "kubeadm",
"host_kubernetes_version": "",
},
{
"host_type": "NODE",
"host_hostname": "ab095",
"host_username": "kubeadm",
"host_kubernetes_version": "",
}
],
}

输出应该是这样的:

cluster_name
host_type
host_name
.
.
.
k8s-cluster-1
MASTER
aa083
NODE
aa084
NODE
aa085
k8s-cluster-2
MASTER
ab093
NODE
ab094
NODE
ab095

我试过这个命令

cat json|jq-c'。[]|.cluster_name,.cluster_hosts[]|{host_type,host_name}'

但是它显示错误

jq:error(位于:1(:无法使用字符串"为字符串编制索引;host_type";

我需要在bash中这样做。

你能帮帮我吗?

提前谢谢。

实际的输入文件有几个多余的逗号。假设您的JSON文件应该是一个对象流,即看起来像这样:

{
"cluster_name": "k8s-cluster-1",
"cluster_env": "PROD",
"cluster_hosts": [
{
"host_type": "MASTER",
"host_hostname": "aa083",
"host_username": "kubeadm",
"host_kubernetes_version": ""
},
{
"host_type": "NODE",
"host_hostname": "aa084",
"host_username": "kubeadm",
"host_kubernetes_version": ""
},
{
"host_type": "NODE",
"host_hostname": "aa085",
"host_username": "kubeadm",
"host_kubernetes_version": ""
}
]
}
{
"cluster_name": "k8s-cluster-2",
"cluster_env": "PROD",
"cluster_hosts": [
{
"host_type": "MASTER",
"host_hostname": "ab093",
"host_username": "kubeadm",
"host_kubernetes_version": ""
},
{
"host_type": "NODE",
"host_hostname": "ab094",
"host_username": "kubeadm",
"host_kubernetes_version": ""
},
{
"host_type": "NODE",
"host_hostname": "ab095",
"host_username": "kubeadm",
"host_kubernetes_version": ""
}
]
}

然后你只需要列出你感兴趣的字段。使用-r标志来输出原始文本,而不是JSON字符串(会被引用(:

jq -r '.cluster_name, (.cluster_hosts[] | .host_type, .host_hostname)'
k8s-cluster-1
MASTER
aa083
NODE
aa084
NODE
aa085
k8s-cluster-2
MASTER
ab093
NODE
ab094
NODE
ab095

演示

如果您的输入文件应该是一个数组(在这种情况下,顶级逗号是正确的,但缺少数组括号[](,那么只需在筛选器前面加上.[] |

最新更新