Bash 變數保持或保持值/數據
關於這篇文章:用 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 是因為一旦你發現自己
grep
ping 和cut
ting 和sed
ing,將所有邏輯組合到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 }