2013-11-26 5 views
0

У нас есть приложение SAS, которое мне нужно для сбора данных регистрации. Я вижу грубую структуру, но имею некоторые проблемы, надежные данные.SAS Log File Parse с RegEx + NXLog

Вот пример вывода журнала:

NOTE: There were 5 observations read from the data set APP.NEW_FEATURE. 
     WHERE feature_status_id=0; 
NOTE: The data set WORK._NULL has 5 observations and 9 variables. 
NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 
TRACE : RM_FORECAST_JOB "Entering Macro" 
TRACE : RM_FORECAST_JOB "Entering Macro" 
NOTE: There were 1 observations read from the data set IN_XML.requestHeader. 
NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 

А вот RegEx, который должен работать, но я боюсь, может быть усложненной:

((^\S+\s*:\s*.+)\R(^\s+.+\R)*) 

Когда я проверяю в RegExr (ж/global + multiline options) - поля, которые мне нужны, выделены, но я не получаю никаких результатов, когда тестирую в NXLog.

Я подозреваю, что многословность выражения частично виновата, но я новичок в RegEx и изучаю, когда я иду.

EDIT: Я надеюсь создать регулярное выражение для каждого события, т. Е. Соответствие для каждого из следующих слов, используя сингулярное выражение.

NOTE: There were 5 observations read from the data set APP.NEW_FEATURE. 
     WHERE feature_status_id=0; 

И

NOTE: The data set WORK._NULL has 5 observations and 9 variables. 
+0

Какую часть журнала вы пытаетесь найти? – Jeff

+0

Я пытаюсь захватить все вышеперечисленное. Мне нужно сингулярное выражение, которое решает для обоих вариантов входа в журнал; сообщения, содержащие серьезность и сообщение, - и те, у которых _also_ есть данные с отступом под ними. –

ответ

0

С вашим новым выражением, я не получил никаких результатов ... пока я не изменил первый \r к \R (\r не означает, что ничего в Regex, но \R означает захват новых строк (LF или CRLF), это то, что вы хотели?).

Вот результаты: http://www.rexfiddle.net/tsVjnVe

Является ли это то, что вы были после? Было бы более полезно, если бы вы объяснили, что именно вы сделали или не хотели захватить своим выражением.

Edit: Настройка флаг Ignore Case захвачена больше: http://www.rexfiddle.net/8Sf8NLd


Edit 2: Попробуйте это выражение:

(.+?): (.+?)\r?\n((?:\s+.+(?:\r?\n|$))*) 

Вот пример того, что он делает:

http://www.rexfiddle.net/GyeJslR

Основное объяснение выражения: оно будет захватывать что-либо перед :, затем что-нибудь после : до конца строки, тогда оно будет искать последующие строки с отступом (с пробелами или вкладками) и захват каждый из них до тех пор, пока не найдет строку, которая больше не имеет отступов, или конец файла/строки.

Группа захвата 1 - это категория журнала (ПРИМЕЧАНИЕ, TRACE в вашем примере).
Группа захвата 2 - это сообщение журнала (все после ПРИМЕЧАНИЕ: например).
Группа захвата 3 - это отступы, находящиеся под основным сообщением журнала.

ПРИМЕЧАНИЕ: В зависимости от того, как interperets SAS и работает Regex, вы, возможно, придется изменить это выражение немного - разрывы строк обрабатываются немного по-разному в зависимости от того, что вкус Regex вы используете. Если это не сработает, попробуйте заменить оба значения \r?\n на \R или на фактическую строку (например, с SAS).

+0

Я думаю, что разница между \ r и \ R может зависеть от реализации/языка, где он используется. Я все равно попробовал - и не получил желаемых результатов. –

+0

@ weird.turned.pro Снова обновите свой вопрос, чтобы указать, что вы пытаетесь захватить или не захватить как часть своего выражения. Вы дали образцы данных и свое регулярное выражение, что хорошо, но мы не знаем, что вы хотите, чтобы результат был, поэтому мы не можем вам помочь. – qJake

+0

Добавил некоторые детали, которые, надеюсь, уточнят, к чему я стремлюсь. Каждое событие журнала начинается с конструкции '{СЕВЕРНОСТЬ}: {СООБЩЕНИЕ}', и информация с отступом может быть или не быть. –

0

Я предполагаю, что вы собираете из текстового файла. Модуль im_file обрабатывает каждую строку как отдельное событие по умолчанию (InputType LineBased). Таким образом, , пытающийся использовать многострочное regexp, не будет работать в этом случае, так как это только одна строка, с которой вы пытаетесь сопоставить.

Вы должны убедиться, что все событие (а не только одна его строка) доступно в контексте. См. Модуль xm_multiline и примеры. Ваше регулярное выражение должно работать оттуда.

+0

Я на самом деле использую xm_multiline расширение - для которого требуется определение HeaderLine - отсюда необходимость в шаблоне RegEx. Я также захватил многострочные сообщения непосредственно из im_file (без определения InputType). –