Използване на pcregrep при търсене на многоредови съобщения в логовете

Grep е доста полезен инструмент когато е нужно да се прегледа голямо количество логове за специфични думи. Но някои приложения не се придържат стриктно към максимата едно съобщение на един ред. Така понякога се получават съобщения с дължина от един ред до десетки редове. Тук вече grep не е толкова гъвкав. Естествено може да се зададат да се показват по няколко реда преди и след всеки намерен, но тъй като при всяко съобщение този брой е различен, се получават или частични съобщения или такива, които не отговарят на търсенето.


Pcregrep - многоредов grep инструмент


В такива случаи програмата pcregrep е доста полезна. Това е вариант на grep с поддръжка на PCRE (Perl регулярни изрази). Една особено полезна функция е възможността да се търси зададения израз в няколко реда. Нека разгледаме следния фрагмент от файла testdata.txt:

[2011-06-01 10:10:10] Application startup
[2011-06-01 11:11:11] Got request, params are:
remote_ip: 1.2.3.4
user: foo
[2011-06-01 12:12:12] Some error message
[2011-06-01 13:13:13] Got request, params are:
remote_ip: 1.2.3.6
user: bar
request_id: 10
[2011-06-01 10:10:10] Application shutdown


Искаме от него да извадим съобщенията с данните за всички заявки. Построяваме реулярен израз, който да се удовлетворява от всички, съдържащо низа 'Got request' и заключено между индикатор за време ([.*]):

\[[^\[]*\].*Got request[^\[]*

Използваме pcregrep с опцията за многоредово търсене -M и търсим за израза:

$ pcregrep  -M '\[[^\[]*\].*Got request[^\[]*' testdata.txt

[2011-06-01 11:11:11] Got request, params are:
remote_ip: 1.2.3.4
user: foo
[2011-06-01 12:12:12] Some error message
[2011-06-01 13:13:13] Got request, params are:
remote_ip: 1.2.3.6
user: bar
request_id: 10
[2011-06-01 10:10:10] Application shutdown


Дотук добре, но все па имаме по един допълнителен ред след края. Добавяме опцията за извеждане само на мачнатия текст -o:

$ pcregrep -o -M '\[[^\[]*\].*Got request[^\[]*' testdata.txt

[2011-06-01 11:11:11] Got request, params are:
remote_ip: 1.2.3.4
user: foo

[2011-06-01 13:13:13] Got request, params are:
remote_ip: 1.2.3.6
user: bar
request_id: 10


За да махнем и празните редове, просто комбинираме с нормален grep:

$ pcregrep -o -M '\[[^\[]*\].*Got request[^\[]*' testdata.txt | grep -v "^$"

[2011-06-01 11:11:11] Got request, params are:
remote_ip: 1.2.3.4
user: foo
[2011-06-01 13:13:13] Got request, params are:
remote_ip: 1.2.3.6
user: bar
request_id: 10

Така вече имаме желания резултат.
 

Няма коментари

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-04-19 07:03:07