LINUX.ORG.RU

Парсер логов


0

1

Добрый день!
Лог представляет собой набор sql запросов, а так же много другой инфы (дата-время, информационные сообщения и т.д.).
Стоит задача найти sql запросы, в которых заданное поле принадлежит определенному оператору. (значения поля и оператора задаются в отдельном конфиге)
Например:
Есть запрос вида:
create table t1 as select t0.dwh_id
from t2
where t2.status = 'active';
в конфиге задаются значения поле = status, оператор = where. В результате нужно получить весь этот запрос.
Задача усложняется тем, что лог не структурирован - запросы могут быть записаны в одну строку, например. Так же значение поля status может появляться в логе не только в sql запросах и такие случаи нужно отсекать.

Нужно воплотить это все на bash.

Читала про sed, awk, не могу придумать, как их тут можно применить. В регулярных выражениях не сильна, но буду благодарна, если скажите в какую сторону копать.

Нужно воплотить это все на bash.

Будто perl-а у вас не установлено (и питона, да).

anonymous
()
Ответ на: комментарий от mmm-crash

Значит, можно собрать дома и упаковать при помощи PAR::Packer в один исполняемый файл.

В любом случае, покажите примеры «другой инфы». Может быть, достаточно читать файл построчно (while read var; do ...; done), находить начало запроса простенькой регуляркой вроде ^[a-z] (начинается с буквы) и конец - ;$ (оканчивается ";") и печатать все строки между ними.

AITap ★★★★★
()

Если все не сильно запущено, то sed справится.

Сначала надо отделить SQL от всего остального (в логе же есть хоть что-нибудь за что можно зацепиться)

Затем все запросы превратить в однострочники (тупо объединить все, что между ";")

Затем хитрой регуляркой отбирать нужное.

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

Без примера лога что-то разумное посоветовать сложно. Job вам в помощь.

Belkrr
()
Ответ на: комментарий от AITap

Вот пример:

Time taken executing query : 20.574 seconds
2012-08-29 00:35:56,040 INFO [96e741157:-5655] - TID[215]
----- Execute Sql in MAIQService.execute() -----

options Locale=ru_RU;
LIBNAME cmdm ORACLE INSERTBUFF=250 READBUFF=32000 DBMAX_TEXT=32767
SQL_FUNCTIONS=ALL

LIBNAME MATables BASE «/home/»;

PROC SQL;
CREATE TABLE 123 AS SELECT DISTINCT
table0.DWH_ID
FROM
table0
WHERE
table0.STATUS = 'active'
quit;


-----------------------------------------------------
System 00:35 Wednesday, August 29, 2012

NOTE: Copyright (c) 2002-2008

Но select может и не быть так структурирован, например, может начинаться так:
2012-08-29 00:35:56,040 SELECT DISTINCT........

mmm-crash
() автор топика
Ответ на: комментарий от mmm-crash

разобралась, что все запросы, которые меня интересуют начинаются с PROC SQL; и заканчиваются quit;
А можно ли как-то вывести все, что между этими строками?

mmm-crash
() автор топика
Ответ на: комментарий от Belkrr

Спасибо! так получилось, теперь дальше буду думать

mmm-crash
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.