Regex perl if-then-else逻辑以及如果正则表达式不';不匹配
到目前为止,我有一些工作代码进入服务器列表,并执行一些正则表达式从日志文件中获取数据。我想做的是,如果在特定服务器上没有要从正则表达式捕获的数据,则弹出一个状态“此服务器无需报告” 现在,它通过每台服务器,如果数据与正则表达式匹配,就会打印出来。 我添加了一个else语句来打印出上面的语句来处理这个问题,但是现在它会打印出每个不匹配的实例 这是我添加更改之前的输出副本,它现在可以工作了Regex perl if-then-else逻辑以及如果正则表达式不';不匹配,regex,perl,if-statement,regex-negation,Regex,Perl,If Statement,Regex Negation,到目前为止,我有一些工作代码进入服务器列表,并执行一些正则表达式从日志文件中获取数据。我想做的是,如果在特定服务器上没有要从正则表达式捕获的数据,则弹出一个状态“此服务器无需报告” 现在,它通过每台服务器,如果数据与正则表达式匹配,就会打印出来。 我添加了一个else语句来打印出上面的语句来处理这个问题,但是现在它会打印出每个不匹配的实例 这是我添加更改之前的输出副本,它现在可以工作了 =======================================================
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname2
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
========================================================================
这是现在输出的副本,在我添加了“此日期无需报告的内容”之后(在while循环中)。基本上,每次不匹配的时候都会打印出来。我真的只想让它给我一个陈述
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
NOTHING TO REPORT FOR THIS DATE...
NOTHING TO REPORT FOR THIS DATE...
NOTHING TO REPORT FOR THIS DATE...
...
...
========================================================================
NOTHING TO REPORT FOR THIS DATE...
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2
NOTHING TO REPORT FOR THIS DATE...
NOTHING TO REPORT FOR THIS DATE...
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
代码如下:
# Usage: ./test.pl Ju1 05 2010 <logfilepath> hostname1 hostname2 hostname3
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
splice(@ARGV, 0, 4, ());
foreach my $server ( @ARGV ) {
print "========================================================================\n";
print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
while (my $line = <$fh>) {
if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
print $line;
# adding else statement here
} else {
print "NOTHING TO REPORT FOR THIS DATE... \n";
}
}
close($fh);
}
#用法:./test.pl Ju1 05 2010主机名1主机名2主机名3
严格使用;
使用警告;
我的($mon,$day,$year,$file)=@ARGV;
拼接(@ARGV,0,4,());
foreach my$server(@ARGV){
打印“===================================================================================================================\n”;
打印“备份服务器的报告摘要:$SERVER\n”;
打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
while(我的$line=){
如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
打印$行;
#在此处添加else语句
}否则{
打印“此日期无需报告…\n”;
}
}
收盘价($fh);
}
我不认为,我做对了。我按照建议(@mcandre)进行了尝试,并将其置于while循环之外,但仍然得到了相同的行为。我应该把这张支票放在哪里
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $boolean = 0;
splice(@ARGV, 0, 4, ());
foreach my $server ( @ARGV ) {
print "========================================================================\n";
print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
while (my $line = <$fh>) {
if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
print $line;
$boolean=1; #set to true
#print "Boolean is set to $boolean \n";
}
} #end while loop
if ($boolean=0) {
print "Boolean is set to $boolean \n";
print "NOTHING TO REPORT FOR THIS DATE... \n";
}
close($fh);
}
使用严格;
使用警告;
我的($mon,$day,$year,$file)=@ARGV;
我的$boolean=0;
拼接(@ARGV,0,4,());
foreach my$server(@ARGV){
打印“===================================================================================================================\n”;
打印“备份服务器的报告摘要:$SERVER\n”;
打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
while(我的$line=){
如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
打印$行;
$boolean=1;#设置为true
#打印“布尔值设置为$Boolean\n”;
}
}#边结束边循环
如果($boolean=0){
打印“布尔值设置为$Boolean\n”;
打印“此日期无需报告…\n”;
}
收盘价($fh);
}
现在可以使用:
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $has_data = 0;
splice(@ARGV, 0, 4, ());
foreach my $server ( @ARGV ) {
print "========================================================================\n";
print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
while (my $line = <$fh>) {
if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
print $line;
$has_data=1; #set to true
#print "Boolean is set to $has_data \n";
}
} #end while loop
if ($has_data==0) {
print "Boolean is set to $has_data \n";
print "NOTHING TO REPORT FOR THIS DATE... \n";
}
$has_data=0;
print "Boolean is reset to $has_data \n";
close($fh);
}
使用严格;
使用警告;
我的($mon,$day,$year,$file)=@ARGV;
my$has_data=0;
拼接(@ARGV,0,4,());
foreach my$server(@ARGV){
打印“===================================================================================================================\n”;
打印“备份服务器的报告摘要:$SERVER\n”;
打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
while(我的$line=){
如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
打印$行;
$has_data=1;#设置为true
#打印“布尔值设置为$has\u data\n”;
}
}#边结束边循环
如果($has_data==0){
打印“布尔值设置为$has\u data\n”;
打印“此日期无需报告…\n”;
}
$has_data=0;
打印“布尔值重置为$has\u data\n”;
收盘价($fh);
}
Woah,这本书很值得一读。我想你的意思是说,“给我一些Perl代码,如果没有一行与正则表达式匹配,那么就不会打印任何要报告的内容。”为什么不使用Perl“格式”编程?至少,这真的适用于此类任务。在格式方面,我需要什么?你是说使用printf吗?谢谢。@jaedre619,我相信@Pmod指的是perl的格式和编写语句:@jaedre619:In如果($boolean=0)
,则将0赋值给$boolean
。如果($boolean==0),则需要
。您还可能希望在foreach
循环内将$boolean
重置回0。另外,您应该将$boolean
重命名为有意义的名称,例如$has_data
。此外,您正在使用strict和warnings,因此在编译和运行它时应该看到类似的内容:Found=in conditional,should==at…
。不要忽视这些警告,它们会告诉你出了什么问题。@indiv:谢谢!!它知道的工作,因为我想它太…而且,我并没有忽视警告。我会尽力解决这个问题。谢谢。谢谢你帮我处理这个逻辑。我一直使用这个模式:)你不需要重置$has\u data=0代码>最后,由于您不再使用它,如果您可以undef$的任何内容都有\u数据
。另外,if($has\u data==0)
也可以变成if($has\u data)
。