2015-03-03 4 views
0

Допустим, у меня есть длинный журнал с чем-то вроде этого:несколько матчей с регулярным выражением

-----------1------------ 
path/to/file1 
real   0.21 
user   0.01 
sys   0.02 
    11378688 maximum resident set size 
-----------2------------ 
path/to/file2 
real   0.21 
user   0.01 
sys   0.02 
    11378688 maximum resident set size 
-----------3------------ 
path/to/file3 
real   0.21 
user   0.01 
sys   0.02 
    11378688 maximum resident set size 
-----------4------------ 
path/to/file4 
ERROR: Lorem ipsum error 
ERROR2: Lorem ipsum error 2 
real   0.59 
user   0.01 
sys   0.02 
    11378688 maximum resident set size 

Я хочу, чтобы извлечь путь к файлу, ошибки, если таковые имеются, время после того, как используется «реального» и память. Затем преобразовать их в формат, как это: «время памяти путь»

Я сделал это регулярное выражение:

-*(?:[0-9]*)-*\n(.*)\n((?:.*\n)*)?real\s*(.*)\n.*\n.*\n\s*(.*)\s\s.*\n 

Но он разбирает только тогда, когда есть одна запись журнала (также разбирает ошибки, если таковые имеются) , т.е. только:

-----------1------------ 
path/to/file1 
real   0.21 
user   0.01 
sys   0.02 
    11378688 maximum resident set size 

И ничего после этого.

Может ли кто-нибудь показать мне направление? Я пытаюсь его http://www.regex101.com

Языки: C/C++, баш, Java, Python, перейдите

+0

Какой язык вы используете? – Barmar

+0

Если вы используете PHP 'preg_match_all', вы получите 2-мерный массив со всеми совпадениями. – Barmar

+0

@Barmar О, не думал, что вы придете с веб-технологиями :) Я бы предпочел что-то, что я мог бы быстро скомпилировать без большого количества дополнительных инструментов :) – user3840048

ответ

1

способ сделать с PERL однострочника:

perl -0777 -ne '@l = /-+\d+-+\n([\s\S]*?)\nreal.*?([\d.]+)\n[\s\S]+?(\d+)\s+maximum.*(\n)/g;print "@l";' in1.txt 

Выход:

path/to/file1 0.21 11378688 
path/to/file2 0.21 11378688 
path/to/file3 0.21 11378688 
path/to/file4 
ERROR: Lorem ipsum error 
ERROR2: Lorem ipsum error 2 0.59 11378688 
0

Вы можете использовать это:

-+(?:[0-9]*)-+\n(.*)\n((?:ERROR.*\n)*)real\s*(.*)\n.*\n.*\n\s*(.*)\s\s.*\n? 

Я заменяет * с + в начале, потому что вы уверены, что будут повторения. Позже мы можем явно проверить, есть ли какие-либо ошибки и уловить их.

Latly Я сделал последний \n опциональный так, что сломал последнюю группу (потому что нет новой строки в конце файла)

Вот ссылка для вас, чтобы увидеть, если он работает для вас: https://regex101.com/r/jI5yV8/1

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