1

我有一个日志文件,其中包含如下所示的文本。

Jul  1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7) 

文件中有两种时间格式。我需要根据 [] 中包含的日期时间格式对这个日志文件进行排序。

这是我正在尝试使用的正则表达式。但它不返回任何东西。

t_pat = re.compile(r".*\[\d+/\D+/.*\]")

我想遍历文件中的每一行,能够应用此模式并根据日期和时间对行进行排序。

有人可以帮我吗?谢谢!

4

3 回答 3

2

你有一个空间需要添加到正则表达式中

text = "Jul  1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7)"
matches = re.findall(r"\[\s*(\d+/\D+/.*?)\]", text)
print matches
['1/Jul/2013 03:27:12.818']

接下来使用以下函数解析时间

http://docs.python.org/2/library/time.html#time.strptime

最后将其用作字典的键,将行用作值,并根据键对这些条目进行排序。

于 2013-07-05T15:44:27.827 回答
1

您与初始空间不匹配;您还希望将日期分组以便于提取,并将\D.*模式限制为非贪婪:

t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")

演示:

>>> re.compile(r".*\[\s?(\d+/\D+?/.*?)\]").search(line).group(1)
'1/Jul/2013 03:27:12.818'

您可以进一步缩小模式范围;您只需要匹配该月份的 3 个字母,例如:

t_pat = re.compile(r".*\[\s?(\d{1,2}/[A-Z][a-z]{2}/\d{4} \d{2}:\d{2}:[\d.]{2,})\]")
于 2013-07-05T15:44:41.363 回答
1

读取文件的所有行并使用该sort函数并传入一个解析日期并将其用作排序键的函数:

import re
import datetime

def parse_date_from_log_line(line):
    t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")
    date_string = t_pat.search(line).group(1)
    format = '%d/%b/%Y %H:%M:%S.%f'
    return datetime.datetime.strptime(date_string, format)

log_path = 'mylog.txt'
with open(log_path) as log_file:
    lines = log_file.readlines()
    lines.sort(key=parse_date_from_log_line)
于 2013-07-05T16:20:29.590 回答