在 bash 中使用 jq 进行嵌套 Json 解析
Nested Json parsing using jq in bash
我需要解析一个 json 文件,我将 bash 脚本与 jq 绑定在一起,但没有得到预期的输出。
Json 文件:
[
{
"fqdn": "my-created-lb",
"status": "Active",
"members": {
"10.45.78.9:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.10:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.11:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.12:80": {
"dc": "NA",
"state": "enabled",
"port": 80
}
}
}
]
我需要输出为:
"my-created-lb"
"10.45.78.9:80","enabled"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
我在 jq 以下尝试过,但没有得到预期的输出:
jq '.[] | .fqdn,.members,.members[].state'
但我的输出低于 :
"my-created-lb"
{
"10.45.78.9:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.10:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.11:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.12:80": {
"dc": "NA",
"state": "enabled",
"port": 80
}
}
"enabled"
"enabled"
"enabled"
"enabled"
因为你想要密钥的名称,你可以像这样使用 to_entries
:
jq -r '.[] | .fqdn, ( .members | to_entries | .[] | [ .key, .value.state ] | @tsv )'
输出:
my-created-lb
10.45.78.9:80 enabled
10.45.78.10:80 enabled
10.45.78.11:80 enabled
10.45.78.12:80 enabled
编辑
要获得原始 post 中列出的确切输出,请将 jq
脚本修改为:
jq -r '.[] | [.fqdn], ( .members | to_entries | .[] | [ .key, .value.state ] ) | @csv'
输出:
"my-created-lb"
"10.45.78.9:80","enabled"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
要准确获得您想要的输出:
jq -r '.[] | ([.fqdn]|@csv), (.members | keys[] as $k | [$k, .[$k].state] | @csv)' file.json
"my-created-lb"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
"10.45.78.9:80","enabled"
我需要解析一个 json 文件,我将 bash 脚本与 jq 绑定在一起,但没有得到预期的输出。
Json 文件:
[
{
"fqdn": "my-created-lb",
"status": "Active",
"members": {
"10.45.78.9:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.10:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.11:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.12:80": {
"dc": "NA",
"state": "enabled",
"port": 80
}
}
}
]
我需要输出为:
"my-created-lb"
"10.45.78.9:80","enabled"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
我在 jq 以下尝试过,但没有得到预期的输出:
jq '.[] | .fqdn,.members,.members[].state'
但我的输出低于 :
"my-created-lb"
{
"10.45.78.9:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.10:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.11:80": {
"dc": "NA",
"state": "enabled",
"port": 80
},
"10.45.78.12:80": {
"dc": "NA",
"state": "enabled",
"port": 80
}
}
"enabled"
"enabled"
"enabled"
"enabled"
因为你想要密钥的名称,你可以像这样使用 to_entries
:
jq -r '.[] | .fqdn, ( .members | to_entries | .[] | [ .key, .value.state ] | @tsv )'
输出:
my-created-lb
10.45.78.9:80 enabled
10.45.78.10:80 enabled
10.45.78.11:80 enabled
10.45.78.12:80 enabled
编辑
要获得原始 post 中列出的确切输出,请将 jq
脚本修改为:
jq -r '.[] | [.fqdn], ( .members | to_entries | .[] | [ .key, .value.state ] ) | @csv'
输出:
"my-created-lb"
"10.45.78.9:80","enabled"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
要准确获得您想要的输出:
jq -r '.[] | ([.fqdn]|@csv), (.members | keys[] as $k | [$k, .[$k].state] | @csv)' file.json
"my-created-lb"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"
"10.45.78.9:80","enabled"