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?


Aus Ihrer Beschreibung geht hervor, dass Sie möchten, dass die 10 Zeilen das Wort fortsetzen error.
ThomasW

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.


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.

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'

8

Versuche dies:

grep -i -A 10 "my_regex"

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.