我如何获取行之前/之后的grep结果在bash?

我想要一种在给定文本中搜索的方法。为此,我使用grep:

grep -i "my_regex"

这工作。但考虑到这样的数据:

This is the test data
This is the error data as follows
. . .
. . . .
. . . . . .
. . . . . . . . .
Error data ends

一旦我找到了单词error(使用grep -i error data),我希望找到单词error后面的10行。所以我的输出应该是:

. . .
. . . .
. . . . . .
. . . . . . . . .
Error data ends

有什么办法可以做到吗?

256505 次浏览

可以使用-B-A来打印匹配前后的行。

grep -i -B 10 'error' data

将在匹配之前打印10行,包括匹配的行本身。

试试这个:

grep -i -A 10 "my_regex"

-A 10表示在匹配到"my_regex"后打印10行

做到这一点的方法是在手册页的顶部附近

grep -i -A 10 'error data'

这将在匹配行之后打印10行尾随上下文

grep -i "my_regex" -A 10

如果需要在匹配行之前打印10行前导上下文,

grep -i "my_regex" -B 10

如果需要打印10行前导和尾输出上下文。

grep -i "my_regex" -C 10

例子

user@box:~$ cat out
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

正常的grep

user@box:~$ grep my_regex out
line 5 my_regex
user@box:~$

Grep精确匹配的行和后面的2行

user@box:~$ grep -A 2 my_regex out
line 5 my_regex
line 6
line 7
user@box:~$

Grep精确匹配的行和2行之前

user@box:~$ grep -B 2 my_regex out
line 3
line 4
line 5 my_regex
user@box:~$

Grep精确匹配的行和前后2行

user@box:~$ grep -C 2 my_regex out
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$

参考:manpage grep

-A num
--after-context=num


Print num lines of trailing context after matching lines.
-B num
--before-context=num


Print num lines of leading context before matching lines.
-C num
-num
--context=num


Print num lines of leading and trailing output context.