我有从日志文件中检索的以下文本块
带ID的SELECT语句:AE12400 SELECT / * + ALL_ROWS * /
T1.CONFLICT_ID,T1.LAST_UPD,T1.CREATED,
T1.LAST_UPD_BY,T1.CREATED_BY,T1.MODIFICATION_NUM,
T1.ROW_ID,T1.DFLT_LIC_FLG,T1.NAME,T1.VAL,
:1来自SIEBEL.S_LST_OF_VAL T1 WHERE
(T1.ACTIVE_FLG =:2或T1.ACTIVE_FLG为空)和(T1.TYPE =:3 AND T1.BU_ID IS NULL)ORDER BY T1.TYPE,T1.ORDER_BY,T1.VAL 绑定变量1:,,, SADMIN,00000002579c129c:0 ,, List of Values (内部),绑定变量2:Y绑定变量3:ZERO_DTIME_MODE
***** SQL语句执行时间:0.028秒*****由ID检索的3行:AE0EF18
我需要从这个块中获取跟踪标记
Statement Id : AE12400
SQL_Query: SELECT /*+ ALL_ROWS */
T1.CONFLICT_ID, T1.LAST_UPD, T1.CREATED,
T1.LAST_UPD_BY, T1.CREATED_BY, T1.MODIFICATION_NUM,
T1.ROW_ID, T1.DFLT_LIC_FLG, T1.NAME, T1.VAL,
:1 FROM SIEBEL.S_LST_OF_VAL T1 WHERE
(T1.ACTIVE_FLG = :2 OR T1.ACTIVE_FLG IS NULL) AND (T1.TYPE = :3 AND T1.BU_ID IS NULL) ORDER BY T1.TYPE, T1.ORDER_BY, T1.VAL
Bind Variable : [",,,SADMIN,00000002579c129c:0,,List Of Values (Internal)","Y","ZERO_DTIME_MODE"]
SQL Time: 0.028
SQL Rows: 3
到目前为止,我已经提出了常规表现,以提取声明,时间和范围。行
SQL Rows : \s\d{1,4}\s
SQL Time: \d{1,3}\.\d{1,4}
Statement Id: (ID:)(\s\w+)
但我不确定如何从文本中提取SQL和Bind Variables。
答案 0 :(得分:1)
您当前的模式不精确,因为它们可能匹配另一个非预期的子字符串。因此,我将提供所有需要的表达式:
SQL行:
\d{1,4}(?=\s*row)
查询运行时间:
(\d+(?:\.\d+)?)(?=\s*second)
声明ID:
ID:\s*(\w+)
SQL语句(m
:dot匹配换行符):
(?m)ID:\s\w+\s(.*?)(?=Bind variable)
绑定变量:
(?m)Bind variable\s*\d+:\s*(.*?)(?=Bind variable|$)
对于绑定变量,您应该使用编程语言中的matchAll()
或findAll()
类似方法。 [Live demo,请查看匹配组块]
答案 1 :(得分:0)
这些可以清理;他们并不是很有效率。但这应该引导你朝着正确的方向前进。
SQL_Query:SELECT(?! statement with ID)[\W\w]*?(?=Bind variable \d)
如果您使用多个文本块重新编写整个日志,则必须首先获取所有绑定变量,然后从中获取每个绑定变量。否则,您可以跳过该步骤。
查找绑定变量:Bind variable \d+:[\W\w]*?(?=\s+\*\*\*\*\*)
提取变种:Bind variable \d+:\s*([\W\w]*?)(?=Bind variable)
例如,如果有文本" Bind变量"也可能会出现问题。在你的SQL查询中...但是很难获得100%,而且我不太可能将这些东西混合到日志的其他部分,我在猜测。