关于这篇文章:对带有 KB/MB/GB/TB/PB... 后缀的数字求和
我有几台机器上有较旧的 Debian 版本,无法升级到较新版本的 Debian,这意味着该coreutils
软件包不包含numfmt
.我试图找到另一种方法来获取它(machine is Debian 7.6)
,但我被迫使用另一种方法来获取磁盘大小。
我目前正在使用以下内容:
lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1 | sed -e 's/[^0-9]/ /g' | paste -sd+ | bc
我可以轻松获得大小,但我也需要获得 GB/TB 甚至 MB 的大小。
如果我使用:
lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1
我明白了
160GB
160GB
在我的其他机器上,我会得到一个例子:
2TB
2TB
2TB
有没有办法将数字后面的单词保存在变量中,然后将其打印出来?
此外,为了消除一台机器拥有多个不同尺寸的驱动器的机会,例如
500GB
2TB
3TB
遗憾的是,这样我的命令就不起作用了,它会给你505.
答案1
我手头没有这个lshw
命令,所以我伪造了一些命令,如下所示:
size: 4200KiB (4200KB)
size: 420MiB (420MB)
size: 42GiB (42GB)
size: 4TiB (4TB)
size: 2PiB (2PB)
(我在网上找到了一个例子,只是复制了“size:”行并弥补了一些尺寸)。
我在这里使用 awk 是因为一旦您发现自己grep
ping 、cut
ting 和sed
ing ,通常更容易将所有这些逻辑组合到awk
.
下面的 awk 脚本将字段分隔符 ( FS
) 设置为左括号和右括号,以便更自然地提取所需的值。它还(冗余地)将运行总大小(以 GB 为单位)初始化为零。
每次 awk 看到与(简单)正则表达式匹配的输入行时,size:
它就会在大括号内开始真正的工作。括号内的值最终出现在字段 #2 中,因此我们要求 awk 匹配该字段中的数字。我们希望它们从位置 1 开始,包含一定数量的字符。然后根据该长度提取该值,后缀是字符串的其余部分。
然后,我们仔细研究可能的后缀列表(根据需要进行扩展),并将当前大小乘以适当的比率(Stéphane 在对当前已删除的答案发表评论以 1000 为基础的单位)。
消耗完所有输入后,awk 会打印总大小(以 GB 为单位)。
将脚本保存到文件中并像这样运行
lshw -class disk -class storage | awk -f /path/to/script
脚本:
BEGIN {
FS="[()]"
sizegb=0
}
/size: / {
match($2, "[0-9]+")
value=substr($2, RSTART, RLENGTH)
suffix=substr($2, RLENGTH+1)
if (suffix == "KB")
sizegb += value / (1000*1000)
else if (suffix == "MB")
sizegb += value / 1000
else if (suffix == "GB")
sizegb += value
else if (suffix == "TB")
sizegb += value * 1000
else if (suffix == "PB")
sizegb += value * 1000 * 1000
}
END {
printf "Total size: %.2f GB\n", sizegb
}