从日志文本文件中切出关键字
Slice keywords from log text files
我有一个很大的日志文件,其行如下
[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.WA2
、XW.W12.HHZ.2007.289
和 YP.CT02.HHZ.2012.334
)。
特定类型的关键字格式是固定的(子字符串由固定数量的点连接)。
子串由字母和数字组成(0-5个字符,但不是所有的子串都可以为空,一般最多只有一个,如XW.WTA12..2007.289
)。
我要
提取关键词
将不同类型的关键字保存到单独的文件中
目前我试过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 不支持可变长度后视,因此您需要先输入完整的模式,例如:
something test string: ABC:DEF
ABC:DEF
可以提取:
(?<=test string: )\w+(\.\w+)+
但不是
(?<=test string)\w+(\.\w+)+
我有一个很大的日志文件,其行如下
[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.WA2
、XW.W12.HHZ.2007.289
和 YP.CT02.HHZ.2012.334
)。
特定类型的关键字格式是固定的(子字符串由固定数量的点连接)。
子串由字母和数字组成(0-5个字符,但不是所有的子串都可以为空,一般最多只有一个,如XW.WTA12..2007.289
)。
我要
提取关键词
将不同类型的关键字保存到单独的文件中
目前我试过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 不支持可变长度后视,因此您需要先输入完整的模式,例如:
something test string: ABC:DEF
ABC:DEF
可以提取:
(?<=test string: )\w+(\.\w+)+
但不是
(?<=test string)\w+(\.\w+)+