【问题标题】:Perl find whether more than one string is in a log file then printPerl 查找日志文件中是否有多个字符串然后打印
【发布时间】:2013-05-15 13:17:34
【问题描述】:

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

#!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\bin\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\bin\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";

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

【问题讨论】:

  • 我在我的解决方案中使用了三元组的答案,但已使用 mpapec 输入修改了上面的代码以修复此脚本。

标签: perl


【解决方案1】:

你把这弄得太复杂了。你真的只需要阅读一下正则表达式的工作原理,但这是一个非常简单的问题:

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

【讨论】:

  • 或者甚至只是命令行上的perl -ne 'warn "$_" and last if /Failed|Skipped|Error/' email_log.txt(在Windoze上颠倒引号)。
  • 如果你想要一个单行,根本不要使用 perl,只需使用 grep。
  • 是的,egrep -m 1 "Failed|Skipped|Error" email_log.txt
  • 这可行,但如果日志文件中有多个错误,我会多次收到 Build Failed。
【解决方案2】:

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

我还将修改您的 open 调用以使用 3-arg 词法范围版本。

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);

【讨论】:

    【解决方案3】:

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

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

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

    while (my $loglines = &lt;$LOG&gt;) { ... close($LOG);

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

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

    【讨论】:

    • 这成功了!非常感谢您的帮助。
    • #!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl 使用警告; $mylog = "email_log.txt";打开 (LOG, ") { if ($loglines =~ /(Failed|Skipped|Error)/) { print "Error in the log\n";最后一个LOG_READER; # 最后的; } } 关闭(日志);
    【解决方案4】:

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

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

    然后

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

    【讨论】:

    • 这也很有效。我在 Windows 上,所以我不得不删除引号。真的,真的很有帮助,谢谢。
    • 引号来自您的代码;如果不需要它们,那是您的尝试没有成功的另一个原因。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2016-12-11
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多