0

我有这个日志文件,我必须提取仅通过测试用例的 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!***

提前谢谢你。

4

3 回答 3

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]

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

希望这可以帮助!

于 2013-10-21T04:55:51.413 回答
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!***如果不在之后,模式将失败。

于 2013-10-21T03:34:07.390 回答
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
    }
} 
于 2013-10-21T03:24:51.447 回答