How to grep for lines above and below a certain pattern

后端 未结 2 1847
情书的邮戳
情书的邮戳 2020-12-18 04:37

I would like to search for a certain pattern (say Bar line) but also print lines above and below (i.e 1 line) the pattern or 2 lines above and below the pattern.

<         


        
相关标签:
2条回答
  • 2020-12-18 05:15

    grepis the tool for you, but it can be done with awk

    awk '{a[NR]=$0} $0~s {f=NR} END {for (i=f-B;i<=f+A;i++) print a[i]}' B=1 A=2 s="Bar" file
    

    NB this will also find one hit.

    or with grep

    grep -A2 -B1 "Bar" file
    
    0 讨论(0)
  • 2020-12-18 05:23

    Use grep with the parameters -A and -B to indicate the number a of lines After and Before you want to print around your pattern:

    grep -A1 -B1 yourpattern file
    
    • An stands for n lines "after" the match.
    • Bm stands for m lines "before" the match.

    If both numbers are the same, just use -C:

    grep -C1 yourpattern file
    

    Test

    $ cat file
    Foo  line
    Bar line
    Baz line
    hello
    bye
    hello
    Foo1 line
    Bar line
    Baz1 line
    

    Let's grep:

    $ grep -A1 -B1 Bar file
    Foo  line
    Bar line
    Baz line
    --
    Foo1 line
    Bar line
    Baz1 line
    

    To get rid of the group separator, you can use --no-group-separator:

    $ grep --no-group-separator -A1 -B1 Bar file
    Foo  line
    Bar line
    Baz line
    Foo1 line
    Bar line
    Baz1 line
    

    From man grep:

       -A NUM, --after-context=NUM
              Print NUM  lines  of  trailing  context  after  matching  lines.
              Places   a  line  containing  a  group  separator  (--)  between
              contiguous groups of matches.  With the  -o  or  --only-matching
              option, this has no effect and a warning is given.
    
       -B NUM, --before-context=NUM
              Print  NUM  lines  of  leading  context  before  matching lines.
              Places  a  line  containing  a  group  separator  (--)   between
              contiguous  groups  of  matches.  With the -o or --only-matching
              option, this has no effect and a warning is given.
    
       -C NUM, -NUM, --context=NUM
              Print NUM lines of output context.  Places a line  containing  a
              group separator (--) between contiguous groups of matches.  With
              the -o or --only-matching option,  this  has  no  effect  and  a
              warning is given.
    
    0 讨论(0)
提交回复
热议问题