我有这个日志文件,我必须提取只有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!***
提前谢谢你。
答案 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]
最后一个可选参数将输出定向到文件。
希望这有帮助!