Jak pobrać wiersze przed / po wyniku grep w bash?

151

Cześć Jestem bardzo nowy w programowaniu basha. Chcę znaleźć sposób wyszukiwania w danym tekście. Do tego używam grepfunkcji:

grep -i "my_regex"

To działa. Ale biorąc pod uwagę datato:

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

Kiedy już znalazłem słowo error(używając grep -i error data), chciałbym znaleźć 10 wierszy następujących po nim error. Więc mój wynik powinien wyglądać następująco:

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

Czy są na to sposoby?

sriram
źródło
Z twojego opisu wynika, że ​​chcesz 10 linijek poprzedzających słowo error.
ThomasW
Czy to odpowiada na twoje pytanie? grep plik, ale pokazać kilka otaczających go linii?
Organic Advocate

Odpowiedzi:

266

Możesz użyć -Bi, -Aaby wydrukować linie przed i po dopasowaniu.

grep -i -B 10 'error' data

Wyświetli 10 wierszy przed dopasowaniem, w tym samą pasującą linię.

Jon Lin
źródło
1
Dzięki, to działa. Ale kiedy próbowałem zapisać to wykonanie w zmiennej takiej jak ta test=$(grep -i -B 10 'error' data)i wydrukować je przy użyciu echo $test, otrzymuję proste długie linie jako dane wyjściowe.
sriram,
1
Dzięki, zorientowałem się, że muszę zrobić to w ten sposób, echo "$test"a nieecho $test
sriram
25
-C 10wydrukuje 10 wierszy przed AND po za jednym zamachem!
Joshua Pinter
czy istnieje sposób, aby to zrobić, używając określonego punktu przed? powiedzieć, że długość, którą muszę wcześniej chwycić, jest zmienna?
Erudaki,
31

Spowoduje to wypisanie 10 wierszy kontekstu końcowego po pasujących wierszach

grep -i "my_regex" -A 10

Jeśli chcesz wydrukować 10 linii wiodącego kontekstu przed dopasowaniem linii,

grep -i "my_regex" -B 10

A jeśli chcesz wydrukować 10 wierszy początkowego i końcowego kontekstu wyjściowego.

grep -i "my_regex" -C 10

Przykład

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

Normalny grep

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

Grep dokładnie pasujące wiersze i 2 wiersze po

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

Grep dokładnie pasujące wiersze i 2 wiersze przed

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

Grep dokładnie pasujące wiersze i 2 wiersze przed i po

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

Odniesienie: 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
źródło
3
Fajnie, musiałem teraz to sprawdzić kilka razy, może pamiętam to jako -A (FTER) -B (EFORE) -C (
ONTEXT
11

Sposób na zrobienie tego znajduje się u góry strony podręcznika

grep -i -A 10 'error data'
Ray Toal
źródło
8

Spróbuj tego:

grep -i -A 10 "my_regex"

-A 10 oznacza, wypisuje dziesięć wierszy po dopasowaniu do „my_regex”

Desislav Kamenov
źródło