You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改shell命令实现带不同公制单位的docker镜像大小求和

适配多单位混合场景的Docker镜像SIZE列求和实现

原命令的核心问题

原有命令仅对第7列的纯数字部分做累加,完全忽略数值后附带的公制单位前缀,遇到GB、MB、KB混合的输出时,会把不同量级的数值直接相加,导致计算结果完全失真。
比如遇到1GB、129MB、114MB三个值时,原命令会把三个值的纯数字1、129、114直接相加得到244,完全没有换算单位倍率。

通用尺寸求和的实现逻辑

不管是Docker的输出,还是其他带公制单位的尺寸列表,通用的累加处理步骤是:

  • 逐行拆分目标列的数值部分和单位前缀
  • 按照统一换算关系(和Docker的尺寸换算保持一致,采用1024进制)把所有值转成最小单位(字节)
  • 累加完成后可根据需求选择输出纯字节数,或是转回人类可读的分级单位

注:上述awk的正则匹配带返回数组的语法为Gawk(GNU Awk)支持的标准写法,主流Linux发行版默认自带的Awk均兼容该语法。

可直接使用的命令

docker image ls -a | tail +2 | awk '
BEGIN {
    # 预定义各单位对应的字节换算倍率
    unit["B"] = 1
    unit["KB"] = 1024
    unit["MB"] = 1024 * 1024
    unit["GB"] = 1024 * 1024 * 1024
}
{
    # 匹配拆分第7列的数值和单位
    match($7, /^([0-9.]+)([A-Za-z]+)$/, res)
    total += res[1] * unit[res[2]]
}
END {
    # 直接输出总字节数
    print total
    # 如需输出人类可读格式,可增加以下逻辑自动适配单位
    if (total >= unit["GB"]) {
        printf "约合:%.2fGB\n", total / unit["GB"]
    } else if (total >= unit["MB"]) {
        printf "约合:%.2fMB\n", total / unit["MB"]
    } else if (total >= unit["KB"]) {
        printf "约合:%.2fKB\n", total / unit["KB"]
    }
}'

对应混合尺寸示例场景(129MB、114MB、1GB),上述命令会正确完成单位换算,最终计算得到约1.243GB的总大小,不会再出现忽略单位的计算偏差。

简化优化技巧

可以直接利用Docker原生的输出自定义能力,跳过表头过滤步骤,不需要再叠加tail +2命令:

docker image ls -a --format "{{.Size}}" | awk '
BEGIN {
    unit["B"] = 1
    unit["KB"] = 1024
    unit["MB"] = 1024 * 1024
    unit["GB"] = 1024 * 1024 * 1024
}
{
    match($0, /^([0-9.]+)([A-Za-z]+)$/, res)
    total += res[1] * unit[res[2]]
}
END { print total }'

内容的提问来源于stack exchange,提问作者Right leg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 01:36:04