用 KB/MB/GB/TB/PB... 后缀汇总数字

The*_*bM8 1 linux bash

我正在努力找出一种方法来总结一行数字。

我有以下代码。

lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1
Run Code Online (Sandbox Code Playgroud)

这给了我结果

2TB                         
2TB
2TB
2TB
2TB
2TB
Run Code Online (Sandbox Code Playgroud)

在我的另一台机器上:

500GB                       
1TB
1TB
Run Code Online (Sandbox Code Playgroud)

有没有办法总结这些?我需要保留 GB 或 TB

我完全没问题,它在 GB 中被说出来了,或者只有在有 2 个以上的结果时才将它们相加?我有多台机器,我应该在其中运行此命令。其中一些有 5 个硬盘驱动器,有些只有 1 个。

Sté*_*las 6

使用xmljson输出格式提供的工具可能更容易解析这些可用的:

lshw -quiet -class disk -class storage -xml |
  xmlstarlet sel -t -v //size -n |
  paste -sd + - |
  bc |
  numfmt --to=si --suffix=B
Run Code Online (Sandbox Code Playgroud)

json:

lshw -quiet -class disk -class storage -json |
  jq '[.children[]|.size]|add' |
  numfmt --to=si --suffix=B
Run Code Online (Sandbox Code Playgroud)

即使您没有xml/json解析工具,以这些格式输出仍然是可取的,因为您可以获得确切数量的字节开始,因此在从/向人类可读格式转换时不会丢失信息。

然后,您可以恢复到一些基于启发式的解析,例如默认输出格式。使用 GNU grep

lshw -quiet -class disk -class storage -json |
  grep -Po '"size" : \K\d+' |
  paste -sd + - |
  bc |
  numfmt --to=si --suffix=B
Run Code Online (Sandbox Code Playgroud)

--round=nearest选项添加到 GNU numfmt(自 8.21 (2013) 起在 GNU coreutils 中)以四舍五入到最接近的数字而不是四舍五入。另请参阅--format=%.3f以获得更高的精度。