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


151

嗨,我是bash编程的新手。我想要一种在给定文本中搜索的方法。为此,我使用grep函数:

grep -i "my_regex"

这样可行。但是给定data这样的:

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

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

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

有什么办法吗?


从您的描述看来,您想让该单词前接10行error
ThomasW

这回答了你的问题了吗?grep一个文件,但显示几行?
有机倡导者

Answers:


266

您可以使用-B-A前和比赛结束后印刷线条。

grep -i -B 10 'error' data

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


1
谢谢,这是工作。但是,当我尝试将此执行存储在这样的变量中test=$(grep -i -B 10 'error' data)并使用进行打印时echo $test,我得到了直线的长行作为输出。
斯里兰卡

1
谢谢,我发现我需要这样做echo "$test"而不是echo $test
sriram

25
-C 10一口气将在AND之前打印出10行!
约书亚·品特

有没有一种方法可以使用特定的先行点?说我必须抢先的长度是可变的?
Erudaki

31

匹配行后将打印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.

3
很好,我现在必须检查几次,也许我还可以将它记为-A(FTER)-B(EFORE)-C(ONTEXT)
Opentune,


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.