2010-08-27 30 views
2

我正在嘗試使用正則表達式解析Oracle跟蹤文件。我選擇的語言是C#,但我選擇使用Ruby進行此練習以熟悉它。使用正則表達式匹配兩個特定單詞之間的所有內容

日誌文件有點可預測。大部分線路(99.8%,是特定的)以下模式匹配:

# [Timestamp]     [Thread] [Event] [Message] 
# TIME:2010/08/25-12:00:01:945 TID: a2c (VERSION) Managed Assembly version: 2.102.2.20 
# TIME:2010/08/25-14:00:02:398 TID:1a60 OpsSqlPrepare2(): SELECT * FROM MyTable 
line_regex = /^TIME:(\S+)\s+TID:\s*(\S+)\s+(\S+)\s+(.*)$/ 

然而,在日誌中有很多在一些地方很複雜查詢的是,由於某種原因,跨越幾行:

Screenshot

要指出這些條目有兩點需要注意,它們似乎會在日誌文件中導致某種損壞,因爲它們以不可打印的字符結尾,然後突然下一個條目開始在同一行上。

由於這顯然排除了每行捕獲數據,我認爲下一個最佳選擇是匹配單詞「TIME:」和「TIME:」的下一個實例之間的所有內容或者文件。我不知道如何使用正則表達式來表達這一點。

有沒有更高效的方法?我需要解析的日誌文件將超過1.5GB。我的目的是對行進行標準化,並刪除不必要的行,最終將它們作爲行插入到數據庫中進行查詢。

謝謝!

回答

1

做這個老派可能會更好,即一次只讀一行文件...在第一個'TIME'開始,並且連接你的行,直到你點擊下一個'TIME'。 。你可以使用正則表達式來過濾掉你不想要的任何行。

我不能跟Ruby說話;在C#中它將是一個StreamReader,當然,它可以幫助您處理文件大小。

2

正則表達式匹配之間潛在的多行數據「TIME:」和「TIME:」字符串或文件的末尾是:

/^TIME:(.+?)(?=TIME:|\z)/im 

在另一方面詹姆斯提到,標記化爲「 TIME:「子字符串或查找」\ r \ nTIME:「的子字符串位置(在第一個」TIME:「條目之後,取決於換行符格式)可能證明是更好的方法。

相關問題