与正则表达式的多个匹配

Multiple matches with regex

假设我的日志很长,内容如下:

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

我想提取文件的路径、错误(如果有)、"real" 之后的时间和使用的内存。然后将它们转换成这样的格式:"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

你可以使用这个:

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

我把开头的*换成+因为你确定会有重复。 稍后我们可以显式检查是否有任何错误并捕获它们。

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

这里有一个 link 供您查看是否适合您:https://regex101.com/r/jI5yV8/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