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

pix*_*rth 35 unix linux awk grep

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

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

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

Jon*_*ler 35

这听起来像你需要的 sed:

sed -n '/pattern/,/^$/p' file
Run Code Online (Sandbox Code Playgroud)

不要默认打印(-n).对于匹配/pattern/空行的行/^$/,请打印.

  • 请注意,这并不显示整个事件,而是错过了事件前面模式的那些行。 (2认同)
  • 要清除:命令格式为''<address1>,<address2> <function>'`.它找到包含地址范围(行范围),以"pattern"匹配开头,以及后续空行匹配(匹配`^ $`).对于每个范围函数执行(`p`:打印输入行).为了从输出中排除空行,​​请使用`sed -n'/ pattern /,/ ^ $/{/ ^ $ /!p}'file`.这里`/ ^ $ /!p`表示打印任何不匹配`^ $`的输入行. (2认同)
  • 这对我来说很有效,但有一个例外:我的源输入有DOS风格的换行符(\ r \n),所以我不得不这样做:`sed -n'/ pattern /,/ ^\r $/p' file` (2认同)

Wil*_*ell 22

一个简单的解决方案是

awk '/pattern/' RS= input-file
Run Code Online (Sandbox Code Playgroud)

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

  • 这将显示整个事件,包括前面的行(返回到空行) (2认同)

sam*_*hen 8

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

awk '/pattern/ {do_print=1}
     do_print==1 {print}  
     NF==0 {do_print=0}' input_file
Run Code Online (Sandbox Code Playgroud)

此脚本还将打印空行,以便更容易在视觉上分离不同的匹配块.如果您不想要空白行,请交换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