Grep sonucunun bash ile sonuçlanmasından önce / sonra hatları nasıl getirebilirim?


151

Merhaba bash programlama konusunda çok yeniyim. Belirli bir Metinde arama yapmanın bir yolunu istiyorum. Bunun için grepişlev kullanın :

grep -i "my_regex"

Bu işe yarıyor. Ancak şu şekilde göz önüne alındığında data:

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

Kelimeyi bulduğumda (kelimeyi errorkullanarak grep -i error data), kelimeyi takip eden 10 satırı bulmak istiyorum error. Yani benim çıktı:

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

Bunu yapmanın herhangi bir yolu var mı?


Açıklamanızdan, 10 satırın kelimeyi ilerletmesini istiyorsunuz error.
ThomasW

Yanıtlar:


266

Maçtan önce ve sonra satırları yazdırmak için -Bve öğelerini kullanabilirsiniz -A.

grep -i -B 10 'error' data

Eşleşen çizginin kendisi de dahil olmak üzere 10 çizgiyi maçtan önce yazdıracaktır.


1
Teşekkürler bu çalışıyor. Ama bu yürütmeyi böyle bir değişkende saklamaya test=$(grep -i -B 10 'error' data)ve kullanarak yazdırmaya çalıştığımda echo $test, düz uzun çizgileri çıktı olarak alıyorum.
sriram

1
Teşekkürler Ben bunun echo "$test"yerine böyle yapmak gerektiğini anladımecho $test
sriram

25
-C 10önce ve sonra 10 satır yazdırmak bir düştü düştü!
Joshua Pinter

belirli bir önceki noktayı kullanarak bunu yapmanın bir yolu var mı? Önceden kapmam gereken uzunluk değişken mi?
Erudaki

31

Bu, eşleşen satırlardan sonra 10 satır sondaki bağlam yazdırır

grep -i "my_regex" -A 10

Satırları eşleştirmeden önce 10 satır ara bağlam yazdırmanız gerekiyorsa,

grep -i "my_regex" -B 10

Ve önde gelen ve sondaki çıkış bağlamında 10 satır yazdırmanız gerekiyorsa.

grep -i "my_regex" -C 10

Misal

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 tam eşleşen hatları ve 2 satır sonra

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

Tam eşleşen çizgileri ve 2 çizgiyi önce yakalayın

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

Önceden ve sonra tam eşleşen çizgileri ve 2 çizgiyi yakalayın

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

Referans: 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
Güzel, ive şimdi birkaç kez bakmak zorunda kaldım, belki -A (FTER) -B (EFORE) -C (ONTEXT) olarak hatırlayabilirim
13

11

Bunu yapmanın yolu man sayfasının üst kısmına yakın

grep -i -A 10 'error data'

8

Bunu dene:

grep -i -A 10 "my_regex"

-A 10, "my_regex" ile eşleştikten sonra on satır yazdırmak anlamına gelir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.