在猪脚本中使用正则表达式从日志中提取字符串

Posted

技术标签:

【中文标题】在猪脚本中使用正则表达式从日志中提取字符串【英文标题】:Extracting string from logs with regex in pig script 【发布时间】:2017-11-08 15:56:47 【问题描述】:

我有日志数据,我想将每个信息提取到一个变量中

以下是示例一行日志。 :id=>306, :name=>"bblite", :cpu=>:quota=>4, :allocated=>4, :actual=>0, :memory=>:quota=>8192, :allocated=>8192, :actual=>8578, :cluster_stats=>"wc1104"=>:cpu=>0, :mem=>8578

我需要一个具有所有 id 的变量、一个具有所有名称的变量、一个具有 CPU 的变量和一个具有所有集群统计信息的变量

以下是我的猪脚本的一部分。我可以存储 ID,但我不知道如何使用正则表达式提取其余 ID。

。 . .

matching_messages = FILTER raw_lines BY (LOWER(message) MATCHES '.*cc_altus-plaform.*');

ids = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'id=>\\d*',0);

names = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'name=>\\"\\",',0);

line_with_date = FOREACH matching_messages GENERATE
DateFormatter(timestamp) AS formatted_time: chararray, message;

DUMP names;

【问题讨论】:

【参考方案1】:

以下代码 sn-p 是我编写的有效的正则表达式:

id = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'(?<=id=>)\\d*',0);

name = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'name=>\\"[\\w]*\\"',0);

cpu = FOREACH matching_messages GENERATE REPLACE( REGEX_EXTRACT(message, 'cpu=>\\.*?\\',0), ',','');

memory = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'memory=>\\.*?\\',0);

cluster = FOREACH matching_messages GENERATE REGEX_EXTRACT(message,'cluster_stats=>\\.*?\\',0);

【讨论】:

以上是关于在猪脚本中使用正则表达式从日志中提取字符串的主要内容,如果未能解决你的问题,请参考以下文章