2017-05-08 87 views
1

日誌時間讀取器,第一次海報。對於不好的描述,讓我嘗試和更詳細地解釋:搜索文件中的字符串,然後找到匹配不同字符串的以前的行

我有一些硬件負載平衡器配置,我想使用任何可用的Linux工具(例如sed,awk,grep等)解析。

我想搜索短語address 10.1.104.164,我想知道它所在的游泳池。例如,如果我們搜索10.1.104.164我想它返回:

ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80 

這裏是我搜索文件的樣本:

ltm pool pool_10.1.105.30_80 { 
    load-balancing-mode observed-member 
    members { 
     node_10.1.104.163:http { 
      address 10.1.104.163 
      session monitor-enabled 
      state up 
     } 
     node_10.1.104.164:http { 
      address 10.1.104.164 
      session monitor-enabled 
      state up 
     } 
    } 
    monitor http_200_OK 
} 
ltm pool pool_10.1.105.31_80 { 
    load-balancing-mode observed-member 
    members { 
     node_10.1.104.163:http { 
      address 10.1.104.163 
      session monitor-enabled 
      state up 
     } 
     node_10.1.104.164:http { 
      address 10.1.104.164 
      session monitor-enabled 
      state up 
     } 
    } 
    monitor http_200_OK 
} 

由於提前, 克里斯

編輯:拼寫和格式。

回答

1
$ awk -v tgt="address 10.1.104.164" ' 
    /^ltm pool/ { pool=$0; sub(/ *{ *$/,"",pool) } 
    index($0" ",tgt" ") { print pool } 
' file 
ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80 
+1

這是更好的。 – dawg

+0

謝謝!然而,我遇到了一個問題,讓我們假設地址行是「地址10.1.104.16」,如果我們運行這個awk命令,它將匹配10.1.104.16和10.1.104.164,這將產生不正確的結果。我認爲我們需要設置tgt =「地址10.1.104.164」以使行尾標識符像這樣tgt =「address 10.1.104.164 $」,但是,這不是正確的語法。 –

+0

我調整了腳本來解決這個問題。對於將來的問題 - 在發佈示例輸入/輸出時,如果您仔細考慮並提出一些邊緣案例,例如您在第一次發佈問題時提到的問題,那麼我們可以在嘗試幫助您提出問題時考慮它們提供解決方案而不是稍後發現和調試它們。 –

0

隨着perl

$ perl -0777 -lne 'while (/^(ltm pool pool_[\d._]+)(.*?)(?=^\})/gms){ 
         $m=$1; $t=$2; 
         print "$m\n" if ($t =~ /address 10\.1\.104\.164/)}' file 
ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80 
相關問題