2013-04-12 75 views
0

我有很多用於Icinga實例的.cfg文件,我需要使用bash腳本自動刪除對特定主機的每個引用。這裏有一個例子,我需要刪除主機定義節點2:從中間模式的文件中刪除部分

define host{ 
    use      nonprod-iblade 
    host_name    node1 
    address     node1.mydomain.com 
    alias     88.88.88.88 
    } 
define host{ 
    use      nonprod-iblade 
    host_name    node2 
    address     node2.mydomain.com 
    alias     88.88.88.88 
    } 
define host{ 
    use      nonprod-iblade 
    host_name    node3 
    address     node3.mydomain.com 
    alias     88.88.88.88 
    } 

我試過awk '/define host/ {for(i=1; i<=5; i++) {getline; print}}' filename但不包括define host線,和grepping的參考節點我要找排除明顯該主機定義塊中的每隔一行。幫幫我?

+3

自動:D –

回答

2

該解決方案是相當自動魔法:

$ awk '!/node2/&&$1{printf "%s}",$0}' RS='}' file 
define host{ 
    use      nonprod-iblade 
    host_name    node1 
    address     node1.mydomain.com 
    alias     88.88.88.88 
    } 
define host{ 
    use      nonprod-iblade 
    host_name    node3 
    address     node3.mydomain.com 
    alias     88.88.88.88 
    } 
+0

我在我現有的配置文件中使用了此節點引用,我確認存在,並得到了ole「Event not found」錯誤。 –

+0

@TImCarter你正在使用'csh'嗎? shell在這裏解釋'!'這裏你最好轉義它,試試'awk'\!/ node2/&& $ 1 {printf「%s}」,$ 0}'RS ='}'file'更好地使用'bash': D請參閱此處瞭解更多信息http://www.grymoire.com/Unix/Csh.html#uh-1 –

0

使用SED(有點複雜),刪除空行

$ sed '/define/{x;p;x;}' < filename | sed -e '/./{H;$!d;}' -e 'x;/node2/d' | sed '/^$/d' 
define host{ 
    use      nonprod-iblade 
    host_name    node1 
    address     node1.mydomain.com 
    alias     88.88.88.88 
    } 
define host{ 
    use      nonprod-iblade 
    host_name    node3 
    address     node3.mydomain.com 
    alias     88.88.88.88 
    } 
0

下面是另一個SED解決方案:

sed -e '/define\s*host/{:next;/}/{/host_name\s*node2/d;b;};N;b next;}' file 
0
sed -ne '/define/,/}/H;/}/{x;/node2/\!p;s/.*//;h}' filename 

這會做

0

這裏是一個古怪的grep解決方案

grep -v -P "`grep -A2 -B2 node2 [file]`" [file] 

最有可能這是最慢的是由於兩個裏grep。可能會導致問題,如果您有多個匹配的條目node2