匹配模式后打印特定行数

问题描述 投票:0回答:6

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

regex perl sed awk pattern-matching
6个回答
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

我将变量名称从“found”的“f”更改为“count”的“c”,其中 合适,因为这更能表达变量的实际含义。

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

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

7
投票

使用 grep 有一种非常简单的方法可以做到这一点:

grep -A 81 AAA input_file

来自手册页:

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


6
投票

在表情后添加

{c=81;next}c-->0

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

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
投票

GNU 代码:

sed /AAA/,+81!d file

0
投票

这是一个 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   
© www.soinside.com 2019 - 2024. All rights reserved.