如何在perl中解析特定行?

如何在perl中解析特定行?,perl,parsing,logging,Perl,Parsing,Logging,我有一个来自应用服务器的日志,我需要得到带有“E”标志或“W”的行,如果鞭毛行后面有一行,我也需要得到它 我试图找出一个脚本: #!/usr/bin/perl use strict; use warnings; my $msg; my $line; my $line2; main(@ARGV); sub rec { #$msg= $line; print $line; while ( $line2 = <FH>) { if ( $line2

我有一个来自应用服务器的日志,我需要得到带有“E”标志或“W”的行,如果鞭毛行后面有一行,我也需要得到它

我试图找出一个脚本:

#!/usr/bin/perl
use strict;
use warnings;

my $msg;
my $line;
my $line2;
main(@ARGV);

sub rec {
    #$msg= $line;
    print $line;
    while ( $line2 = <FH>) {
        if ( $line2 !~ m/^\[/ ){
            #$msg = $msg.$line2;
            print $line2;
        } else {
            if($line2 =~ m/ E | W /) { rec(); }
            last;
        }

    }
    #print $msg;
}
sub main {
    open(FH,'SystemOut_15.02.05_17.00.02.log') or die "Error openong file : $!";
    while ( $line = <FH>) {
        if($line =~ m/ E | W / and $line =~ m/^\[/){
                rec();
        }
    }
    close FH;
  }
我需要得到的是:

    [2/5/15 14:55:18:025 UTC] 0000003a JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 17006, S
QLState: null
[2/5/15 14:55:18:025 UTC] 0000003a JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 17006, SQLState: null
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
    [2/5/15 14:55:18:025 UTC] 0000003a JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 17006, SQLState: null
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
    [2/5/15 14:55:18:025 UTC] 0000003a JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 17006, SQLState: null
    [2/5/15 14:55:18:025 UTC] 0000003a JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 17006, SQLState: null
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
                                                        org.hibernate.util.JDBCExceptionReporter
忽略启动和停止之间线路的一种强有力的方法是使用ysth指示的触发器;其他(弱)方法:


open(my$fh),非常简单;您只需跟踪当前是否在匹配的多行记录中,并使用排除行的开始/结束服务器范围:

open(my $fh, '<', 'SystemOut_15.02.05_17.00.02.log') or die "Error opening file : $!";
my $match = 0;
while ( my $line = <$fh> ) {
    unless ( $line =~ /^\*+ Start Server \*+$/ .. $line =~ /^\*+ End Server \*+$/ ) { 
        if ( $line =~ /^\[/ ) {
            $match = $line =~ m/ E | W /;
        }
        print $line if $match;
    }
}
close $fh;

open(my$fh),非常简单;您只需跟踪当前是否在匹配的多行记录中,并使用排除行的开始/结束服务器范围:

open(my $fh, '<', 'SystemOut_15.02.05_17.00.02.log') or die "Error opening file : $!";
my $match = 0;
while ( my $line = <$fh> ) {
    unless ( $line =~ /^\*+ Start Server \*+$/ .. $line =~ /^\*+ End Server \*+$/ ) { 
        if ( $line =~ /^\[/ ) {
            $match = $line =~ m/ E | W /;
        }
        print $line if $match;
    }
}
close $fh;

open(my$fh),非常简单;您只需跟踪当前是否在匹配的多行记录中,并使用排除行的开始/结束服务器范围:

open(my $fh, '<', 'SystemOut_15.02.05_17.00.02.log') or die "Error opening file : $!";
my $match = 0;
while ( my $line = <$fh> ) {
    unless ( $line =~ /^\*+ Start Server \*+$/ .. $line =~ /^\*+ End Server \*+$/ ) { 
        if ( $line =~ /^\[/ ) {
            $match = $line =~ m/ E | W /;
        }
        print $line if $match;
    }
}
close $fh;

open(my$fh),非常简单;您只需跟踪当前是否在匹配的多行记录中,并使用排除行的开始/结束服务器范围:

open(my $fh, '<', 'SystemOut_15.02.05_17.00.02.log') or die "Error opening file : $!";
my $match = 0;
while ( my $line = <$fh> ) {
    unless ( $line =~ /^\*+ Start Server \*+$/ .. $line =~ /^\*+ End Server \*+$/ ) { 
        if ( $line =~ /^\[/ ) {
            $match = $line =~ m/ E | W /;
        }
        print $line if $match;
    }
}
close $fh;

open(my$fh),阅读和上提供的优秀POE::Wheel::FollowTail家伙提供的代码示例,您可能会受益匪浅

由于日志文件有多行记录,您的任务并不像人们最初猜测的那么简单。您需要创建一个模式来标识记录的开头([2/5/15 14:55:18:025 UTC]000000 3A JDBCO),我会测试是否可以安全地选择日期时间字符串后跟十六进制数字和jdbception内括号,以及是否所有以空格开头的行都在继续相同的记录(这需要测试)

您可能只需要捕获每条记录并将其发送给另一个事件处理,或者甚至使用类似的方法发送每条记录以在子进程上处理,假设您需要一个词法分析器(log taillor)和一个语义分析器(解释日志记录)


我不知道有多行,但您可能会从阅读的代码中获益。

您可能会从阅读和上提供的优秀POE::Wheel::FollowTail家伙提供的代码示例中获益

由于日志文件有多行记录,您的任务并不像人们最初猜测的那么简单。您需要创建一个模式来标识记录的开头([2/5/15 14:55:18:025 UTC]000000 3A JDBCO),我会测试是否可以安全地选择日期时间字符串后跟十六进制数字和jdbception内括号,以及是否所有以空格开头的行都在继续相同的记录(这需要测试)

您可能只需要捕获每条记录并将其发送给另一个事件处理,或者甚至使用类似的方法发送每条记录以在子进程上处理,假设您需要一个词法分析器(log taillor)和一个语义分析器(解释日志记录)


我不知道有多行,但您可能会从阅读的代码中获益。

您可能会从阅读和上提供的优秀POE::Wheel::FollowTail家伙提供的代码示例中获益

由于日志文件有多行记录,您的任务并不像人们最初猜测的那么简单。您需要创建一个模式来标识记录的开头([2/5/15 14:55:18:025 UTC]000000 3A JDBCO),我会测试是否可以安全地选择日期时间字符串后跟十六进制数字和jdbception内括号,以及是否所有以空格开头的行都在继续相同的记录(这需要测试)

您可能只需要捕获每条记录并将其发送给另一个事件处理,或者甚至使用类似的方法发送每条记录以在子进程上处理,假设您需要一个词法分析器(log taillor)和一个语义分析器(解释日志记录)


我不知道有多行,但您可能会从阅读的代码中获益。

您可能会从阅读和上提供的优秀POE::Wheel::FollowTail家伙提供的代码示例中获益

由于日志文件有多行记录,您的任务并不像人们最初猜测的那么简单。您需要创建一个模式来标识记录的开头([2/5/15 14:55:18:025 UTC]000000 3A JDBCO),我会测试是否可以安全地选择日期时间字符串后跟十六进制数字和jdbception内括号,以及是否所有以空格开头的行都在继续相同的记录(这需要测试)

您可能只需要捕获每条记录并将其发送给另一个事件处理,或者甚至使用类似的方法发送每条记录以在子进程上处理,假设您需要一个词法分析器(log taillor)和一个语义分析器(解释日志记录)


我不知道有多行,但您可能会受益于阅读的代码。

该行表示一行(当您找到它时停止查找)?你能解释一下你的代码要做什么吗?它似乎比你对你想要的东西的描述要复杂得多。你能给出一个输入样本和你想要提取的东西吗?@ysth/@Sobrique:不,它会查找一个模式的所有出现情况,所以你不只是想要后面的下一行,而是想要任何不需要的-[每次匹配后都有几行?这一行意味着一行(当你找到它时就不要再看了)?你能解释一下你的代码是用来做什么的吗?它看起来比你描述的要复杂得多。你能给出一个输入示例和你希望提取的内容吗?@ysth/@Sobrique:不,它寻找所有内容