grep karakter yang cocok dari suatu pertandingan

8

Saya mencari untuk menemukan dan mengganti dalam database dump raksasa, dan itu tidak melakukan apa yang saya pikir harus terjadi. Saya ingin mengambil string target saya di file, dan kemudian melihat sekitar 8 karakter atau lebih (saya mungkin perlu menyesuaikan nomor itu, tergantung). Bagaimana saya bisa melakukan itu?

Alasan saya tidak bisa melihat ini karena ada banyak ratusan, jika tidak ribuan pertandingan. Saya ingin mendapatkan beberapa karakter di sekitar string, dan kemudian memasukkannya ke dalam uniqatau sesuatu untuk melihat mengapa penemuan dan penggantian saya memiliki perilaku yang tidak terduga.

Juga, mungkin ada beberapa pertandingan di baris yang sama!

pengguna394
sumber
Ini bukan file teks?
enzotib
Memang, tetapi bahkan hanya pertandingan terlalu besar file untuk bola mata.
user394

Jawaban:

12

Cara kasar menggunakan grepsesuatu akan seperti

grep -o "....yourtext...." /path/to/the/dump.sql

Jumlah titik sesuai dengan jumlah karakter sebelum / setelah teks yang dipahami. The -opilihan membuat grepkeluaran hanya pertandingan, tidak seluruh jalur.

Untuk digunakan uniqpada output, ingat Anda harus mengurutkan output terlebih dahulu. Jadi biasanya, Anda akan melakukannya

grep . . . | sort | uniq

Jika Anda tertarik dengan hitcount untuk setiap pertandingan, Anda bisa mendapatkan hasil yang bagus dengan menggunakan

grep . . . | sort | uniq -c | sort -n
rozcietrzewiacz
sumber
Mentah? Sangat canggih!
user394
1
Anda bisa memperluas sedikit satu ini dengan menggunakan operator ulangi: grep -o '.\{8\}yourtext.\{8\}'. Ini sedikit kurang memusingkan daripada menghitung 8 titik.
Caleb
:) Maksud saya, Anda tidak bermain dengan hal-hal seperti menghitung karakter yang cocok (menggunakan rentang) atau mempersempit set karakter.
rozcietrzewiacz
@ Caleb dan user394: Ini persis apa yang saya maksudkan untuk tidak menyarankan (dan dengan demikian disebut metode saya "mentah"). Orang tidak perlu mengingat konstruktor operator yang berulang, selain - bahkan lebih cepat untuk mengetik "....." daripada ". \ {6 \}".
rozcietrzewiacz
7

Mulai dari jawaban @rozcietrzewiacz, saya dapat memperluas ke

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file
enzotib
sumber
1
Urutan titik "kasar" terlihat lebih baik dan lebih baik setiap saat :)
Caleb
1
@ Caleb: umumnya jawaban "kasar" adalah awal yang baik, tetapi kadang-kadang orang ingin menjelaskan sedikit tentang itu.
enzotib
1
Metode urutan titik tidak akan menemukan pola target yang dibenarkan kiri atau kanan; metode ini akan. (+1)
Peter.O
2
PS .. Saya hanya memperhatikan bahwa itu tidak akan menangkap banyak contoh pola pada baris yang sama (seperti OP disebutkan) ketika ruang lingkup teks 'eksta' tambahan dari pola pertama tumpang tindih dengan ruang lingkup teks 'ekstra' utama dari pola selanjutnya
Peter.O
@ Fred: yeah, -ohanya memberikan pertandingan pertama ketika dua pertandingan tumpang tindih:echo 'aaabbbccc' | grep -o 'bb
enzotib