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。探しているノードへの参照をgrepすると、そのホスト定義ブロック内の他のすべての行が明らかに除外されます。ヘルプ?

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

別の 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 に答える
0
 sed -ne '/define/,/}/H;/}/{x;/node2/\!p;s/.*//;h}' filename

これはするだろう

于 2013-04-15T09:55:39.350 に答える
0

ここに奇抜なgrep解決策があります

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

ほとんどの場合、grep が 2 回行われるため、これが最も遅くなります。一致するエントリが複数ある場合、問題が発生する可能性がありますnode2

于 2013-04-16T23:22:17.863 に答える