如何使用grep和正则表达式提取一些字符串

时间:2017-03-11 21:52:55

标签: regex 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

我尝试用以下两者进行组合:

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

但显而易见只表明:

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

由于 哈维

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

grep无法忽略/处理可变长度的非捕获组(,因为它们不应被捕获),如(?:INFO.*)或来自最终输出的(?=INFO.*)。实际上,我们无法将可变长度的后缀标记为 non-captured
使用sed命令代替(仅获取所需的匹配组):

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

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

/p标志,告诉只打印匹配的子串

答案 2 :(得分:0)

使用cut命令很容易解决:

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

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