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