2015-07-30 3 views
0

Нужно написать регулярное выражение так, чтобы лог делился в группе до следующего INFO.Группа регулярных выражений для нескольких строк

Например:

INFO 2015-07-30 06:50:48,208 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15488'} 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0139939785004 
INFO 2015-07-30 06:50:48,571 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15232 195049139026\r\n'} 
Exception Raised: NOTFOUND 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0570251941681 

После регулярных выражений, группа будет:

INFO 2015-07-30 06:50:48,208 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15488'} 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0139939785004 

INFO 2015-07-30 06:50:48,571 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15232 195049139026\r\n'} 
Exception Raised: NOTFOUND 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0570251941681 
+0

Может вы просто не прочитать файл построчно и определить статус в начале строки ? – nhahtdh

+0

Мне нужно сделать это только через регулярное выражение. – Anurag

+1

Непонятно, какова ваша среда. Язык программирования? Инструмент? Текстовый редактор? – nhahtdh

ответ

2
/INFO(?:\n(?!INFO)|.)*/g 

должны это сделать: Demo.

регулярное выражение соответствует INFO, а затем с помощью этих Неуловленных групп ((?:…)): либо соответствует разрыву строки (\n), который не следует другому INFO ((?!INFO)), или (|) любой символ (.), любые количество раз (*).

Вы бы подумали, что это должно быть что-то вроде «INFO, за которым следует что-либо, повторяющееся», но, к сожалению, оно даст всю строку как один гигантский результат, поэтому должен был быть негативный прогноз: (?!INFO).

+0

его работы. Спасибо :-) Будет хорошо, если вы сможете это объяснить. – Anurag

+0

мой почти такой же, как вы, поэтому я не размещаю его отдельно. Немного отличается. '^ (INFO [^ I] +) (? = INFO | $)' – zolo

+1

@zolo Это не похоже на работу ... Я только что проверил это с RegEx101 ... – Xufox

2

grep команды, чтобы соответствовать эти блоки отдельно:

grep -zoP '(?s)INFO.+?\n(?=(INFO|$))' file 

-o    # capture the match 
-z    # to treat the input as a set of lines 
-P    # Use PCRE regex 
(?s)   # DOTALL to make dot match newlines as well 
INFO.+?\n  # match INFO and 1 or more any character (non-greedy) till a new line 
(?=\n(INFO|$)) # Lookahead to match until next set of character is INFO or end of file 

Выход:

INFO 2015-07-30 06:50:48,208 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15488'} 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0139939785004 

INFO 2015-07-30 06:50:48,571 Request: POST: /api/v1/jobs/ 
Request Data: {u'job_id': u'15232 195049139026\r\n'} 
Exception Raised: NOTFOUND 
Resp Status: 200 
Resp Data: {'detail': 'ok'} 
Resp Time: 0.0570251941681 

... 
+1

Только небольшое дополнение, \ z может быть заменено на $ и будет работать одинаково. – zolo

+0

Да, это правильно '$' должно работать (отредактировано) – anubhava

+1

Извините, не хотел его менять. \ z отлично работает. Кроме того, поскольку я никогда не использовал \ z еще и не знал -z для grep, я уже изучил несколько новых вещей. :) Так спасибо за них! – zolo

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