我有一个代码,它使用给定的regex模式读取目录中多个日志文件的所有行:
代码如下:
src_dict = ("/nfs/home/dex/work/xxx/xxx/logs")
pattern = re.compile ('(.*)for exports(.*)')
for passed_files in os.listdir(src_dict):
files = os.path.join(src_dict, passed_files)
strng = open(files)
for lines in strng.readlines():
if re.search(pattern, lines):
print lines
上面的代码给出了日志文件中所有必需的行,每行末尾都有一个时间戳
./xx.xx.xx.v1.0_Final:2019-01-30 08:34:46.463 -0800 INFO [626] - Program Ended: xx::xx::xxx::xx for exports [... stuff ...] after 00:26:15
……等等
现在我想获取包含时间戳的所有最后一行,即00:26:15
(它可能总是不同的)
并计算从这些日志文件收集的所有时间戳的总时间和平均时间
只需添加时间戳1-就可以使用正则表达式了。
为此,请使用"capture groups"
要获得格式为
HH:MM:SS
的数字,您有两个数字,一个冒号,两个数字,另一个冒号和另外两个数字。量化它就是hard,所以你可能会这样写:(\d\d):(\d\d):(\d\d)
(如果你想的话,你可以{2}
那些\d
,但对我来说似乎更复杂)请注意数字匹配器周围的括号:它们告诉
re
分别捕获内容,并将其作为match.group(number)
提供,从1开始,match.groups()
,一个元组。为了确保匹配行的结束(不在中间),您添加了$
(严格地说,这应该不是必需的,因为.*
id“greedy”,但更清楚)如果你把它添加到你的正则表达式中,(如果你不需要的话,删除你已经有的组;否则,你会得到:
pattern = re.compile(r'.* for exports .* (\d\d):(\d\d):(\d\d)$')
现在,您可以匹配它并获得每次跑步的时间,如下所示:
match = pattern.match(logline); seconds = (int(match.group(1))*60 + int(match.group(2))) * 60 + int(match.group(3)
我说过上面的量化很难,但它可以做到,我知道有两个步骤: 首先获取所有时间戳,然后分别处理。在这种情况下,增加的复杂性太多了,但是,如果您有不同的情况,最好记住:
.*((?:\d{2}:)+\d\d)$
捕获由冒号分隔的任意长度的两个数字,然后可以对其进行简化.split(':')
并执行计算它通常指的是specific point in time,而不是持续时间。为了不把你弄糊涂,我在回答中用了“时间戳”。日志输出中的实际时间戳是
2019-01-30 08:34:46.463
,而不是00:26:15
相关问题 更多 >
编程相关推荐