如何修改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
相关产品推荐
相关产品推荐

