JQ:一个键有多个值的列表
JQ: A list with multiple values for one key
我想使用 jq 获取应用程序名称、所有版本和服务器名称的列表。该列表不应包含有关最新版本的信息。
输入:
{
"software": {
"app_1": {
"0.0.1": {
"properties_1": {
"lang": "en"
},
"server": "vm123-4.domain.com"
},
"0.0.2": {
"properties_2": {
"arch": "x86"
},
"server": "vm123-5.comain.com"
},
"latest_version": "0.0.2"
},
"app_2": {
"1.0.1": {
"properties_2": {
"arch": "x86"
},
"server": "vm333-1.domain.com"
},
"latest_version": "1.0.1"
},
"app_33": {
"0.44.1": {
"properties_1": {
"lang": "en"
},
"properties_2": {
"arch": "x86"
},
"properties_3": {
"boot": "true"
},
"server": "vm888-9.domain.com"
},
"1.2.2": {
"properties_3": {
"boot": "yes"
},
"server": "vm123-4.domain.com"
},
"latest_version": "1.2.2"
}
}
}
期望的输出:
"app_1, 0.0.1, vm123-4.domain.com"
"app_1, 0.0.2, vm123-5.comain.com"
"app_2, 1.0.1, vm333-1.comain.com"
"app_33, 0.44.1, vm888-9.comain.com"
"app_33, 1.2.2, vm123-4.comain.com"
我的请求只会列出应用程序的一个版本,而不是所有版本。我不知道该怎么做。
.software | to_entries[] | [(.key), (.value | to_entries[] | select(.key | IN("latest_version") | not))] | "\(.[0]) \(.[1].key) \(.[1].value.server)"
我的输出:
"app_1 0.0.1 vm123-4.domain.com"
"app_2 1.0.1 vm333-1.domain.com"
"app_33 0.44.1 vm888-9.domain.com"
jq -r '.software | to_entries[] | .key as $app | .value | to_entries[] | select((.value | objects)) | [$app, .key, .value.server] | @csv'
.software | to_entries[] | "\(.key) \(.value | to_entries[] | select(.key != "latest_version") | "\(.key) \(.value.server)")"
会产生
"app_1 0.0.1 vm123-4.domain.com"
"app_1 0.0.2 vm123-5.comain.com"
"app_2 1.0.1 vm333-1.domain.com"
"app_33 0.44.1 vm888-9.domain.com"
"app_33 1.2.2 vm123-4.domain.com"
你可以测试 in this online demo。
使用带有选项卡 \t
的 --raw-output
,我们可以创建一个列,如输出:
app_1 0.0.1 vm123-4.domain.com
app_1 0.0.2 vm123-5.comain.com
app_2 1.0.1 vm333-1.domain.com
app_33 0.44.1 vm888-9.domain.com
app_33 1.2.2 vm123-4.domain.com
我想使用 jq 获取应用程序名称、所有版本和服务器名称的列表。该列表不应包含有关最新版本的信息。
输入:
{
"software": {
"app_1": {
"0.0.1": {
"properties_1": {
"lang": "en"
},
"server": "vm123-4.domain.com"
},
"0.0.2": {
"properties_2": {
"arch": "x86"
},
"server": "vm123-5.comain.com"
},
"latest_version": "0.0.2"
},
"app_2": {
"1.0.1": {
"properties_2": {
"arch": "x86"
},
"server": "vm333-1.domain.com"
},
"latest_version": "1.0.1"
},
"app_33": {
"0.44.1": {
"properties_1": {
"lang": "en"
},
"properties_2": {
"arch": "x86"
},
"properties_3": {
"boot": "true"
},
"server": "vm888-9.domain.com"
},
"1.2.2": {
"properties_3": {
"boot": "yes"
},
"server": "vm123-4.domain.com"
},
"latest_version": "1.2.2"
}
}
}
期望的输出:
"app_1, 0.0.1, vm123-4.domain.com"
"app_1, 0.0.2, vm123-5.comain.com"
"app_2, 1.0.1, vm333-1.comain.com"
"app_33, 0.44.1, vm888-9.comain.com"
"app_33, 1.2.2, vm123-4.comain.com"
我的请求只会列出应用程序的一个版本,而不是所有版本。我不知道该怎么做。
.software | to_entries[] | [(.key), (.value | to_entries[] | select(.key | IN("latest_version") | not))] | "\(.[0]) \(.[1].key) \(.[1].value.server)"
我的输出:
"app_1 0.0.1 vm123-4.domain.com"
"app_2 1.0.1 vm333-1.domain.com"
"app_33 0.44.1 vm888-9.domain.com"
jq -r '.software | to_entries[] | .key as $app | .value | to_entries[] | select((.value | objects)) | [$app, .key, .value.server] | @csv'
.software | to_entries[] | "\(.key) \(.value | to_entries[] | select(.key != "latest_version") | "\(.key) \(.value.server)")"
会产生
"app_1 0.0.1 vm123-4.domain.com"
"app_1 0.0.2 vm123-5.comain.com"
"app_2 1.0.1 vm333-1.domain.com"
"app_33 0.44.1 vm888-9.domain.com"
"app_33 1.2.2 vm123-4.domain.com"
你可以测试 in this online demo。
使用带有选项卡 \t
的 --raw-output
,我们可以创建一个列,如输出:
app_1 0.0.1 vm123-4.domain.com
app_1 0.0.2 vm123-5.comain.com
app_2 1.0.1 vm333-1.domain.com
app_33 0.44.1 vm888-9.domain.com
app_33 1.2.2 vm123-4.domain.com