我正嘗試在BASH中格式化一個數字。我想複製iptables的字節/數據包編號輸出。帶1個字符後綴的BASH printf數字
這裏有一些例子:
258
591K
55273
37G
22244
2212
6127K
12M
114K
正如你可以看到:
- 沒有千位分隔符,
- 場是5個字符寬最大,每個
- 後綴是:無,K,M,G等...
我在printf上搜索了文檔,但一直無法找到任何可以用這種方式格式化數字的東西。有誰知道如何做到這一點?
謝謝。
我正嘗試在BASH中格式化一個數字。我想複製iptables的字節/數據包編號輸出。帶1個字符後綴的BASH printf數字
這裏有一些例子:
258
591K
55273
37G
22244
2212
6127K
12M
114K
正如你可以看到:
我在printf上搜索了文檔,但一直無法找到任何可以用這種方式格式化數字的東西。有誰知道如何做到這一點?
謝謝。
你可以建立一個自定義的與awk
格式化,這樣的事情:
awk 'BEGIN{ u[0]=""; u[1]="K"; u[2]="M"; u[3]="G"} { n = $1; i = 0; while(n > 1000) { i+=1; n= int(n/1000) } print n u[i] } '
輸入樣本:
258
591000
55273
37000000000
22244
2212
6127000
12000000
114000
輸出:
258
591K
55K
37G
22K
2K
6M
12M
114K
感謝quantdev,另一個不錯的解決方案 - 這是一個很棒的單線!我會測試它,看看它是否適合。 :) – OneCheapDrunk 2014-12-02 05:14:10
也要做以編程方式,b UT不難
#!/bin/sh
humanFormat() {
test $x -gt 1000000000 && x=`expr x/1000000000`G
test $x -gt 1000000 && x=`expr x/1000000`M
test $x -gt 1000 && x=`expr x/1000`K
}
(編輯解決執行順序)
不要使用'expr'。 'x = $((x/1000)K'/etc。此處你的語句順序評估不好,你的第二個測試表達式會在你分配給'x'的非數值上爆炸。 – 2014-12-02 03:30:16
糟糕,你是關於順序的,我在注意到它的時候注意到了,然後分心了。我使用了expr,因爲我寫了/ bin/sh cripts,而不是/ bin/bash scripts。 – Andras 2014-12-02 03:37:37
從我讀過的所有東西*很少* (非posix)版本的'sh'(和衍生物)不理解算術上下文。 – 2014-12-02 03:41:12
什麼是每個輸出的輸入數字?爲什麼有些大於1024的值不會縮短到K版本? – 2014-12-02 03:35:34
這是查看規則時iptables的默認格式。但是,例如,可以使用[iptables -vnxL INPUT]找到全字節計數。至於爲什麼不都轉換?不知道。如果我不得不猜測,我會說原始程序員想要給出儘可能多的數字至多100,000。然後(因爲字段只有5個字符)使用單個字符後綴進行轉換。 :) – OneCheapDrunk 2014-12-02 05:10:22