我正在将一些旧的 Nagios 配置数据从 Nagios Core 移植到 Nagios XI。这项工作的一部分意味着我需要提取一些对象定义并将它们放入由主机名命名的单个文件中(示例如下)。我可以看到很多方法来做到这一点,可能是通过编写脚本(Perl/Python/PHP - Nagios XI 脚本似乎都是用 PHP 完成的)。但是我想知道是否有更简单的方法可以做到这一点,也许在命令行上使用awk
或类似?令我震惊的是,awk 可以很容易地提取两个定界模式之间的文本行(例如/define host \{/
和/\}/
),但我需要将输出分成由 host_name 字段的内容命名的单个文件。
最好的方法是什么?我最好写一个脚本,还是有一个简洁的 awk 命令(或类似命令)可以从 Nagios XI 机器上的 bash shell 运行?
示例整体文件:
define host {
host_name testhost1
use hosttemplate1
address 10.0.0.1
host_groups +linux,all
contact_groups +servicedesk
alias testhost1
icon_image redhat_icon.png
}
define service {
use servtemplate1
host_name testhost1
service_groups +All
service_description A Test Service
}
define host {
host_name testhost2
use hosttemplate2
address 10.0.0.2
host_groups +linux,all
contact_groups +servicedesk
alias testhost2
icon_image redhat_icon.png
}
期望的输出:
# cat testhost1.cfg
define host {
host_name testhost1
use hosttemplate1
address 10.0.0.1
host_groups +linux,all
contact_groups +servicedesk
alias testhost1
icon_image redhat_icon.png
}
# cat testhost2.cfg
define host {
host_name testhost2
use hosttemplate2
address 10.0.0.2
host_groups +linux,all
contact_groups +servicedesk
alias testhost2
icon_image redhat_icon.png
}
例如,现在我可以运行这样的命令,该命令似乎相当广泛地用于行提取:
# gawk ' /define host / {flag=1;next} /}/{flag=0} flag { print }' example.cfg
这切断了define host
and}
但这是一个相对简单的修复 - 但是它将数据作为 shell 中的一个流输出。
我可以实现一些聪明的技巧来完成所有这些工作,包括从外壳上的一个衬里拆分成单独的配置文件,还是我应该编写一个脚本?