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.