Bagaimana cara saya mengambil garis sebelum / setelah grep menghasilkan bash?


151

Hai Saya sangat baru dalam pemrograman bash. Saya ingin cara untuk mencari dalam Teks yang diberikan. Untuk itu saya menggunakan grepfungsi:

grep -i "my_regex"

Itu bekerja. Namun mengingat dataseperti ini:

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

Setelah saya menemukan kata error(menggunakan grep -i error data), saya ingin menemukan 10 baris yang mengikuti kata error. Jadi output saya harus:

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

Apakah ada cara untuk melakukannya?


Dari uraian Anda, sepertinya Anda menginginkan 10 baris melanjutkan kata error.
— ThomasW

Jawaban:


266

Anda dapat menggunakan -Bdan -Auntuk mencetak garis sebelum dan sesudah pertandingan.

grep -i -B 10 'error' data

Akan mencetak 10 baris sebelum pertandingan, termasuk garis yang cocok itu sendiri.


1
Terima kasih, ini berhasil. Tetapi ketika saya mencoba untuk menyimpan eksekusi ini dalam variabel seperti ini test=$(grep -i -B 10 'error' data), dan mencetaknya menggunakan echo $test, saya mendapatkan garis lurus panjang sebagai output.
— sriram

1
Terima kasih saya tahu saya perlu melakukan ini echo "$test"daripadaecho $test
— sriram

25
-C 10akan mencetak 10 baris sebelum DAN setelah dalam satu gerakan!
— Joshua Pinter

apakah ada cara untuk melakukan ini menggunakan titik tertentu sebelum? katakanlah panjang yang harus saya ambil sebelum variabel?
— Erudaki

31

Ini mencetak 10 baris konteks trailing setelah garis yang cocok

grep -i "my_regex" -A 10

Jika Anda perlu mencetak 10 baris konteks terkemuka sebelum mencocokkan garis,

grep -i "my_regex" -B 10

Dan jika Anda perlu mencetak 10 baris konteks output terkemuka dan tertinggal.

grep -i "my_regex" -C 10

Contoh

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

Grep normal

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

Dapatkan garis pencocokan yang tepat dan 2 baris setelahnya

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

Dapatkan garis dan 2 pencocokan yang tepat sebelumnya

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

Dapatkan garis dan 2 garis yang cocok sebelum dan sesudah

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

Referensi: 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
Bagus, saya harus melihat ini beberapa kali sekarang, mungkin saya bisa mengingatnya sebagai -A (FTER) -B (EFORE) -C (ONTEXT)
— Dibuka

11

Cara untuk melakukan ini adalah di dekat bagian atas halaman manual

grep -i -A 10 'error data'

8

Coba ini:

grep -i -A 10 "my_regex"

-A 10 berarti, cetak sepuluh baris setelah pertandingan ke "my_regex"

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.