Bash处理dmidecode输出:按定位器分组计算内存总容量
解决dmidecode内存输出分组求和与多行变量赋值问题
首先,我来帮你搞定这个内存容量求和的需求,顺便解决多行输出赋值的小坑~你的目标是把A1/A2的内存容量相加、B3/B4的也分别求和,同时要正确处理多行输出的变量赋值,下面是具体的实现方案:
步骤1:正确捕获多行输出到变量
你之前尝试的IFS='--'方式不太适配这个场景,因为每条内存信息是独立的一行,更可靠的方式是直接把输出捕获到变量,或者用while read逐行处理。
如果是用你已经给出的固定输出,可以用here-document赋值:
# 将你的dmidecode输出内容赋值给变量 memory_data=$(cat <<EOF Size: 32 GB Form Factor: DIMM Set: 3 Locator: A1 Size: 16 GB Form Factor: DIMM Set: 3 Locator: A2 Size: 32 GB Form Factor: DIMM Set: 3 Locator: B3 Size: 16 GB Form Factor: DIMM Set: 3 Locator: B4 EOF )
如果是直接从dmidecode实时提取(过滤掉冗余信息),可以用awk精准抓取需要的字段:
# 直接从dmidecode提取容量和定位器,每行格式为"容量 定位器" memory_data=$(dmidecode --type memory | awk '/Size: [0-9]+ GB/ {cap=$2} /Locator: [A-Z0-9]+/ {print cap, $2}')
步骤2:分组求和的完整脚本
接下来我们逐行处理变量里的内容,判断每个内存条的定位器,分别累加A组和B组的容量:
# 初始化求和变量 sum_A=0 sum_B=0 # 逐行读取内存数据,自动分割出容量和定位器 while read -r capacity locator; do # 判断定位器所属分组,累加对应容量 case "$locator" in A1|A2) sum_A=$((sum_A + capacity)) ;; B3|B4) sum_B=$((sum_B + capacity)) ;; esac done <<< "$memory_data" # 输出最终结果 echo "A组(A1+A2)总容量: ${sum_A} GB" echo "B组(B3+B4)总容量: ${sum_B} GB"
脚本说明
- 多行变量处理:
while read -r ... done <<< "$memory_data"是处理多行变量最稳妥的方式,它会自动把变量内容按行拆分,逐行处理,避免了数组拆分的混乱。 - 分组判断:用
case语句可以灵活匹配多个定位器(比如A1/A2、B3/B4),逻辑清晰易维护。 - 数值累加:用
$((...))进行整数运算,直接把容量数值相加,不需要额外的字符串转换。
运行脚本后会得到预期结果:
A组(A1+A2)总容量: 48 GB B组(B3+B4)总容量: 48 GB
内容的提问来源于stack exchange,提问作者askpython
相关产品推荐
相关产品推荐

