我必须在输入文件中每次出现表达式“AAA”后打印 81 行。我该怎么办?
以下惯用法描述了如何选择给定的记录范围 要匹配的特定模式:
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
我将变量名称从“found”的“f”更改为“count”的“c”,其中 合适,因为这更能表达变量的实际含义。
所以,你需要上面的“e”:
awk 'c&&c--;/AAA/{c=81}' file
使用 grep 有一种非常简单的方法可以做到这一点:
grep -A 81 AAA input_file
来自手册页:
-A NUM,--after-context=NUM
在匹配行之后打印 NUM 行尾随上下文。 在连续的匹配组之间放置一条包含组分隔符 (--) 的行。 使用 -o 或 --only-matching 选项,这不起作用并给出警告。
在表情后添加
{c=81;next}c-->0
:
awk '/AAA/{c=81;next}c-->0' somefile
打印匹配行和以下81行:
awk '/AAA/{x=NR+81}(NR<=x){print}' input_file
要打印以下 81 行,但不匹配行:
awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file
GNU sed代码:
sed /AAA/,+81!d file
这是一个 Perl 解决方案。 在文本文件中搜索模式,匹配后打印接下来的 81 行。
#!/usr/bin/perl -w
#print 81 lines after match
while(<>){
if( /diamond/i ){
print "\n\n*****Match found*****\n$_"; #print header and matching line
#print next 81 lines
for( 1 .. 81 ){
print "$_:\t" . <>;
}
}
}
输出看起来像这样
perl print.n.lines.after.pattern.pl programming.perl.txt
*****Match found*****
ther. There are plenty of diamonds in the rough waiting to be polished off here.
1:
2:
3: Code Development Tools
4: The O module has many interesting Modi Operandi beyond feeding the exasper-
5: atingly experimental code generators. By providing relatively painless access to
6: the Perl compiler’s output, this module makes it easy to build other tools that
7: need to know everything about a Perl program.
8: The B::Lint module is named after lint(1), the C program verifier. It inspects
9: programs for questionable constructs that often trip up beginners but don’t nor-
10: mally trigger warnings. Call the module directly:
11: % perl –MO=Lint,all myprog
12:
13:
14:
15:
<continues for 60 lines>
75: And this shows how Perl really compiles a three-part for loop into a while loop:
76: % perl –MO=Deparse –e 'for ($i=0;$i<10;$i++) { $x++ }'
77: $i = 0;
78: while ($i< 10) {
79: ++$x;
80: }
81: continue {
打了 49 个角色
perl -ne 'if(/diamond/){print;for(1..81){print "$_: ".<>;}}' programming.perl.txt