我有一些喜欢的行:
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
由于 哈维
答案 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,因为我认为语法看起来更干净。