使用前n行在两个模式之间过滤文本

时间:2011-02-05 15:25:16

标签: text filter sed awk grep

假设我们有一个这样的文件:

l1 abcdefgh
l2 abcde
l3 some line i want to retrieve
l4 another line i want to retrieve
l5 matching pattern
l6 abc
l7 abcdef
l8 unmatching pattern
l9 blah blah

我想检索以下输出:

l3 some line i want to retrieve
l4 another line i want to retrieve
l5 matching pattern
l6 abc
l7 abcdef

所以我想在第一次出现匹配模式,匹配线和所有行之前输出两行,直到我点击'不匹配的模式'。当然,可以检索多个文本范围。

实现这一目标的最简单方法是什么?我应该使用哪些工具?谷歌的内容是什么?目前无法从基础知识中学习awk。

3 个答案:

答案 0 :(得分:2)

在awk中

{ a[i++ % 3 ]=$0} 
/ matching pattern/ {print a[(i-3)%3];print a[(i-2)%3];i=0}
/matching pattern/,/unmatching pattern/ {if($0 !~ /unmatching pattern/) print }

Working here

答案 1 :(得分:2)

awk '/pattern/{print p"\n"q"\n"$0;f=1;next} {p=q;q=$0} f{s=s"\n"$0; if ($0~/unmatching/) { print s;exit} }' file

答案 2 :(得分:1)

在sed:

sed -n '1N;N;/pattern/{N;N;p;s/.*//;N;N;};$!D' filename