2014-11-25 90 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" 
} 

這是你需要什麼?