Wie rufe ich Zeilen vor / nach dem grep-Ergebnis in bash ab?

151

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

grep -i "my_regex"

Das funktioniert. Aber angesichts der folgenden data:

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

Sobald ich das Wort gefunden habe error(mit grep -i error data), möchte ich die 10 Zeilen finden, die dem Wort folgen error. Meine Ausgabe sollte also sein:

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

Gibt es Möglichkeiten, dies zu tun?

Sriram
quelle
Aus Ihrer Beschreibung geht hervor, dass Sie möchten, dass die 10 Zeilen das Wort fortsetzen error.
ThomasW
Beantwortet das deine Frage? grep eine Datei, aber mehrere umgebende Linien anzeigen?
Organic Advocate

Antworten:

266

Sie können die Verwendung -Bund -ALinien vor und nach dem Spiel zu drucken.

grep -i -B 10 'error' data

Druckt die 10 Zeilen vor dem Spiel, einschließlich der übereinstimmenden Zeile selbst.

Jon Lin
quelle
1
Danke das funktioniert. Aber als ich versuchte, diese Ausführung in der Variablen wie folgt zu speichern test=$(grep -i -B 10 'error' data)und mit zu drucken echo $test, erhalte ich die geraden langen Zeilen als Ausgabe.
Sriram
1
Danke, ich habe herausgefunden, dass ich das echo "$test"lieber tun muss alsecho $test
sriram
25
-C 10druckt 10 Zeilen vor UND nach auf einen Schlag aus!
Joshua Pinter
Gibt es eine Möglichkeit, dies mit einem bestimmten Vorher-Punkt zu tun? Sagen wir, die Länge, die ich vorher greifen muss, ist variabel?
Erudaki
30

Dies druckt 10 Zeilen des nachfolgenden Kontexts nach dem Abgleichen der Zeilen

grep -i "my_regex" -A 10

Wenn Sie 10 Zeilen führenden Kontexts drucken müssen, bevor Sie Zeilen abgleichen können,

grep -i "my_regex" -B 10

Und wenn Sie 10 Zeilen führenden und nachfolgenden Ausgabekontexts 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:~$

Normal grep

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

Grep genau passende Linien und 2 Linien danach

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

Grep genau passende Linien und 2 Linien vor

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

Grep genau passende Linien und 2 Linien vorher und nachher

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.
Charlotte Russell
quelle
2
Schön, ich musste das jetzt ein paar Mal nachschlagen, vielleicht kann ich mich daran erinnern als -A (FTER) -B (EFORE) -C (ONTEXT)
Opentuned
11

Der Weg dazu befindet sich oben auf der Manpage

grep -i -A 10 'error data'
Ray Toal
quelle
8

Versuche dies:

grep -i -A 10 "my_regex"

-A 10 bedeutet, zehn Zeilen nach dem Abgleich mit "my_regex" drucken

Desislav Kamenov
quelle