将nagios状态文件转换为旧格式的Perl代码?
在使用Nagios V1的现有项目上,我们需要将其升级到Nagios V3。 除了在两个版本之间更改的状态文件(status.dat)之外,一切正常。 使用旧状态文件格式的perl脚本太多,无法更改它们。相反,我想编写一段perl代码,将状态文件从新格式转换为旧格式: 为了简化问题(可以将其视为perl问题): 输入文件如下所示:将nagios状态文件转换为旧格式的Perl代码?,perl,nagios,Perl,Nagios,在使用Nagios V1的现有项目上,我们需要将其升级到Nagios V3。 除了在两个版本之间更改的状态文件(status.dat)之外,一切正常。 使用旧状态文件格式的perl脚本太多,无法更改它们。相反,我想编写一段perl代码,将状态文件从新格式转换为旧格式: 为了简化问题(可以将其视为perl问题): 输入文件如下所示: hoststatus { key1=val1 key2=val2 key3=val3 } hoststatus { k
hoststatus {
key1=val1
key2=val2
key3=val3
}
hoststatus {
key1=val4
key2=val5
key3=val6
}
servicestatus {
key11=val11
key12=val12
key13=val13
}
servicestatus {
key11=val14
key12=val15
key13=val16
}
并应转换为此文件:
HOST;val1;val3;val2
HOST;val4;val6;val5
SERVICE;val13;val11;val12
SERVICE;val16;val14;val15
Note the values are written following a chosen keys order. In the above listing :
"key1,key3,key2" for hoststatus blocks
"key13,key11,key12" for servicestatus blocks
如何用Perl编写代码?我假设每个hoststatus&servicestatus块始终只包含3个键值,并且新的顺序始终是主机的第1、第3、第2个,服务的第3、第1、第2个
#!/usr/bin/perl
use warnings;
use strict;
open (my $IN,'<','status.dat') or die "$!";
my $type;
my @v;
while (<$IN>) {
chomp;
if (/(.+)status/) {
$type=uc $1;
}
elsif (/=(.+)/) {
push @v,$1;
}
elsif (/\}/) {
if ($type eq 'HOST') {
print join(';',$type,$v[0],$v[2],$v[1]),"\n";
}
elsif ($type eq 'SERVICE') {
print join(';',$type,$v[2],$v[0],$v[1]),"\n";
}
undef @v;
}
}
close $IN;
#/usr/bin/perl
使用警告;
严格使用;
打开(我的$IN,'你尝试了什么?你需要付出一些努力,编写一些代码,向我们展示你做了什么以及你遇到了什么问题。不太可能有人会为你编写解决方案。这不是一个帮助网站吗?谢谢!我是perl新手,它对我帮助很大。