[英]python to search files and parse using regular expression
我是python的新手。 我試圖編寫一個快速和臟的python腳本來查找某些字符串日志文件並從該行提取某些信息。 日志文件中的行如下所示
2012-08-01 13:36:40,449 [PDispatcher: ] ERROR Fatal error DEF_CON encountered. Shutting down
2012-08-01 14:17:10,749 [PDispatcher: ] INFO Package 1900034442 Queued for clearance.
2012-08-01 14:23:06,998 [PDispatcher: ] ERROR Exception occurred attempting to lookup prod id 90000142
我有一個函數,其中輸入參數將是文件名和要查找的模式數組。 目前我可以找到文件中包含一個或多個指定模式的所有行(雖然不確定它是否是最有效的方式)並且我能夠提取行號和行。
def searchLogs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
if sPattern in line:
fountItem = [fn, pattern, lineNo, line]
res.append(fountItem)
return res
searchLogs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)
我想做的還是在搜索時提取日期和時間。 因此,我考慮將搜索模式修改為正則表達式字符串,並使用分組來搜索和提取日期。 只有一個問題,我不知道如何在python中這樣做...任何幫助將不勝感激。
編輯(解決方案) :在塞巴斯蒂安和Joel提供的鏈接的幫助下,我想出了這個解決方案:
def search_logs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
#crude reg ex to match pattern and if matched, 'group' timestamp
rex = r'^(.+) \[.*' + pattern
ms = re.match(rex, line)
if ms:
time = ms.group(1)
item = Structs.MatchedItem(fn, pattern, lineNo, line, time)
res.append(item)
return res
search_logs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)
有兩個部分:
對於后者,您可以使用datetime.strptime()
函數 :
try:
dt = datetime.strptime(line.split(" [", 1)[0], "%Y-%m-%d %H:%M:%S,%f")
except ValueError:
dt = None
前者取決於您的日志文件的規則程度以及您希望解決方案的速度和穩健性,例如, line.split(" [", 1)[0]
速度快但很脆弱。 更強大的解決方案是:
' '.join(line.split(None, 2)[:2])
但它可能會慢一點。
這是你的正則表達式。 我測試了正則表達式,但沒有測試完整代碼
def searchLogs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
if sPattern in line:
date = re.search(r'(19|20)\d{2}-(0[1-9]|[12])-(0[1-9]|[12][0-9]|3[01])',line).group()
time = re.search(r'\b([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]),[0-9][0-9][0-9]',line).group()
fountItem = (fn, pattern, lineNo, date, time, line) # prefer a tuple over list
res.append(fountItem)
return res
PS :RE總是在錯誤的地方痛苦。 如果您需要解釋,請告訴我。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.