匹配模式后打印特定行数

use*_*597 8 regex perl awk sed pattern-matching

每次出现输入文件中的"AAA"表达式后,我必须打印81行.我该怎么做?

Ed *_*ton 20

以下习语描述了如何在给定特定模式匹配的情况下选择一系列记录:

a)从某种模式打印所有记录:

awk '/pattern/{f=1}f' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'f;/pattern/{f=1}' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'c&&!--c;/pattern/{c=N}' file
Run Code Online (Sandbox Code Playgroud)

d)打印每条记录后,除了一些模式的第N个记录:

awk 'c&&!--c{next}/pattern/{c=N}1' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'c&&c--;/pattern/{c=N}' file
Run Code Online (Sandbox Code Playgroud)

F)打印后,除了一些模式的N条记录每一条记录:

awk 'c&&c--{next}/pattern/{c=N}1' file
Run Code Online (Sandbox Code Playgroud)

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

awk '/pattern/{c=N}c&&c--' file
Run Code Online (Sandbox Code Playgroud)

我从"F"改为变量名的"发现",以"C"为"计数"在适当情况下为这更多表现的是什么变量实际上是.

所以,你想要上面的"e":

awk 'c&&c--;/AAA/{c=81}' file
Run Code Online (Sandbox Code Playgroud)

  • +1已添加到收藏夹以供将来参考!! (2认同)

And*_*ark 7

使用grep有一种非常简单的方法:

grep -A 81 AAA input_file
Run Code Online (Sandbox Code Playgroud)

从手册页:

-A NUM, -
after -context = NUM 在匹配行后打印NUM行尾随上下文.在连续的匹配组之间放置一个包含组分隔符( - )的行.使用-o或--only-matching选项,这不起作用,并给出警告.


dav*_*dav 6

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

awk '/AAA/{c=81;next}c-->0' somefile
Run Code Online (Sandbox Code Playgroud)


Zer*_*eus 5

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

awk '/AAA/{x=NR+81}(NR<=x){print}' input_file
Run Code Online (Sandbox Code Playgroud)

要打印以下81行而不是匹配行:

awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file
Run Code Online (Sandbox Code Playgroud)