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

sri*_*ram 130 bash shell ubuntu

嗨,我很擅长bash编程.我想要一种在给定文本中搜索的方法.为此,我使用grep功能:

grep -i "my_regex"
Run Code Online (Sandbox Code Playgroud)

这样可行.但鉴于data这样:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends
Run Code Online (Sandbox Code Playgroud)

一旦我找到了单词error(使用grep -i error data),我希望找到跟随这个单词的10行error.所以我的输出应该是:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?

Jon*_*Lin 236

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

grep -i -B 10 'error' data
Run Code Online (Sandbox Code Playgroud)

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

  • `-C 10`将一举打印出10行之前和之后! (19认同)

Cha*_*ell 25

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

grep -i "my_regex" -A 10
Run Code Online (Sandbox Code Playgroud)

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

grep -i "my_regex" -B 10
Run Code Online (Sandbox Code Playgroud)

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

grep -i "my_regex" -C 10
Run Code Online (Sandbox Code Playgroud)

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:~$
Run Code Online (Sandbox Code Playgroud)

正常的grep

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 
Run Code Online (Sandbox Code Playgroud)

Grep完全匹配的行和2行之后

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 
Run Code Online (Sandbox Code Playgroud)

Grep精确匹配线和2行之前

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 
Run Code Online (Sandbox Code Playgroud)

Grep精确匹配线和前后2行

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 
Run Code Online (Sandbox Code Playgroud)

参考: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.
Run Code Online (Sandbox Code Playgroud)

  • 很好,香港专业教育学院现在不得不看几次,也许我记得它为-A(FTER)-B(EFORE)-C(ONTEXT) (2认同)

Ray*_*oal 10

这样做的方法是在手册页的顶部附近

grep -i -A 10 'error data'
Run Code Online (Sandbox Code Playgroud)


Des*_*nov 8

试试这个:

grep -i -A 10 "my_regex"
Run Code Online (Sandbox Code Playgroud)

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