匹配模式后打印特定行数

时间:2013-06-24 19:31:54

标签: regex perl sed awk pattern-matching

我必须在每次出现输入文件中的“AAA”表达式后打印81行。我该怎么做?

5 个答案:

答案 0 :(得分:20)

以下习语描述了如何选择给定的记录范围 要匹配的特定模式:

a)打印某些模式的所有记录:

awk '/pattern/{f=1}f' file

b)在某种模式之后打印所有记录:

awk 'f;/pattern/{f=1}' file

c)在某种模式后打印第N条记录:

awk 'c&&!--c;/pattern/{c=N}' file

d)在某种模式之后打印除第N条记录以外的所有记录:

awk 'c&&!--c{next}/pattern/{c=N}1' file

e)在某种模式之后打印N条记录:

awk 'c&&c--;/pattern/{c=N}' file

f)在某种模式之后打印除N条记录之外的所有记录:

awk 'c&&c--{next}/pattern/{c=N}1' file

g)从某种模式打印N条记录:

awk '/pattern/{c=N}c&&c--' file

我将变量名称从“f”更改为“found”到“c”更改为“count” 适当的,因为它更能表达变量实际上是什么。

所以,你想要上面的“e”:

awk 'c&&c--;/AAA/{c=81}' file

答案 1 :(得分:7)

使用grep执行此操作非常简单:

grep -A 81 AAA input_file

从手册页:

  

-A NUM, - after-context = NUM​​
  匹配行后打印NUM行尾随上下文。在连续的匹配组之间放置一个包含组分隔符( - )的行。使用-o或--only-matching选项,这没有任何效果,并且会给出警告。

答案 2 :(得分:6)

在表达式后添加{c=81;next}c-->0

awk '/AAA/{c=81;next}c-->0' somefile

答案 3 :(得分:5)

要打印匹配的行以下81行:

awk '/AAA/{x=NR+81}(NR<=x){print}' input_file

要打印以下81行,但匹配行:

awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file

答案 4 :(得分:4)

GNU代码

sed /AAA/,+81!d file