Perl查找日志文件中是否有多个字符串然后打印

时间:2013-05-20 21:29:38

标签: perl

您好,只是学习Perl所以请原谅。我想要做的是,如果日志文件包含一个或多个这些字符串失败,错误或跳过然后打印出错误。(日志可能有一个或多个arrary中的所有字符串或只有一个实例)我尝试过以下代码的变体。它编译但它只打印出完成。

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl

my @matches = (
  qr/"Failed"/,
  qr/"Skipped"/,
  qr/"Error"/,
 );

$mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <$LOG>) {
  if ($loglines =~ /@matches/) { 
   print "Error in the log\n";
   last LOG_READER;
  }
}
close($LOG);

print "\n Test is Done \n";

我也试过

while ( $_ = <INPUT> ) {

  if( $_ =~ @matches ){
    print "\n Build Failed! \n";
  }
}

谢谢你的帮助 修改后的代码有效 此解决方案使用数组     #perl的= C:\ IBM \ RationalSDLC \ ClearCase的\ BIN \ perl的

my @matches = qr/Failed | Skipped | Error/x;

my $mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <LOG>) {
  if ($loglines =~ /$matches/) { 
   print "Error in the log\n";
   last LOG_READER;
  }
}
close(LOG);

print "\n Test is Done \n";

这个解决方案就是我用过的     #perl的= C:\ IBM \ RationalSDLC \ ClearCase的\斌\ perl的     使用警告;     使用严格;

my $myfailures = qr/Failed | Skipped | Error/x;
my $mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <LOG>) {
  if ($loglines =~ /$myfailures/) {
   print "Error in the log\n";
   last LOG_READER;
#    last;
  }
}

close(LOG);

print "\n Test is Done \n";

另一种解决方案     #perl的= C:\ IBM \ RationalSDLC \ ClearCase的\斌\ perl的     使用警告;     使用严格;

my $mylog = "email_log.txt";

open (INPUT, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while(<INPUT>) {
    next unless /(Failed|Skipped|Error)/;
    print "\n Build failed \n";
    last;
}

close(INPUT);

print "\n Test is Done \n";

解决方案#4

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl
use warnings;
use strict;

my $matches = "Failed|Skipped|Error";
my $mylog = "email_log.txt"; 

open my $LOG, "<", $mylog|| die 'Could not OPEN $mylog file';

while (my $loglines = <$LOG>) {
    if ($loglines =~ /$matches/) { 
        print "\n Error in the log\n";
        last;
    }
}
close($LOG);

print "\n Test is Done \n";

感谢大家的贡献。他们都非常希望我能给每个人正确答案。通过提供的解决方案,我能够使所有变体工作。

4 个答案:

答案 0 :(得分:4)

  

if ($loglines =~ /@matches/) {

这是你的问题。您不能使用数组作为匹配的正则表达式。试试这个:

  if ($loglines =~ /"(Failed|Skipped|Error)"/) { 
  

while (my $loglines = <$LOG>) {    ...   close($LOG);

哦,这应该只是LOG没有美元符号。

使用use strict; use warnings;,您将获得更好的诊断。养成这个习惯。

答案 1 :(得分:2)

你这太复杂了。你真的只需要阅读有关正则表达式如何工作的一些内容,但这是一个非常简单的问题需要解决:

while(<INPUT>) {
    next unless /"(Failed|Skipped|Error)"/;
    print "\n Build failed \n";
    last;
}

答案 2 :(得分:1)

你可以使用正则表达式数组,但对于这种特殊情况,它不是必需的,

my $matches = qr/"Failed" | "Skipped" | "Error"/x;

然后

if ($loglines =~ /$matches/) { .. }

答案 3 :(得分:1)

首先。我会一直使用use warnings; use strict;

我还会修改你的open调用以使用3-arg,lexical scoped版本。

open my $fh, "<", $mylog; 

你到底想要在这里匹配什么?

my @matches = (
  qr/"Failed"/,
  qr/"Skipped"/,
  qr/"Error"/,
 );

日志文件中的示例会有所帮助。您正在尝试匹配实际引号中包含的这些关键字。这是你的意图吗?

email_log.txt示例:

Your build "Failed"
"Skipping" foo.c

这将匹配或不包含引号:

my $matches = "Failed|Skipped|Error";
my $mylog = "email_log.txt";
open my $fh, "<", $mylog; 

while (my $loglines = <$fh>) {
    if ($loglines =~ /$matches/) { 
        print "Error in the log\n";
        last;
    }
}
close($fh);