190

我想要一种在给定文本中搜索的方法。为此,我使用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),我希望找到这个词后面的 10 行error。所以我的输出应该是:

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

有什么办法吗?

4

4 回答 4

330

您可以使用-Band-A打印匹配前后的行。

grep -i -B 10 'error' data

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

于 2012-09-16T06:16:52.310 回答
52

这会在匹配行之后打印 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:~$ 

参考:手册页 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.
于 2017-07-12T08:12:55.777 回答
11

执行此操作的方法位于手册页顶部附近

grep -i -A 10 'error data'
于 2012-09-16T06:17:26.170 回答
8

试试这个:

grep -i -A 10 "my_regex"

-A 10 表示,匹配后打印十行到“my_regex”

于 2012-09-16T06:17:24.870 回答