2016-06-07 69 views
0

我跟线大日志文件切片关键字文件

[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,在以上例子中为210和YP.CT02.HHZ.2012.334)。

特定类型关键字的格式是固定的(子字符串通过固定数量的点连接)。子字符串由字母和数字组成(0-5个字符,但不是所有子字符串都可以是空的,通常最多只有一个,例如XW.WTA12..2007.289)。子字符串由字母和数字组成(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以上命令保存完整的行。我想我需要正则表达式来提取关键字?

+0

您究竟如何区分这种模式?考虑发布更多示例输入和输出.. – sjsam

+0

@shellter我对如何提取没有太多想法。我不是故意要求提供完整的代码,而是要提出如何实现的建议。例如,简单地完成它的最佳命令是什么? – Lee

+2

好的,很好的更新,但在我撤销我的近距离投票之前,请同时更新您的Q和期望的输出。实际的样本输出而不是口头描述消除了指定修复的一整类错误。祝你好运。 – shellter

回答

4

假设关键字由含有周期定义,由字母和数字所包围,那么正则表达式接着将匹配的所有关键字:

% 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所以你需要前,将完整的图案,如:

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

something test string: ABC:DEF 

ABC:DEF能以提取

但不是

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

'grep -oE'\ w +(\。\ w +)+'data'不安全,因为在原因文本中可能有'XX.YY'。 'grep -oP'(?<= ...'完美无缺,可以不一次保存到多个文件,我可以一种类型提取一种类型,结果中有重复,但我知道如何处理用它,'grep ... | sort | uniq'。感谢这个很好的A,特别是关于选项和正则表达式的解释。@shellter我以为你会回答,但看起来你是一个SO?的检查员。 -P – Lee

+0

@Lee FYI大多数'sort'版本都有'sort -u'在一个进程中进行排序和uniq。 – andlrc

+0

是的,它的确如此。 – Lee