Използване на 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
Така вече имаме желания резултат.
Няма коментари
Обратно към списъка със статиите
Тази страница последно е променяна на 2025-04-28 22:16:04