从文件中间删除文件中的部分

时间:2013-04-12 13:14:59

标签: bash sed awk

我为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行,并且对我正在查找的节点的引用的显示会明显排除该主机定义块中的每一行。帮助

5 个答案:

答案 0 :(得分: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
    }

答案 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
    }

答案 2 :(得分:0)

这是另一个sed解决方案:

sed -e '/define\s*host/{:next;/}/{/host_name\s*node2/d;b;};N;b next;}' file

答案 3 :(得分:0)

 sed -ne '/define/,/}/H;/}/{x;/node2/\!p;s/.*//;h}' filename

这样做

答案 4 :(得分:0)

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

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

很可能这是因为两个greps而来的最慢。如果您有多个匹配node2

的条目,则可能会导致问题