linux - 将数字转换为千兆字节(sed、awk、sh、bash)

标签 linux bash awk sed sh

我有以下多行输出:

Volume Name: GATE02-SYSTEM
Size: 151934468096
Volume Name: GATE02-S
Size: 2000112582656

是否可以转换如下字符串:

Volume Name: GATE02-SYSTEM
Size: 141.5 Gb
Volume Name: GATE02-S
Size: 1862.75 Gb

使用 sed/awk?我寻找唯一数字输出的答案,例如:

echo "151934468096" | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }'

但不知道如何将其应用到我的案例中。

编辑:我想澄清我的情况。我有以下一句话:

esxcfg-info | grep -A 17 "\\==+Vm FileSystem" | grep -B 15 "[I]s Accessible.*true" | grep -B 4 -A 11 "Head Extent.*ATA.*$" | sed -r 's/[.]{2,}/: /g;s/^ {12}//g;s/\|----//g' | egrep -i "([V]olume Name|^[S]ize:)"

生成上面的输出。我想知道在最后一个命令之后要添加什么才能获得所需的输出。

最佳答案

使用 (GNU) sedbc:

... | sed 's@Size: \([0-9]*\)@printf "Size: %s" $(echo "scale = 2; \1 / 1024 ^ 3" | bc)GiB@e'
             ^^^^  ^^^^^^^^^^ ^^^^^^                    ^^^^^^^^^  ^^ ^^^^^^^^^^    ^^     ^
               1        2        3                          4       5      6         7     8
  1. 匹配尺寸:行。
  2. 捕获字节数(如果为空或为零,则可能容易受到攻击,请加强以供生产使用)
  3. 替换为 printf 输出
  4. scale = 设置 bc 的小数位数
  5. 使用 sed 捕获组(字节数)
  6. 字节数的数学运算
  7. 将所有内容通过管道传输到 bc 进行评估
  8. 告诉 sed 在子 shell 中执行 s 语句的“替换”部分。

Another optionnumfmt (如果可用,自 GNU coreutils 8.21 起):

... | sed 's@Size: \([0-9]*\)@printf "%s" $(echo \1 | numfmt --to=iec-i --suffix=B)@e'

这并不能让您控制小数,但“适用于”所有大小(即在数字足够大的情况下给出 TiB,并且对于太小的数字不会截断为“0.00 GiB”)。

关于linux - 将数字转换为千兆字节(sed、awk、sh、bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47474015/

相关文章:

linux - 将数据从 32 位用户程序传递到 64 位 linux

linux - Linux cpu 使用的 psutil 和 sar 有什么区别?

linux - 为什么在 Linux 中 spin_lock 和 spin_unlock 之间的中断被禁用?

linux - awk 在其他路径上运行时不起作用

if-statement - 如何根据条件使连续行进入列?

linux - 如何设置 NetBeans 来访问权限与当前用户不匹配的项目?

linux - 何时/如何在测试中使用 "=="或 "-eq"运算符?

bash - 使用 AWS 签名版本 4 的 REST API 调用(无法签署 AWS API 请求)

c - 如何在 macOS 中为 Bash 添加 GCC 的默认包含和库路径?

regex - 将匹配的值传递给函数,并替换为返回值