2012-10-17 59 views
0

使用这个返回多行结果:awk脚本,需要以下关键字

awk '$1 == "pool" { f=1; print $1,$2; next }   
    f == 1 { if ($1 == "pool") { print }    
       else if ($1 == "members") { print } 
       else if ($0 ~ /^}/) { f=0 }    
    }' bigip.conf 

也就是说,直到配置有以下行的IP地址工作正常。 我如何获得它打印IPs,如果他们在以下线路上。 配置有两个,有一些在同一行上,一些在下一个1,2或3行。

数据:

pool pl_stage_xxx_microsites_9483 { 
     monitor all tcp_half_open 
     members { 
      11.11.11.11:9483 {} 
      11.22.22.22:9483 { 
      session user disabled 
      } 
     } 
} 
+0

heh,我的awk脚本:D – c00kiemon5ter

+0

[this](http://stackoverflow.com/questions/12902353/bash-if-then-script-to-parse-file)是第一个问题 – c00kiemon5ter

回答

0

很难没有看到更多您的数据和预期产出的说,但我认为,所有你需要的是这样的:

awk ' 
/^}/ { inPool=0 } 
$1 == "pool" { inPool=1; inMembers=0 } 
inPool { 
    if ($1 == "pool") { 
     print $1, $2 
     print 
    } 
    else if ($1 == "members") { 
     inMembers = 1 
    } 
    if (inMembers) { 
     print 
    } 
} 
' file 

上面至少应该是一个很好的起点。关于使用getline发布的其他答案 - getline有一些适当的用途,但这不是其中之一,直到您完全理解并可以接受所有注意事项才使用getline,请参阅http://awk.info/?tip/getline

+0

我把第一个问题问题 – c00kiemon5ter

+0

这是一个比较日期,运行上面的作品禁止它打印的“池子”行两次:池pl_website_443 { 监控所有tcp_half_open_http 成员11.22.33.44:https {}} 池 {pl_website_80显示器 所有tcp_half_open 成员{ 11.22.33.44:http {} 11.22.33.44:http {} } } pool pl_stage _website_apacretail_9090 { 监控所有tcp_half_open 成员{ 11.22.33.44:websm {} 11.22.33.44:websm {}} } – antipentium

+0

想不通为什么它会打印池线的两倍。它确实从游泳池行打印$ 1和$ 2,然后打印整个游泳池行,就像您最初发布的代码一样。如果你不需要这些,只需删除其中一条打印线。 –

1

请尝试以下awk代码:

awk ' 
$1 == "pool" { 
    f=1 
    print $1,$2 
    next 
}   
f == 1 { 
    if ($1 == "pool") { 
     print 
    }    
    else if ($1 == "members") { 
     print 
     getline 
     while ($0 ~ "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5}"){ 
      print 
      getline 
     } 
    } 
    else if ($0 ~ /^}/) { 
     f=0 
    }    
}' 

,而他们的存在,将打印IP线路。