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.