根据perl中日志文件中的条件提取特定URL

时间:2013-10-21 03:16:51

标签: regex perl

我有这个日志文件,我必须提取只有Passed测试用例的REQ-URL(实际上它只有2行)。如何检查它是否为Passed测试用例然后解压缩?这份清单长10页。请有人帮我解决这个问题。我暂时坚持这个问题了一段时间。

[Case MostPopular-BlogFlag] 
[REQ-URL]: http://hostname:8080/guiderest?
customerId=cisco&code=news&guide=MostPopular&attrFilter=BlogFlag:true&v=1
***Passed!***
  .
  .
  .
[Case MostPopular-BlogFlag] 
[REQ-URL]: http://hostname:8080/guiderest?
customerId=cisco&code=news&guide=MostPopular&attrFilter=BlogFlag:true&v=1
***Failed!***

提前谢谢你。

3 个答案:

答案 0 :(得分:0)

您必须实现基本状态机。

if ( $line =~ /REQ_URL/) {
    $maybe_line = $line ;
    $append = 1 ;
} elsif ( $line =~ /\*\*\*(Passed|Failed)/ {
      if ( $1 =~ /Passed/ ) {
         output_line($maybe_line,$line) ;
      }
      $append = "" ; 
      $maybe_line = "" ; 
} else {
    if ( $append ) {
       $maybe_line .= $line
    }
} 

答案 1 :(得分:0)

你可以这样做:

#!/usr/bin/perl

use strict;

my $string = '[Case MostPopular-BlogFlag1] 
[REQ-URL]: http://hostname:8080/guiderest?
customerId=cisco&code=news&guide=MostPopular&attrFilter=BlogFlag:true&v=1
***Passed!***
  .
  .
  .
[Case MostPopular-BlogFlag] 
[REQ-URL]: http://hostname:8080/guiderest?
customerId=cisco&code=news&guide=MostPopular&attrFilter=BlogFlag:true&v=1
***Failed!***';

while($string =~ /\[Case\h+(?<case>[^]]+)]\s*\[REQ-URL]:\h+(?<url>\S+(\?\R\S+)?)\s*\*+Passed!\*+/g) {
    print $+ {case} . "\n" . $+ {url} . "\n\n";
}

如果不在***Passed!***之后,模式将失败。

答案 2 :(得分:0)

一个选项是将Perl的记录分隔符($/)设置为“[Case MostPopular-BlogFlag]”,因此日志将以该字符串分隔的“块”进行读取。接下来,使用包含“*** Passed!”的正则表达式。如果它不存在,请获取下一条记录。如果找到,请从捕获的URL中删除所有换行符,然后将其打印出来:

use strict;
use warnings;

local $/ = '[Case MostPopular-BlogFlag]';

while (<>) {
    next unless my ($url) = /\[REQ-URL\]:\s+([^*]+)\*\*\*Passed!/;
    $url =~ s/\n//g;
    print "$url\n";
}

用法:perl script.pl inFile [>outFile]

最后一个可选参数将输出定向到文件。

希望这有帮助!