2013-07-05 54 views
1

我有一个日志文件,其文本看起来像这样。python:使用正则表达式从日志文件中读取日期时间

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+/.*\]") 

我想去过每一行的文件,能够应用这种模式,并根据日期&时间线排序。

有人可以帮助我吗?谢谢!

+0

会不会反而easer在行首使用日期和时间? – Ronnie

+0

'['和'1'之间是否有空格? –

+0

[]内的时间以秒为单位更精确。我确实在一秒钟内获得了很多日志,需要进行排序。 –

回答

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,})\]") 
+0

我也认为你需要使最后一个量词lazy:\ [\ s?\ d +/\ D + /。*?\] – Ronnie

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

最后用这个作为重点成字典和行作为值,并根据密钥对这些条目进行排序。

+0

回答需要更多详细信息 –

+1

添加更多详细信息。 :) – beiller

1

Read all the lines of the file和使用sort功能和函数传递parses out the date,并将其用作the key for sorting

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) 
+0

我得到以下错误:date_string = t_pat.search(line).group(1 ) AttributeError:'NoneType'对象没有属性'group' –

+0

@SupriyaK这是假设行不是无,在代码中没有错误检查,如果有它将不得不处理None情况并且如果没有日期时间需要决定是否跳过它。 –

相关问题