正则表达式从文本块中提取标记

时间:2016-08-01 07:46:50

标签: regex logstash-grok

我有从日志文件中检索的以下文本块

  

带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。

2 个答案:

答案 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%,而且我不太可能将这些东西混合到日志的其他部分,我在猜测。