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+(.*)$/

但是,在日志中的一些地方有很多复杂的查询,由于某种原因,跨越了几行:

截屏

关于这些条目需要指出的两件事是它们似乎会导致日志文件中的某种损坏,因为它们以不可打印的字符结尾,然后突然下一个条目在同一行开始。

由于这显然排除了逐行捕获数据,我认为下一个最佳选择是匹配单词“TIME:”与“TIME:”的下一个实例或文件末尾之间的所有内容。我不确定如何使用正则表达式来表达这一点。

有没有更有效的方法?我需要解析的日志文件将超过 1.5GB。我的意图是规范化这些行,并删除不必要的行,最终将它们作为行插入数据库中以进行查询。

谢谢!

4

2 回答 2

2

匹配“TIME:”和“TIME:”字符串之间或文件末尾之间的潜在多行数据的正则表达式是:

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

另一方面,正如 James 所提到的,对“TIME:”子字符串进行标记,或查找“\r\nTIME:”的子字符串位置(在第一个“TIME:”条目之后,取决于换行符格式)可能会更好方法。

于 2010-08-27T18:40:21.300 回答
1

做这个老派可能会更好,即一次读取一行文件......从第一个'TIME'开始,然后连接你的行直到你点击下一个'TIME'......你可以使用正则表达式过滤掉你不想要的任何行。

我不能和 Ruby 说话。在 C# 中,它当然是一个StreamReader,它可以帮助您处理文件大小。

于 2010-08-27T17:00:55.147 回答