使用grep我知道如何将上下文设置为固定数量的行。是否可以根据任意字符串条件显示上下文,例如将后上下文设置为“直到下一个空行”?
或者可能是其他一些工具组合?
基本上我有一个连续行的日志文件,空白行分隔我想在日志文件中搜索字符串的“事件”,但显示整个事件......
答案 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