如何从perl中的日志文件中解析和检测一行行?

时间:2013-06-21 15:25:14

标签: arrays perl parsing

我的文件看起来像这样

[
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用于错误日志

1 个答案:

答案 0 :(得分:0)

最简单的方法是在遍历文件时以十五行存储您感兴趣的整个块。

#!/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)