如何将上下文后面的grep设置为“直到下一个空白行”?

时间:2012-11-23 18:40:19

标签: linux unix awk grep

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

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

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

4 个答案:

答案 0 :(得分:30)

听起来你需要sed

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

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

答案 1 :(得分:21)

一个简单的解决方案是:

awk '/pattern/' RS= input-file

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

答案 2 :(得分:8)

这是一个(经过测试的)awk解决方案,分为多行以便于阅读:

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

此脚本还将打印空行,以便更容易在视觉上分离不同的匹配块。如果您不想要空行,请交换2行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默认情况下用空格和制表符分隔每一行,以便将一行划分为字段。在这种情况下,空白行没有任何字段 - 因此,当我们看到do_print
  • 行时,我们会关闭NF == 0标记以停止打印

答案 3 :(得分:0)

我个人喜欢@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