json - jq获取父子键对孙值进行计算
问题描述
几天来一直在尝试我能想到的一切,我只想从这个 JSON 中做以下事情:
{
"kube-prod-worker-0": {
"/var/lib/docker/aufs": {
"available": 222222733312,
"total": 312202997760
},
"/var/lib/docker/aufs/mnt/0000000000000007ffb4e1xxxx5": {
"available": 222222733399,
"total": 1634054144
}
}
}
{
"kube-prod-worker-7": {
"/var/lib/docker/aufs": {
"available": 253056245760,
"total": 3122029977600
},
"/var/lib/docker/aufs/mnt/000000000dc1150f1xxxxdd3e4e4d3": {
"available": 253056245760,
"total": 3122029977605
}
}
}
对于每个顶级键 $host(例如 kube-prod-worker-0)和每个键 $fs 在下一个级别(例如“/var/lib/docker/aufs”),计算可用百分比, $pc; 如果百分比小于 5%,则输出为 CSV:
$host, $fs, $pc
这是我到目前为止所得到的,这似乎对每个父母和孩子的每个孙子重复:
$ cat diskusage.json | jq -r ' keys[] as $host | .[] | keys[] as $fs | $host,$fs, values[].available,values[].total'
kube-prod-worker-0
/var/lib/docker/aufs
222222733312
222222733399
312202997760
1634054144
kube-prod-worker-0
/var/lib/docker/aufs/mnt/0000000000000007ffb4e1xxxx5
222222733312
222222733399
312202997760
1634054144
kube-prod-worker-7
/var/lib/docker/aufs
253056245760
253056245760
3122029977600
3122029977605
kube-prod-worker-7
/var/lib/docker/aufs/mnt/000000000dc1150f1xxxxdd3e4e4d3
253056245760
253056245760
3122029977600
3122029977605
并产生百分比:
$ cat diskusage.json | jq -r ' keys[] as $host | .[] | keys[] as $fs | $host,$fs, (values[].available/values[].total)*100 '
kube-prod-worker-0
/var/lib/docker/aufs
71.17892361905808
71.17892364692456
13599.471849079682
13599.471854403864
kube-prod-worker-0
/var/lib/docker/aufs/mnt/0000000000000007ffb4e1xxxx5
71.17892361905808
71.17892364692456
13599.471849079682
13599.471854403864
kube-prod-worker-7
/var/lib/docker/aufs
8.105503392844808
8.105503392844808
8.105503392831826
8.105503392831826
kube-prod-worker-7
/var/lib/docker/aufs/mnt/000000000dc1150f1xxxxdd3e4e4d3
8.105503392844808
8.105503392844808
8.105503392831826
8.105503392831826
解决方案
您的方法可以简化、强化并提高效率:
keys_unsorted[] as $host
| .[$host]
| keys_unsorted[] as $fs
| .[$fs]
| select(.total > 0)
| ((.available/.total)*100) as $perc
| select($perc < 5)
| [$host, $fs, $perc]
| @csv
这假设应该保留键的原始顺序。如果您希望对键进行排序,那么一定要酌情使用keys
而不是。keys_unsorted
推荐阅读
- flutter - 图像资产未加载到颤振 Firebase 项目中
- java - 通过 Firebase 同步 Android (Java) SharedPrefs 数据 - 发出一个请求而不是一堆请求
- c# - 使用 C# 加载网站的页面源
- algorithm - 在视频上实时添加文本或图像的技术?
- r - R ggplot 带垂直带的线
- react-native - 是否可以将 goBack() 函数作为参数传递
- google-apps-script - 触发谷歌表。触发特定日期的当前日期?
- javascript - 如何在 Flutter、Node JS 和 MongoDB 中通过 6 位代码验证电子邮件?
- c# - 从列表框到文本框的素数
- php - 为特定类别添加 WooCommerce 功能