С питоном, как на счет:
#!/usr/bin/python
import re
text = open("logfile", "r").read()
regex = r'start (.+?)$.*?Final output is (.+?)(?:(?=\nDEBUG)|\Z)'
for m in re.finditer(regex, text, re.MULTILINE|re.DOTALL):
for i in m.groups():
print(i.replace('\n', ' '))
Входной лог-файл:
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output
output output
output"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID2>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output2
output+ output/
output2"
И вывод:
<ID>
"output output output output"
<ID2>
"output2 output+ output/ output2"
- 1-е число врегулярное выражение захватывает любые символы сразу после
start
и до новой строки и сохраняет строку в 1st group
. - 2-е число в регулярном выражении также захватывает любые символы сразу после
Final output is
и до DEBUG
иликонец строки и сохраняет строку в 2nd group
.Символы новой строки могут быть включены в строку благодаря опции re.DOTALL
. - 3-ий знак скобки нулевой длины и не входит в группу захвата.
РЕДАКТИРОВАТЬ
Обновленная версия ниже обрабатывает несколько «окончательных выходных данных» для одного идентификатора и отображает только последний вывод для каждого идентификатора:
#!/usr/bin/python
import re
text = open("logfile", "r").read()
regex = r'start (.+?)$(.+?)(?:(?=DEBUG[^\n]+?start)|\Z)+'
regex2 = r'Final output is (.+?)(?:(?=\nDEBUG)|\Z)'
for m in re.finditer(regex, text, re.MULTILINE|re.DOTALL):
print m.group(1)
m2 = re.finditer(regex2, m.group(2), re.MULTILINE|re.DOTALL)
print list(m2).pop().group(1).replace('\n', ' ')
входной файл журнала:
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID1>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output
output output
output"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "this
is the last output
for <ID1>"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID2>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output2
output+ output/
output2"
и вывод:
<ID1>
"this is the last output for <ID1>"
<ID2>
"output2 output+ output/ output2"
Я разделил извлечение подстрок в два этапа:
- для извлечения идентификатора и оставшегося текста (который может содержать дополнительные строки),Это обрабатывается с помощью
regex
. - для извлечения подстрок «окончательного вывода» из «оставшегося текста» выше.Это обрабатывается с помощью
regex2
.
Затем выберите последний «окончательный вывод» и отобразите.
РЕДАКТИРОВАТЬ
Версия нижеподавляет сообщение (я), которое содержит ключевое слово:
#!/usr/bin/python
import re
text = open("logfile", "r").read()
exclude = 'xyz' # keyword to suppress the output
regex = r'start (.+?)$(.+?)(?:(?=DEBUG[^\n]+?start)|\Z)+'
regex2 = r'Final output is (.+?)(?:(?=\nDEBUG)|\Z)'
#regex = r'start (.+?)$.*?Final output is (.+?)(?=\nDEBUG)'
#for m in re.finditer(regex, text, flags=(re.MULTILINE|re.DOTALL)):
for m in re.finditer(regex, text, re.MULTILINE|re.DOTALL):
print m.group(1)
m2 = re.finditer(regex2, m.group(2), re.MULTILINE|re.DOTALL)
message = list(m2).pop().group(1).replace('\n', ' ')
if message.count(exclude):
print 'error:' + exclude
else:
print message
Пример файла журнала:
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID1>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output
output output
output"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "this
is the last output
for ID1"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID2>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "output2
output+ output/
output2"
DEBUG: extra lines
DEBUG: Fri Dec 7 06:49:14 2018:16920 extra text
DEBUG: Fri Dec 7 06:49:14 2018:16920: start <ID3>
DEBUG: Fri Dec 7 06:49:14 2018:16920: Final output is "this message
contains the word xyz"
DEBUG: extra lines
Вывод:
<ID1>
"this is the last output for ID1"
<ID2>
"output2 output+ output/ output2"
<ID3>
error:xyz