从日志文本文件中切片关键字



我有一个很大的日志文件,其中的行是

[2016-06-03T10:03:12] No data: TW.WA2

[2016-06-03T11:03:02] wrong overlaps: XW.W12.HHZ.2007.289

作为

[2016-06-03T14:05:26] failed to correct YP.CT02.HHZ.2012.334 because No matching response.

每一行都由一个时间戳、日志记录的原因和一个关键字组成,该关键字由一些由点连接的子字符串组成(上述示例中的TW.WA2XW.W12.HHZ.2007.289YP.CT02.HHZ.2012.334)。

特定类型的关键字的格式是固定的(子字符串由固定数量的点连接)。

子字符串由字母和数字组成(0-5个字符,但并非所有子字符串都可以为空,通常最多只有一个,例如XW.WTA12..2007.289)。

我想

  • 提取关键字

  • 保存不同类型的关键字uniqued到分离的文件

目前我尝试了grep,但只完成了分类。

  • grep "wrong overlaps" logfile > wrong_overlaps

  • grep "failed to correct" logfile > no_resp

  • grep "No data" logfile > no_data

no_data中,预期内容类似

AW.AA1
TW.WA2
TW.WA3
...

no_resp中,预期内容类似

XP..HHZ.2002.334
YP.CT01.HHZ.2012.330
YP.CT02.HHZ.2012.334
...

但是,上面简单的grep命令保存了整行。我想我需要正则表达式来提取关键字?

假设一个关键字是通过包含句点并用字母和数字包围来定义的,那么下面的正则表达式将匹配所有关键字:

% grep -oE 'w+(.w+)+' data
TW.WA2
XW.W12.HHZ.2007.289
YP.CT02.HHZ.2012.334

-o将只打印匹配项。-E启用扩展正则表达式

然而,这将使您无法将其拆分为多个文件,例如:创建一个包含wrong overlaps的所有行的文件wrong_overlaps

您可以使用-P启用支持lookbehinds:的Perl兼容正则表达式

% grep -oP '(?<=wrong overlaps: )w+(.w+)+' data
XW.W12.HHZ.2007.289

但请注意,PCRE不支持可变长度的lookbehinds,因此您需要在之前键入完整的模式,例如:

something test string: ABC:DEF

ABC:DEF可以用提取

(?<=test string: )w+(.w+)+

但不是

(?<=test string)w+(.w+)+

相关内容

  • 没有找到相关文章

最新更新