Настройка отображения содержимого файла на основе шаблона grep - PullRequest
2 голосов
/ 27 января 2011

Файл журнала содержит много данных и сортируется на основе данных и времени.Размер каждого журнала может различаться по размеру.

Я хочу найти конкретный шаблон в файле журнала, и, если шаблон соответствует, он должен отобразить этот конкретный журнал на экране.Команды будут заметны.

Пример файла журнала: -

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 -               

Здесь, если я ищу конкретный IP-адрес 192.189.52.200.Он должен отображать весь журнал событий, например,

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  -               

Ответы [ 3 ]

0 голосов
/ 27 января 2011

Это требует GNU AWK (gawk) из-за использования регулярного выражения для разделителя записей (RS).

#!/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 голосов
/ 18 февраля 2011

Если у вас есть 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
}
0 голосов
/ 27 января 2011

Вы можете использовать флаг -A[n] с grep, где n - количество строк после матча. * например 1004 *

grep -A6 '192.189.52.200' my.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...