Unix环境下如何提取磁盘描述中的首个容量并转换为GB
如何在Unix系统中提取磁盘描述里的首个GB/TB容量并转换为GB单位
我来帮你搞定这个Unix下提取磁盘容量并转换的需求~ 先明确下核心需求:从磁盘描述字符串里定位第一个以GB或TB为单位的容量值,将TB单位转换为GB(按1TB=1000GB计算),最终输出整数形式的GB数值。
需求示例
磁盘描述示例:146GB 10K 2GB FC 23536RPM SATA II 1000GB NX24 623GB 1587K SA55S 15X3.5 DAE UPG X 3TB N 15X3.5 DAE UQ TY 1.8TB 10K SAS 25X2.53 DR 2TB 72PM II FGH DTTR 450GB 15KS 12V 4GB FC UPG
期望输出对应关系:
- 146GB 10K 2GB FC →146
- 23536RPM SATA II 1000GB →1000
- NX24 623GB 1587K SA55S 15X3.5 DAE UPG →623
- X 3TB N 15X3.5 DAE UQ →3000
- TY 1.8TB 10K SAS 25X2.53 DR →1800
- 2TB 72PM II FGH DTTR →2000
解决方案:用Awk脚本处理
Unix环境下用Awk处理这类文本匹配+数值计算的场景最顺手,下面是直接可用的命令:
单条描述处理
如果只是处理单个磁盘描述字符串,直接通过管道把字符串传给Awk即可:
echo "TY 1.8TB 10K SAS 25X2.53 DR" | awk '{ # 匹配第一个GB/TB格式的容量,捕获数值和单位 match($0, /([0-9.]+)(GB|TB)/, cap) # 根据单位转换:TB转GB,GB直接保留 if (cap[2] == "TB") { printf "%.0f\n", cap[1] * 1000 } else { printf "%.0f\n", cap[1] } }'
运行后会输出1800,完全符合需求。
批量处理多行描述
如果你的磁盘描述是每行一个存储在文件(比如disk_list.txt)里,用这个命令可以批量输出原始描述+转换结果,格式和你期望的完全一致:
awk '{ match($0, /([0-9.]+)(GB|TB)/, cap) if (cap[2] == "TB") { printf "%s → %.0f\n", $0, cap[1] * 1000 } else { printf "%s → %.0f\n", $0, cap[1] } }' disk_list.txt
输出示例:
146GB 10K 2GB FC →146 23536RPM SATA II 1000GB →1000 NX24 623GB 1587K SA55S 15X3.5 DAE UPG →623
命令逻辑解释
match($0, /([0-9.]+)(GB|TB)/, cap):在当前行文本中匹配第一个符合数字+GB/TB的模式,把数字部分存入cap[1],单位存入cap[2]printf "%.0f\n", ...:将结果格式化为整数输出,避免出现冗余小数(比如1.8TB转换成1800而不是1800.0)
内容的提问来源于stack exchange,提问作者Umi
相关产品推荐
相关产品推荐

