2015-12-22 5 views
0

Я хочу найти строку в журналах событий приложений Windows с помощью Grep. Ниже бревенчатые выдержки:Как вести журнал событий приложений, используя grep?

I 05-Nov-14 10:08:04 51033 AP_AN   <I>1 images out of 1 are  transferred to ABS_Dynamics for the job(297.0.0) at the rate of 0.09 images/sec. </I> 
                    Time: 5.11.2014, 10:08:04, Line: 1068, File: \EdCom\src\ArcNet\ArcNet_server\src\ANBeServer/ANBeNetworkNodeJob_haz.cpp, Process: CGenericMain (7804) 
W 05-Nov-14 10:08:53 14 AXY_ISC   State Manager has detected a hung process.  
                    Time: 5.11.2014, 10:08:53, Process: C:\AIOM\Service\bin\Rep.exe_1976, 
                    Text: (05.11.2014 10:08:53) IV SET: CProcess::DeclareHung(AppUI_A,6228) Process appears to be hung. (null 
W 05-Nov-14 10:08:53 17 AXY_ISC   An error was detected in a process that is monitored by State Manager.  
                    Time: 5.11.2014, 10:08:53, Process: C:\AIOM\Service\bin\Rep.exe_1976, 
                    Text: (05.11.2014 10:08:53) IVS SET: CMonitorThread::ProcessFailing(PID:6228 TID:4264) Process AppUI_A is 

Я хочу, чтобы искать строку сказать «CProcess :: DeclareHung» в журнале событий и выход поиска должен быть следующим:

W 05-Nov-14 10:08:53 14 AXY_ISC   State Manager has detected a hung process.  
                    Time: 5.11.2014, 10:08:53, Process: C:\AIOM\Service\bin\Rep.exe_1976, 
                    Text: (05.11.2014 10:08:53) IV SET: CProcess::DeclareHung(AppUI_A,6228) Process appears to be hung. (null 

т.е.. журналы и сводные строки, включая строку поиска.

Каждая строка разделяется символом новой строки, и этот файл журнала является TXT-файлом. Я знаю, что grep - это поисковое приложение на основе строки, но я прочитал, что, используя регулярное выражение жемчуга, мы можем заставить grep искать несколько строк. Я новичок в регулярном выражении жемчуга и не имею ни малейшего представления о том, как это сделать.

Может ли кто-нибудь помочь мне найти это с помощью grep?

EDIT: Я попытался следующие, но безуспешно

grep -P "[W|E|I] \d\d-\w\w\w-\d\d.*[\s]*.*CProcess::DeclareHung.*[\s]*.*" XA2014_11_04_AppEventLog.txt 
+0

что определяет сводные строки? Всегда ли она содержит одну букву в самом начале? – fedorqui

+0

@ fedorqui: начало строки с W или I или E будет строкой журнала, за которой следуют 0 или более суммарных строк. Все строки журнала и итоговые строки разделяются символом новой строки. Строки журнала всегда содержат одну букву в начале. – Smij01

ответ

0

предположив, что вы хотите, чтобы проверить, что не в заголовке, но в сообщении об ошибке, вы можете сказать:

awk -v RS="\n(E|I|W)" '/CProcess/' file 

Жаль, что вы потеряли E/I/W. Если вы этого хотите, скажите awk -v RS="\n(E|I|W)" '/CProcess/ {print RT, $0}' file.

Более рудиментарный подход сохранить буфер блока и распечатать его всякий раз, когда мы находим матч:

awk '$1~/^(E|I|W)$/ {line=$0;next} {line=line ORS $0} /pattern/ {print line}' file 

То есть:

awk '$1~/^(E|I|W)$/ {line=$0;next} # if 1st file starts with E,I,W, initialize the 
           # variable line with the content of this line 
           # then, jump to the next line 

    {line=line ORS $0}   # on the rest of cases, keep adding the following 
           # lines in the variable line 
           # ORS stands for new line normally 

    /pattern/ {print line}'  # if the current line matches the given pattern 
           # print the stored variable `line` 
    file 

Подобная логика не для печати матча независимо от того, где он находится в тексте:

awk '{if ($1~/^(E|I|W)$/) 
     { 
     if (print_match) { 
      print line 
      print_match=0 
     } 
     line=$0 
     } else 
     line=line ORS $0 
    } 
    /An error/ {print_match=1} 
    END {if (print_match) print line}' file 

Обратите внимание на использование флага print_match, чтобы узнать, нужно ли печатать строку с буферизацией или нет. Также использование END для печати, если оно было последним блоком файла.


Тест с "CProcess" для Вашего данного образца:

awk -v RS="\n(E|I|W)" '/CProcess/' file 
    05-Nov-14 10:08:53 14 AXY_ISC   State Manager has detected a hung process.  
                    Time: 5.11.2014, 10:08:53, Process: C:\AIOM\Service\bin\Rep.exe_1976, 
                    Text: (05.11.2014 10:08:53) IV SET: CProcess::DeclareHung(AppUI_A,6228) Process appears to be hung. (null 

И

$ awk '$1~/^(E|I|W)$/ {line=$0;next} {line=line ORS $0} /CProcess/ {print line}' file 
W 05-Nov-14 10:08:53 14 AXY_ISC   State Manager has detected a hung process.  
                    Time: 5.11.2014, 10:08:53, Process: C:\AIOM\Service\bin\Rep.exe_1976, 
                    Text: (05.11.2014 10:08:53) IV SET: CProcess::DeclareHung(AppUI_A,6228) Process appears to be hung. (null 
+0

Это для разработки дополнительной функции для моего инструмента. И я использую grep для всех видов поиска журнала в моем инструменте. Разве нет способа использовать grep вместо awk для достижения результата? – Smij01

+0

Я думаю, что придерживаться одного инструмента не полезно, если другой обеспечивает лучшую производительность. Здесь 'grep' будет чрезмерно сложным (' grep -C2 "..." или похожим, а затем трубопроводом, чтобы получить желаемый результат). – fedorqui

+0

Не могли бы вы помочь в использовании Grep? – Smij01

Смежные вопросы