2011-01-27 11 views
2

ログファイルには多くのデータがあり、データと時間に基づいてソートされます。各ログのサイズは、サイズが異なる場合があります。grepパターンに基づいてファイルコンテンツの表示をカスタマイズする

ログファイルの特定のパターンを検索したいと思います。パターンが一致すると、その特定のログが画面に表示されます。

すべてのシェルコマンドは相当なものです。

ログファイルの例: - 私は特定のIPアドレス192.189.52.200を検索する場合ここで

07/17/2008 10:24:12.323411 >00.23 
Line 441 of xx file 
Dest IP Address: 192.189.52.255   Source IP Address: 192.189.52.200 

000: 0101 0600 4D8C 444C 0000 0000 C0BD 34C8 
008: C0BD 34C9 C0BD 34C9 0000 0000 FFFF FFFF 


07/17/2008 10:24:12.323549 >000.000138 
    Use req data 

000: 0231 7564 705F 7573 7272 6571 2073 6F63 

07/17/2008 10:24:12.323566 >000.000017 
Local 192.189.52.200 Port 68 : Remote 0.0.0.0   Port 0 

000: 012D             .-    
000: 0000 0000 000A 0002 000A 012D    ...........-  

    0: NULNUL NULNUL NULLF NULSTX NULLF SOH -    

。それは、あなたはgrep、と-A[n]フラグを使用することができ、

07/17/2008 10:24:12.323566 >000.000017 
Local 192.189.52.200 Port 68 : Remote 0.0.0.0   Port 0 

000: 012D             .-    
000: 0000 0000 000A 0002 000A 012D    ...........-  

    0: NULNUL NULNUL NULLF NULSTX NULLF -    

答えて

0

これは、レコードセパレータ(RS)のための正規表現を使用してのGNU AWK(gawk)が必要となります。

#!/usr/bin/awk -f 
BEGIN { 
    pattern = ARGV[1] 
    delete ARGV[1] 

    # could use --re-interval 
    d = "[0-9]" 
    RS = d d "/" d d "/" d d d d " " d d ":" d d ":" d d "[^\n]*\n" 
} 

NR > 1 && ($0 ~ pattern || rt ~ pattern) { 
    print rt 
    print $0 
} 

{ 
    rt = RT # save RT for next record 
} 

これはきれいではありませんが、機能します。

このようなファイル名を指定して実行して:

./script.awk regex logfile 

例:

$ ./script.awk 'C0BD|012D' logfile 

07/17/2008 10:24:12.323411 >00.23 

Line 441 of xx file 
Dest IP Address: 192.189.52.255   Source IP Address: 192.189.52.200 

000: 0101 0600 4D8C 444C 0000 0000 C0BD 34C8 
008: C0BD 34C9 C0BD 34C9 0000 0000 FFFF FFFF 



07/17/2008 10:24:12.323566 >000.000017 

Local 192.189.52.200 Port 68 : Remote 0.0.0.0   Port 0 

000: 012D             .- 
000: 0000 0000 000A 0002 000A 012D    ...........- 

    0: NULNUL NULNUL NULLF NULSTX NULLF SOH - 

$ ./script.awk '10:24:12.323549' logfile 
07/17/2008 10:24:12.323549 >000.000138 

    Use req data 

000: 0231 7564 705F 7573 7272 6571 2073 6F63 
+0

@Dennisことが要件では動作しません:おかげで、私はCygwinを使用しています。このシェルスクリプトを実行しようとすると、特定のログイベントを表示するのではなく、ログファイル全体が表示されます。 – Thangaraj

+0

@Thangaraj:Cygwinではうまく動作します。ログファイルにWindowsまたはUnixの行末がありますか? 'awk --version'とは何ですか?あなたのサンプルデータを使って、どの正規表現を試しましたか?あなたはそれらを引用しましたか? –

+0

@Dennis: $ awkの--version GNU Awkの3.1.8 $ ./script.awk '10:24:12.323549' winLogfile.txt 私はメモ帳やviエディタだけでなくを使用して、このログファイルを保存しています。しかし結果は同じです。この問題に対処する助けがあれば、それは相当なものです。 – Thangaraj

0

相応のような全体のイベントログを表示する場所をnたち試合後の行数。例えば

grep -A6 '192.189.52.200' my.log 
+0

残念ながら、これは、各エントリは異なる長さの – xaxxon

0

あなたはRubyやそれをインストールする可能性がある場合は、ログファイルとプリントのマッチングエントリを解析するスクリプトを書くことができます。ここでは動作するはずのスクリプトは次のとおりです。

filename=ARGV[0] 
regexpArg=ARGV[1] 
unless filename and regexpArg 
     puts "Usage: #{$0} <filename> <regexp>" 
     exit(1) 
end 

dateStr='\d\d\/\d\d\/\d\d\d\d' 
timeStr='[0-9:.]+' 
whitespace='\s+' 
regexpStr = dateStr + whitespace + timeStr + whitespace + '>[0-9.]+' 
recordStart=Regexp.new(regexpStr) 
records=[] 
file=File.new(filename, "r") 
addingToRecord = false 
currentRecord = "" 
file.each_line { |line| 
     match = recordStart.match(line) 
     if addingToRecord 
       if match 
         records.push(currentRecord) 
         currentRecord = line 
       else 
         currentRecord += line 
       end 
     else 
       if match 
         addingToRecord = true 
         currentRecord = line 
       end 
     end 
} 
file.close 
regexp=Regexp.new(regexpArg) 
records.each { |r| 
     if regexp.match(r) 
       puts "----------------------------------------" 
       puts r 
       puts "----------------------------------------" 
     end 
} 
関連する問題