2012-03-02 31 views
0


awk中:VAR類型和輸出格式

這是我的超級複雜的awk程序:

#!/usr/bin/awk -f 
BEGIN { 
count = 0 
} 

{ if ($1 == "r") 
    { 
    nom = $2 
    ip= $7 
    numerolinea = NR 
    } 
else { 
    where = match($0, "Fast") 
    if (where) 
    { 
    count++ 
    printf("\t%5i %20s %15s\n",count,nom,ip)  
    } 
     } 
} 

因此,大家可以看到nomip的每一個視爲字符串有自己的長度。它會是這樣輸出的摘錄:

| 111   cutemyserver1  93.27.255.24 |                      
    | 112 thisisthenamemyserver2  60.231.2.255 |                      
    | 113 anotherlongmyserver3 191.44.192.260 |                      
    | 114    myserver4 173.374.76.183 |                      
    | 115   formyserver5 145.146.321.8 |                      
    | 116    myserver6  64.31.359.70 |                      
    | 117  foofoomyserver7 245.16.19.338 | 

正如你也可以看到,count是一個整數。我的目標是count對齊爲nomip做的是,正因爲如此:

| 8   myserver6 91.580.144.231 |                       
    | 9    narnd 163.11.783.10 |                       
    | 10    erreer 59.194.0.353 |                       
    | 11    111111 178.70.644.91 | 

但作弊王氏%5i不起作用。

感謝

+0

可以打印'count'內E也使用'%5s'或'%-5i' – anubhava 2012-03-02 17:41:57

+0

嘗試用'%5d',而不是'%5i' – 2012-03-02 18:07:41

回答

1

我能解決問題,並採取讓你代碼 「AWK樣」 的自由:

#!/usr/bin/awk -f 

$1=="r" {nom=$2;ip=$7;next;} 

/Fast/ {printf "\t%5d %20s %15s\n",++count,nom,ip;} 

NB。

  1. count在本例中不需要初始化。
  2. numerolinea是未引用
  3. condition {...}是說if...then
  4. next防止被測試
  5. ++count後續條件的更「AWK狀」的方式提供其值之前更新變量
  6. /Fast/ {...}執行時的正則表達式Fast$0
  7. 正如Glenn正確指出的,%5d是您要求的語法您printf
+0

+1出色地完成了任務。我愛awk。 – 2012-03-02 21:12:04

+0

@groovyspaceman:謝謝你的教訓。我不知道'next'
morphynoman 2012-03-04 12:25:16

+0

因此,這個awk實際上是從bash腳本調用的,所以如果我使用'%5d',它的工作原理就是在-let我說的情況下調用它,獨立的awk方式。但是如果從bash腳本中調用'%-5i',那麼這個技巧就不起作用了。 – morphynoman 2012-03-04 12:31:48