2013-04-12 32 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