正则表达式中的匹配项
您可以使用 fregexparser 将正则表达式的匹配结果加载到 Flex 表或列式表中。本节将介绍 Flex 解析器支持选项的一些使用示例。
示例正则表达式
这些示例将使用以下正则表达式,它们会搜索包括 timestamp、date、thread_name 和 thread_id 字符串在内的信息。
当心
出于显示目的,此示例正则表达式添加了换行符以拆分长文本行。要在查询中使用此表达式,请先复制并编辑示例,以移除任何换行符。此示例表达式会加载任何 thread_id 十六进制值,而无论这些值是否具有 0x 前缀 (<thread_id>(?:0x)?[0-9a-f]+).
'^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+)
(?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+)
-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )
?(?<text>.*)'
将正则表达式匹配项用于 Flex 表
您可以使用 fregexparser 将正则表达式结果加载到 Flex 表中。。有关执行此操作的完整示例,请参阅 FREGEXPARSER。
针对列式表使用 fregexparser
此部分说明了如何加载针对 Vertica 数据库示例日志文件使用的正则表达式的结果。通过使用外部表定义,介绍了使用 fregexparser 将数据加载到列式表中的示例。将 Flex 表解析器用于列式表使您能够在一个表中混合数据加载。例如,您可以在一个会话中加载正则表达式的结果,在另一个会话中加载 JSON 数据。
以下基本示例说明了这种用法。
-
创建一个列式表
vlog,带有以下列:=> CREATE TABLE vlog ( "text" varchar(2322), thread_id varchar(28), thread_name varchar(44), "time" varchar(46), component varchar(30), level varchar(20), transaction_id varchar(32), elevel varchar(20), enode varchar(34) ); -
借助
fregexparser使用 COPY 加载采用上述示例正则表达式的日志文件的多个部分:在您自己尝试之前,请务必从该表达式示例中移除任何行字符:=> COPY v_log FROM '/home/dbadmin/data/flex/vertica.log' PARSER FRegexParser(pattern='^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+) (?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+) -?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)] \<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: ) ?(?<text>.*)'
) rejected data as table fregex_reject; -
查询
time列:=> SELECT time FROM flogs limit 10; time ------------------------- 2014-04-02 04:02:02.613 2014-04-02 04:02:02.613 2014-04-02 04:02:02.614 2014-04-02 04:02:51.008 2014-04-02 04:02:51.010 2014-04-02 04:02:51.012 2014-04-02 04:02:51.012 2014-04-02 04:02:51.013 2014-04-02 04:02:51.014 2014-04-02 04:02:51.017 (10 rows)
借助 fregexparser 使用外部表
通过为 Vertica 日志文件创建外部列式表,查询该表将返回更新后的日志信息。以下基本示例说明了这种用法。
-
创建列式表
vertica_log,使用AS COPY子句和fregexparser加载正则表达式的匹配结果。为了便于说明,此正则表达式具有用于拆分长文本行的换行符。在使用此表达式进行测试之前,请移除所有换行符:=> CREATE EXTERNAL TABLE public.vertica_log ( "text" varchar(2322), thread_id varchar(28), thread_name varchar(44), "time" varchar(46), component varchar(30), level varchar(20), transaction_id varchar(32), elevel varchar(20), enode varchar(34) ) AS COPY FROM '/home/dbadmin/data/vertica.log' PARSER FRegexParser(pattern='^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+) (?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+) -?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)] \<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: ) ?(?<text>.*)'
); -
从外部表查询以获取更新后的结果:
=> SELECT component, thread_id, time FROM vertica_log limit 10; component | thread_id | time -----------+------------+------------------------- Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 | 0x16321430 | 2014-04-02 04:02:02.614 | 0x16321430 | 2014-04-02 04:02:02.614 | 0x16321430 | 2014-04-02 04:02:02.614 (10 rows)