2014-12-02 37 views
2

我正嘗試在BASH中格式化一個數字。我想複製iptables的字節/數據包編號輸出。帶1個字符後綴的BASH printf數字

這裏有一些例子:

258 
591K 
55273 
37G 
22244 
2212 
6127K 
12M 
114K 

正如你可以看到:

  • 沒有千位分隔符,
  • 場是5個字符寬最大,每個
  • 後綴是:無,K,M,G等...

我在printf上搜索了文檔,但一直無法找到任何可以用這種方式格式化數字的東西。有誰知道如何做到這一點?

謝謝。

+0

什麼是每個輸出的輸入數字?爲什麼有些大於1024的值不會縮短到K版本? – 2014-12-02 03:35:34

+0

這是查看規則時iptables的默認格式。但是,例如,可以使用[iptables -vnxL INPUT]找到全字節計數。至於爲什麼不都轉換?不知道。如果我不得不猜測,我會說原始程序員想要給出儘可能多的數字至多100,000。然後(因爲字段只有5個字符)使用單個字符後綴進行轉換。 :) – OneCheapDrunk 2014-12-02 05:10:22

回答

1

你可以建立一個自定義的與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 
+0

感謝quantdev,另一個不錯的解決方案 - 這是一個很棒的單線!我會測試它,看看它是否適合。 :) – OneCheapDrunk 2014-12-02 05:14:10

0

也要做以編程方式,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 
} 

(編輯解決執行順序)

+0

不要使用'expr'。 'x = $((x/1000)K'/etc。此處你的語句順序評估不好,你的第二個測試表達式會在你分配給'x'的非數值上爆炸。 – 2014-12-02 03:30:16

+0

糟糕,你是關於順序的,我在注意到它的時候注意到了,然後分心了。我使用了expr,因爲我寫了/ bin/sh cripts,而不是/ bin/bash scripts。 – Andras 2014-12-02 03:37:37

+0

從我讀過的所有東西*很少* (非posix)版本的'sh'(和衍生物)不理解算術上下文。 – 2014-12-02 03:41:12