How to grep for lines above and below a certain pattern
我想搜索特定图案(比如小节线),而且打印的上方和下方(即1线)的图案或2行上方和下方的图案线条。
Foo line
Bar line
Baz line
....
Foo1 line
Bar line
Baz1 line
....
Use grep
with the parameters -A
and -B
to indicate the number a of lines A
fter and B
efore 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.
grep
is 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
链接地址: http://www.djcxy.com/p/19634.html
上一篇: 在比赛结束后上线