Bash 变量保存或保留值/数据

Bash 变量保存或保留值/数据

关于这篇文章:对带有 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 是因为一旦您发现自己grepping 、cutting 和seding ,通常更容易将所有这些逻辑组合到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
}

相关内容