与正则表达式的多个匹配

时间:2015-03-03 11:13:02

标签: regex parsing logging

假设我有一个类似这样的长日志:

-----------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

我想提取文件路径,错误(如果有),“真实”和使用内存之后的时间。然后将它们转换为如下格式:“path time memory”

我做了这个正则表达式:

-*(?:[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 ++,bash,java,python,go

2 个答案:

答案 0 :(得分:1)

使用perl one-liner的一种方法:

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 

答案 1 :(得分:0)

您可以使用:

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

我在开头用*取代+,因为您确定会有重复。 稍后我们可以明确检查是否有任何错误并捕获它们。

Latly我做了最后一个\n可选,因为它打破了最后一个组(因为文件末尾没有换行符)

以下链接供您查看是否适合您:https://regex101.com/r/jI5yV8/1