0

我有许多 Icinga 实例的 .cfg 文件,我需要使用 bash 脚本自动删除对特定主机的每个引用。这是一个示例,我需要删除 node2 的主机定义:

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行,并且对我正在寻找的节点的引用显然排除了该主机定义块中的所有其他行。帮助?

4

5 回答 5

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
    }
于 2013-04-12T13:21:56.323 回答
0

这是一个古怪的grep解决方案

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

由于两个 grep,这很可能是最慢的。如果您有多个条目匹配,可能会导致问题node2

于 2013-04-16T23:22:17.863 回答
0
 sed -ne '/define/,/}/H;/}/{x;/node2/\!p;s/.*//;h}' filename

这会做

于 2013-04-15T09:55:39.350 回答
0

这是另一个 sed 解决方案:

sed -e '/define\s*host/{:next;/}/{/host_name\s*node2/d;b;};N;b next;}' file
于 2013-04-12T13:42:29.273 回答
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
    }
于 2013-04-12T13:29:46.747 回答