首页 > 解决方案 > grep 一个“文本”并打印文本前后的所有行。每个日志会话由 2 个空行分隔

问题描述

1  
1  
1  
1  
  Text  
11
1  
1  
1

上面的文本可以在任何地方,因此 grep -C 无济于事。我已经尝试过使用 AWK 但我想使用 grep

zgrep -C25 "Text" engine.*.log.gz

不起作用,因为文本可能出现在任何地方

我知道该awk选项,但它不适用于 .gz 文件我必须将其转换为一个漫长的过程
awk -v RS= '/Text/' engine.*.log.gz

标签: linuxawkgrep

解决方案


只需以简单、明显、健壮、可移植的方式进行:

zcat engine.*.log.gz | awk -v RS= '/Text/{print; exit}'

这也应该非常有效,因为在找到第一个退出SIGPIPEzcat获得的.awkTextzcat

或者如果Text可以在输入中出现多次并且您希望所有关联的记录输出:

zcat engine.*.log.gz | awk -v RS= -v ORS='\n\n' '/Text/' 

推荐阅读