我必须在每次出现输入文件中的“AAA”表达式后打印81行。我该怎么做?
答案 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:
sed /AAA/,+81!d file