Frage Wie hole ich Zeilen vor / nach dem grep-Ergebnis in bash?


Hallo, ich bin sehr neu in der Bash Programmierung. Ich möchte eine Möglichkeit, in einem bestimmten Text zu suchen. Dafür benutze ich grep Funktion:

grep -i "my_regex"

Das funktioniert. Aber angesichts der data so was :

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

Sobald ich das Wort gefunden habe error (unter Verwendung von grep -i error data), Ich möchte die 10 Zeilen finden, die dem Wort folgen error. Also meine Ausgabe sollte sein:

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

Gibt es Möglichkeiten, es zu tun?


75
2017-09-16 06:15


Ursprung


Antworten:


Du kannst den ... benutzen -B und -A Linien vor und nach dem Spiel zu drucken.

grep -i -B 10 'error' data

Druckt die 10 Zeilen vor dem Spiel, einschließlich der passenden Zeile.


153
2017-09-16 06:16



Der Weg dazu ist in der Nähe der oberen Seite der Manpage

grep -i -A 10 'error data'

8
2017-09-16 06:17



Dies druckt 10 Zeilen nachlaufenden Kontext nach übereinstimmenden Zeilen

grep -i "my_regex" -A 10

Wenn Sie 10 Zeilen führenden Kontext drucken müssen, bevor die Zeilen übereinstimmen,

grep -i "my_regex" -B 10

Und wenn Sie 10 Zeilen mit führenden und nachgestellten Ausgabekontext drucken müssen.

grep -i "my_regex" -C 10

Beispiel

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:~$

Normaler Grep

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

Grep exakt passende Linien und 2 Zeilen danach

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

Grep exakt passende Linien und 2 Zeilen davor

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

Grep exakt passende Linien und 2 Zeilen davor und danach

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

Referenz: 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.

8
2017-07-12 08:12



Versuche dies:

grep -i -A 10 "my_regex"

-A 10 bedeutet, zehn Zeilen nach der Übereinstimmung auf "my_regex" drucken


5
2017-09-16 06:17