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?

sriram
sumber
Dari uraian Anda, sepertinya Anda menginginkan 10 baris melanjutkan kata error.
ThomasW
Apakah ini menjawab pertanyaan Anda? grep file, tetapi tampilkan beberapa baris di sekitarnya?
Advokat Organik

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.

Jon Lin
sumber
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.
Charlotte Russell
sumber
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'
Ray Toal
sumber
8

Coba ini:

grep -i -A 10 "my_regex"

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

Desislav Kamenov
sumber