2013-06-21 90 views
-1

我有一个文件看起来像这样如何解析和检测perl中日志文件中的一行代码块?

[ 
MsgName:XYZ 
Status:Pass 
] 

[ 
MsgName:ABC 
Status:Pass 
] 

[ 
MsgName:bbb 
Status:Fail 
Error 
] 

[ 
MsgName:ttt 
Status:Pass 
] 

现在我想在这

读取该文件,并创建2个日志文件 包含所有数据,并含有唯一的错误数据的其他错误日志中一个常规LOG

所以在这种情况下,错误日志应该只显示

[ 

MsgName:bbb 

Status:Fail 

Error 

] 

和regfular记录所有

任何人都可以指导我如何做到这一点

我试过这样

while($line[i]=<FileHandle> 
{ 

if($line[i]=~ /^s*\]/) 
{ 
    print OUT "recd new msg-->:/n $line[i]; 
    next; 
} 
do 

{ 
    print OUT "$line[i]"; 
    if($line[i]=~ /Error/) 

{ ####this section i cannot figure out hw to frame it get my desired output 

    print "error found 

    print ERROROUT ..... 

} until($line[i]=~ /^s\] 

这里我用OUT的常规日志输出 和ERROROUT错误日志

+0

我想补充我希望错误味精的整个块,而不仅仅是错误行 – user2486369

回答

0

最简单的窍门是存储整个阻止你感兴趣的事情,在你遍历文件时用fifo。

#!/usr/bin/perl 

use strict; 
use warnings; 

my @fifo=('') x 5; # Initialize an empty array with size = 5 (Message Block Size) 
open(FILE,"log.txt"); 

while(<FILE>) 
{ 
    push(@fifo,$_);  # Add element to the end of array making its size 6 
    shift @fifo;   # Remove first element reverting its size back to 5 
    if($fifo[3]=~/Error/) # Check if 4th line of block has error in it 
    { 
     print @fifo; 
    } 
} 
close(FILE) 
+0

任何其他方式,而不是存储和检查....你有什么办法可以同时检查,同时travsering – user2486369

+0

此代码没有按如果这是你所要求的,则不存储整个文件。它只在遍历文件时记住最后五行。所以本质上它是在遍历时进行检查。 – Jean

+0

Thnaks它我修改了它有点可能,它的工作。 – user2486369