2012-03-02 32 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