(點選上方公眾號,可快速關註)
來源:暗無天日 ,
lujun9972.github.io/blog/2018/05/09/numfmt-讓數字變得更容易理解/
像 ls, df, du 這類命令都帶有一個選項可以將數字直接轉換成人類容易閱讀的形式來展現。 比如,直接執行 df 時,容量顯示的是多少個塊,而當用 df -h 時,容量會根據塊的數量轉換成G/M/K的形式。
[lujun9972@T520 ~]$ df
檔案系統 1K-塊 已用 可用 已用% 掛載點
dev 1900280 0 1900280 0% /dev
run 1906932 868 1906064 1% /run
/dev/sda2 41022688 23631300 15277852 61% /
tmpfs 1906932 26204 1880728 2% /dev/shm
tmpfs 1906932 0 1906932 0% /sys/fs/cgroup
tmpfs 1906932 5156 1901776 1% /tmp
/dev/sda3 73005440 61682676 7571272 90% /home
tmpfs 100 0 100 0% /var/lib/lxd/shmounts
tmpfs 100 0 100 0% /var/lib/lxd/devlxd
tmpfs 381384 8 381376 1% /run/user/1000
[lujun9972@T520 ~]$ df -h
檔案系統 容量 已用 可用 已用% 掛載點
dev 1.9G 0 1.9G 0% /dev
run 1.9G 868K 1.9G 1% /run
/dev/sda2 40G 23G 15G 61% /
tmpfs 1.9G 26M 1.8G 2% /dev/shm
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 1.9G 5.1M 1.9G 1% /tmp
/dev/sda3 70G 59G 7.3G 90% /home
tmpfs 100K 0 100K 0% /var/lib/lxd/shmounts
tmpfs 100K 0 100K 0% /var/lib/lxd/devlxd
tmpfs 373M 8.0K 373M 1% /run/user/1000
不過對於那些沒有這類功能的命令該怎麼辦呢?有單獨的一個命令來實現數字和易讀形式之間的轉換嗎? 答案是,還真有,這就是 numfmt. 而且 numfmt 是coreutils的一部分,無需另行安裝,真是良心。
1000進位制還是1024進位制?這是個問題
使用 numfmt 支援兩種轉換標準,一種是 1K=1000,1M=1000K…的:
numfmt –to=si 數字
將數字轉換成易讀格式
numfmt –to=si 100000
100K
numfmt –from=si 易讀格式
將易讀格式轉換成數字
numfmt –from=si 100K
100000
還有一種是 1K=1024,1M=1024K…的:
numfmt –to=iec 數字
將數字轉換成易讀格式
numfmt –to=iec 100000
98K
numfmt –from=iec 易讀格式
將易讀格式轉換成數字
numfmt –from=iec 100K
102400
事實上,還有一種格式是 1Ki=1024,1Mi=1024Ki…的(即在單位後面有個i):
numfmt –to=iec-i 數字
將數字轉換成易讀格式
numfmt –to=iec-i 100000
98Ki
numfmt –from=iec-i 易讀格式
將易讀格式轉換成數字
numfmt –from=iec-i 100Ki
當將易讀格式轉換會數字時,可以將格式設定為 auto, 這樣 numfmt 會自動判斷應該是按1000來轉換還是按1024來轉換,其選擇的規則為:
– 若格式的單位後面不帶 i 則使用1000進位制來轉換
numfmt –from=auto 100K
100000
– 若格式的單位後面不帶 i 則使用1024進位制來轉換
numfmt –from=auto 100Ki
102400
一次進行多個轉換
numfmt 能夠一次性進行多個轉換,只需要在後面羅列數字或者易讀格式就行了。
numfmt –to=iec 100000 20000 40000
98K
20K
40K
numfmt –from=iec 98K 20K 40K
100352
20480
40960
從中你也可以看出,轉換的結果其實並不會特別的精確
指定數字的單位
使用 –from-unit 可以指定輸入數字的單位,比如:
numfmt –to=si –from-unit K 1000
1.0M
你會發現,輸出是 1M 而不是 1K
同理,使用 –to-unit 可以指定輸出數字的單位:
numfmt –from=si –to-unit K 1M
1000
可以看到,輸出是是 1000 而不是 1000000
指定輸出的格式
使用 –format 可以指定輸出的格式,其格式語法類似於C語言中 printf 的格式說明,但僅限於格式化一個浮點數。比如:
輸出右對齊,佔10位字元
[lujun9972@T520 ~]$ numfmt –to=si –format “%10f” 1000
1.0K
輸出左對齊,佔10位字元
[lujun9972@T520 ~]$ numfmt –to=si –format “%-10f|” 1000
1.0K |
為了清晰,我在字串最後加了一個 |
輸出右對齊,佔10位字元,不夠的位用0填充
[lujun9972@T520 ~]$ numfmt –to=si –format “%010f” 1000
00000001.0K
與其他命令整合
當 numfmt 沒有指定數字或易讀格式來轉換時,它會從stdin中讀取要轉換的內容
echo 1000 |numfmt –to=si
1.0K
然而,對於像 df 這樣的命令,除了數字外,還有其他內容怎麼辦呢?
這個時候,我們可以使用 –essay-header 來跳過命令輸出前面幾行的標題,使用 field 來指定轉換某幾列的內容。
比如,我們可以用下列命令來讓 numfmt 只轉換 df 命令從第3行開始的2到4列數字,保持其他內容不變
df -B1 | numfmt –essay-header=2 –field 2-4 –to=iec
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能