如何将上下文后的 grep 设置为"until the next blank line"?



使用grep,我知道如何将上下文设置为固定数量的行。是否可以显示基于任意字符串条件的上下文,例如将上下文后设置为"直到下一个空行"?

或者可能是其他工具的组合?

基本上,我有一个连续行的日志文件,用空行分隔我想在日志文件中搜索字符串的"事件",但显示整个事件。。。。

听起来你需要sed:

sed -n '/pattern/,/^$/p' file

默认情况下不打印(-n)。对于与/pattern/匹配到空行/^$/的行,请打印。

一个简单的解决方案是:

awk '/pattern/' RS= input-file

将RS设置为空字符串使awk将空行作为记录分隔符,而简单规则/pattern/使awk打印任何与模式匹配的记录,可以是任何扩展的正则表达式。

这里有一个(经过测试的)awk解决方案,为了可读性,它被分为多行:

awk '/pattern/ {do_print=1}
do_print==1 {print}  
NF==0 {do_print=0}' input_file

这个脚本还将打印空行,这样就更容易在视觉上分离不同的匹配块。如果不需要空白行,请交换do_print==1 {print}NF==0 {do_print=0}这两行

解释:

  • awk:调用awk工具-它按顺序一次计算一行输入
  • '...'.:由单引号括起来的所有内容都作为指令提供给awk。在这种情况下,我们对每一行执行引用的说明
  • /pattern/ {do_print=1}:每当一行包含"pattern"时,打开do_print标志
  • do_print==1 {print}:如果do_print标志为on,则打印当前行
  • NF==0 {do_print=0}:NF代表字段数。默认情况下,awk用空格和制表符分隔每一行,以将一行分隔为字段。在这种情况下,一个空行没有字段,所以当我们看到一行有NF == 0时,我们关闭do_print标志以停止打印

就我个人而言,我喜欢@William Pursell的答案,因为前面的上下文通常很有用(例如,在ini文件中查找内容时)。如果你真的只想要awk的after上下文,你可以这样做:

$ cat demo.ini 
[foo]
aaa = 1
bbb = 2
ccc = 3
[bar]
eee = 8
fff = 0
ggg = 1
[baz]
xxx = 1
yyy = 0
zzz = 2
$ awk '/bar/,/^$/' demo.ini 
[bar]
eee = 8
fff = 0
ggg = 1
$ awk '/fff/,/^$/' demo.ini 
fff = 0
ggg = 1
$

RS=版本比较:

$ awk '/bar/' RS= demo.ini 
[bar]
eee = 8
fff = 0
ggg = 1
$ awk '/fff/' RS= demo.ini 
[bar]
eee = 8
fff = 0
ggg = 1

我扩展了上面的解决方案,在部分之间包括空行:

awk’/模式/’RS=ORS=";\n">输入文件

相关内容

最新更新