与正则表达式的多个匹配
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
假设我的日志很长,内容如下:
-----------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