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?


Z twojego opisu wynika, że ​​chcesz 10 linijek poprzedzających słowo error.
— ThomasW

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ę.


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.

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'

8

Spróbuj tego:

grep -i -A 10 "my_regex"

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.