2012-10-17 62 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線路。