首页 > 解决方案 > 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

标签: jsoncsvselectjq

解决方案


您的方法可以简化、强化并提高效率:

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


推荐阅读