簡體   English   中英

將數字轉換為千兆字節(sed,awk,sh,bash)

[英]Convert number to gigabytes (sed, awk, sh, bash)

我有以下多行輸出:

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:)"

上面產生輸出。 我想知道在最后一個命令之后添加更多內容以獲得所需的輸出。

printf "Volume Name: GATE02-SYSTEM\nSize: 151934468096\nVolume Name: GATE02-S\nSize: 2000112582656" |
awk '/^Size: / { $2 = $2/1024/1024**2 " Gb" }1'

使用(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. 匹配Size:線。
  2. 捕獲字節數(如果為空或為零,則很容易受到攻擊,請加強以供生產使用)
  3. 替換為printf輸出
  4. scale =設置bc的小數位數
  5. 使用sed捕獲組(字節數)
  6. 字節數的數學運算
  7. 將所有內容發送給bc進行評估
  8. 告訴sed在子外殼中執行s語句的“替換”部分。

另一個選擇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”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM