我有以下多行输出:
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:)"
生成上面的输出。我想知道在最后一个命令之后添加更多内容以获得所需的输出。
答案 0 :(得分:2)
printf "Volume Name: GATE02-SYSTEM\nSize: 151934468096\nVolume Name: GATE02-S\nSize: 2000112582656" |
awk '/^Size: / { $2 = $2/1024/1024**2 " Gb" }1'
答案 1 :(得分:2)
使用(GNU)sed
和bc
:
... | 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
Size:
行。printf
输出scale =
设置bc
sed
捕获组(字节数)bc
进行评估sed
执行子shell中s
语句的“替换”部分。 Another option是numfmt
(可用,因为GNU coreutils 8.21):
... | sed 's@Size: \([0-9]*\)@printf "%s" $(echo \1 | numfmt --to=iec-i --suffix=B)@e'
这不能让你控制小数,但是“适用于所有大小”(即给出数字足够大的TiB,并且对于太小的数字不会截断为“0.00 GiB”)。