2017-03-11 43 views
1

一些字符串我有一些线喜欢:我怎样才能提取使用grep和正则表达式

2017-03-10 21:55:57.426 INFO es.sd.phase.kpi.KPIEventNotifier -  ID-es2rxsf01v-54870-1489080967572-0-2605574 - KPI1: 52 ms [ValidationPhase:1#TransformationPhase:8#EnrichmentPhase:10#DynamicRouterPhase:4#PoseseadorPhase:29#generateACK:0#EndPhase:0] 

grep命令的输出必须表明:

2017-03-10 21:55:57.426 KPI1: 52 ms 

我试图agroup都是具有:

tail -F file.log | grep -Po "(.\*INFO).*(KPI1.*ms)" 

但obviosly仅显示:

2017-03-10 21:55:57.426 INFO es.sd.phase.kpi.KPIEventNotifier -  ID-es2rxsf01v-54870-1489080967572-0-2605574 - KPI1: 52 ms 

我们必须避免这种情况的部分:

INFO es.sd.phase.kpi.KPIEventNotifier -  ID-es2rxsf01v-54870-1489080967572-0-2605574 - 

而且只有这部分表演:

2017-03-10 21:55:57.426 KPI1: 52 ms 

感谢 哈维

+0

整个事情只是一条总是以完全相同的方式被格式化的行吗? – klutt

+0

使用awk也许是一个更好的选择。 –

+1

如果是这样,你可以使用cut -f 1,2,9-11 -d“” – klutt

回答

0

grep不能省略/治疗非捕获基(如它们不应该被捕获)可变长度的像(?:INFO.*)(?=INFO.*)从最终产出。实际上,我们不能将可变长度的序列标记为未捕获
使用sed命令来代替(只得到所需的匹配组):

sed -En 's/^([-0-9.: ]+)INFO.*?(KPI.+ms).*/\1\2/p' file.log 

-E选项,允许扩展正则表达式

/p标志,讲述只打印匹配的子

1

而不是使用grep和其他工具,不管它是过滤的grep结果,你可以使用基于字段的awk。使用默认字段分隔符(空格),就可以写成:

awk '$3=="INFO" && $8=="KPI1:"{print $1,$2,$8,$9,$10}' file.log 
0

这是很容易与解决剪切命令:

tail -F file.log | cut -f 1,2,9-11 -d " " 

我经常用cut而不是awk ,因为我认为语法看起来更干净。

相关问题