Linux

Bash 變數保持或保持值/數據

  • March 29, 2018

關於這篇文章:用 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.

我沒有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
}

引用自:https://unix.stackexchange.com/questions/434229