我想问你是否可以帮助我过滤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
演示
如果您的输入文件应该是一个数组(在这种情况下,顶级逗号是正确的,但缺少数组括号[]
(,那么只需在筛选器前面加上.[] |
。