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

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);

【讨论】:

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

正则表达式从bash脚本中的字符串中提取第一个浮点数

Java使用正则表达式提取字段分隔的子字符串

如何使用正则表达式从某些文本中提取脚本标签?

Python 正则表达式从系统日志服务器中提取 FQDN

使用正则表达式从 HTML 中提取所有值

使用正则表达式在 IRC 日志中提取用户名?