从日志文件中获取时间戳记

时间:2019-02-05 14:45:04

标签: python regex regex-group

我有一个代码,可以使用给定的正则表达式模式从目录内的多个日志文件读取所有行:

以下是代码:

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 个答案:

答案 0 :(得分:0)

只需将时间戳记 1 添加到您正在使用的正则表达式中即可。

为此,请使用"capture groups"

要获取格式为HH:MM:SS的数字,您必须有两个数字,一个冒号,两个数字,另一个冒号和另外两个数字。量化为hard,所以您可能会像这样写:

(\d\d):(\d\d):(\d\d)(如果需要,您可以{2} \d,但是在我看来,这似乎更复杂)。

请注意数字匹配器周围的括号:它们告诉re分别为您捕获内容并将其作为match.group(number)可用,从1和match.groups()(一个元组开始)开始。要确保与该行的 end 相匹配(不在中间),请添加$(严格来说,这不是必须的,因为.* 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)


我说上述量化很困难,但是可以做到,我知道可以采用两步法: 您首先要获得 all 时间戳,然后分别进行处理。在这种情况下,增加的复杂性太多了,但是,如果您有其他不同之处,请紧记:

.*((?:\d{2}:)+\d\d)$捕获您用冒号分隔的任意两位数字,然后可以简单地.split(':')进行计算。


1 通常指的是specific point in time,而不是持续时间。为了不让您感到困惑,我在答案中使用了“时间戳”。日志输出中的实际时间戳为2019-01-30 08:34:46.463,而不是00:26:15