假设我有一个类似这样的长日志:
-----------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
答案 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