2014-11-25 86 views
1

什么命令会给我输出,我需要在非常大的日志文件中为错误代码的每个实例?该文件具有由开始和结束以字符数量标记的记录。如:在多行错误日志中搜索错误代码,然后在Linux上搜索多行错误日志

SR 120 
1414760452 0 1 Fri Oct 31 13:00:52 2014 2218714 4 
    GROVEMR2 scn 
../SrxParamIF.m  284 

New Exam Started 

EN 120 

第五个字段是前面示例中的错误代码2218714。

我以为grep'ing的错误代码和输出-A线后,然后选择我所需要的而不是解析整个文件。这似乎很容易,但我的grep/awk/sed的用法不是那个级别。

只有当遇到错误2274021,如下面的例子我想要一些输出如图所示。

向我显示输出,例如:egrep'线圈:|连接器:|通道故障:|第一道:” ERRORLOG |少

输入感兴趣的文件的部分:

Mon Nov 24 13:43:37 2014  2274021 1 
     AWHMRGE3T  NSP 
SCP:RfHubCanHWO::RfBias   4101 
^MException Class: Unknown Severity: Unknown 
Function: RF: RF Bias 
PSD: VIBRANT Coil: Breast SMI Scan: 1106/14 
Coil Fault - Short Circuit 
A multicoil bias fault was detected. 
. 
Connector: Port 1 (P1) 
Channels faulted: 0x200 
First channel: 10 of 32, counting from 1 
Fault value: -2499 mV, Channel: 10-> 

输出:

Coil: Breast SMI 
Connector: Port 1 (P1) 
Channels faulted: 0x200 
First channel: 10 of 32, counting from 1 

预先感谢任何指针!

+0

你可以使用logstash和多行过滤器,grok提取字段 – eckes 2014-11-25 04:57:54

回答

0

尝试以下操作(通过方便的调整)

#!/usr/bin/perl 

use strict; 
$/="\nEN ";        # register separated by "\nEN " 
my $error=2274021;      # the error! 
while(<>){        # for all registers 
    next unless /\b$error\b/;     # ignore unless error 
    for my $line (split(/\n/,$_)){ 
    print "$line\n" if ($line =~ /Coil:|Connector:|Channels faulted:|First channel:/); 
    } 
    print "====\n" 
} 

这是你需要什么?