Pengantar GREP dan Ekspresi Reguler

Pengantar GREP dan Ekspresi Reguler

Objektif

Setelah membaca tutorial ini, Anda harus dapat memahami bagaimana perintah grep bekerja, dan cara menggunakannya dengan ekspresi reguler dasar dan diperpanjang.

Kesulitan

MUDAH

Perkenalan

GREP adalah salah satu alat paling berguna yang dapat kita gunakan saat mengelola mesin berbasis UNIX: tugasnya adalah mencari pola yang diberikan di dalam satu atau lebih file dan mengembalikan kecocokan yang ada.

Dalam tutorial ini kita akan melihat cara menggunakannya, dan kami akan memeriksa juga variannya: Egrep Dan fgrep. Kami akan menempatkan kutipan yang benar -benar terkenal ini dari buku "The Lord of the Rings" pada file, dan kami akan menggunakan sebagai target untuk contoh kami:

Tiga cincin untuk raja-raja elf di bawah langit, tujuh untuk pengabdi kerdil di aula batu mereka, sembilan untuk manusia fana ditakdirkan untuk mati, satu untuk penguasa gelap di atas takhta gelapnya di tanah mordor di mana bayangan berbaring. Satu cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayangan berbaring. 

File akan dipanggil LOTR.txt.

Varian Grep

Dalam pendahuluan kami berbicara tentang dua varian GREP: Egrep Dan fgrep. Varian ini sebenarnya sudah usang, karena mereka setara dengan menjalankan grep dengan -E Dan -F Opsi masing -masing. Sebelum kita mulai menjelaskan apa varian itu berbeda dari yang asli kita harus memeriksa perilaku grep default saat menggunakan ekspresi reguler.

Mode ekspresi reguler dasar

Ekspresi reguler adalah pola yang dibangun mengikuti aturan spesifik untuk mencocokkan string atau beberapa string. Secara default grep menggunakan apa yang disebutnya Bre atau Ekspresi Reguler Dasar: Dalam mode ini hanya beberapa meta-karakter (karakter dengan makna khusus di dalam ekspresi reguler) tersedia.

Sebagai contoh pertama kami akan mencoba menggunakan GREP untuk mencocokkan string yang sangat sederhana, kata "fana". Sintaks GREP sangat sederhana: kami memohon program yang menyediakan pola yang harus dicocokkan sebagai argumen pertama, dan file target sebagai yang kedua:

$ grep mortal lotr.txt


Perintah di atas tidak mengembalikan kecocokan, meskipun kata "fana" memang muncul dalam teks: ini karena secara default GREP melakukan pencarian di hal - hal sensitif mode, jadi, karena kata "fana" dikapitalisasi, itu tidak cocok dengan pola yang kami berikan. Untuk mengatasi masalah ini dan melakukan pencarian yang lebih "generik", kita dapat menggunakan -Saya opsi (pendek untuk --abaikan kasus, Yang membuat grep mengabaikan perbedaan kasus:

$ grep -i lotr fana.txt

Kali ini perintah menghasilkan output berikut (kecocokan aktual disorot dengan warna merah):

Sembilan untuk pria fana ditakdirkan untuk mati,

Satu hal penting yang perlu diperhatikan adalah bahwa, secara default, Grep mengembalikan seluruh baris di mana pertandingan ditemukan. Perilaku ini, namun dapat dimodifikasi menggunakan -Hai opsi, atau versi panjangnya --hanya cocok. Saat menggunakan opsi ini, hanya kecocokan itu sendiri yang dicetak:

$ grep -o -i lotr fana.txt fana 

Sakelar menarik lainnya yang dapat kita gunakan adalah -N, kependekan dari --Jumlah garis. Saat opsi ini digunakan, jumlah garis di mana kecocokan ditemukan termasuk dalam output GREP. Perintah ini:

$ grep -n -i lotr fana.txt

Menghasilkan output berikut:

3: sembilan untuk pria fana ditakdirkan untuk mati

Di mana 3 adalah jumlah garis di mana pertandingan ditemukan.

Bagaimana jika kita hanya ingin mendapatkan jumlah aktual yang ditemukan, bukan pertandingan itu sendiri? Grep memiliki opsi khusus untuk mendapatkan hasil ini: -C, atau --menghitung. Menggunakan perintah di atas dengan opsi ini mengembalikan output berikut:

1

Yang, seperti yang diharapkan, jumlah kecocokan yang ditemukan dalam teks.

Meta-karakter dasar

Saatnya melakukan pencarian yang sedikit lebih rumit. Kami sekarang ingin menemukan semua baris dimulai dengan huruf "o". Bahkan saat bekerja dengan ekspresi reguler dasar kita dapat menggunakan ^ Karakter untuk mencocokkan string kosong di awal baris:



$ grep -i ^o lotr.txt

Seperti yang diharapkan, hasil dari perintahnya adalah:

Satu untuk Tuan Gelap di atas takhta yang gelap satu cincin untuk memerintah mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, 

Itu cukup mudah. Sekarang anggaplah kita ingin lebih membatasi pencarian kita, dan menemukan semua baris dimulai dengan "O" dan diakhiri dengan karakter ",". Kami dapat menggunakan contoh ini untuk memperkenalkan beberapa meta-karakter lain yang dapat kami gunakan dalam mode Regex dasar:

$ grep -i ^o.*, $ lotr.txt

Perintah Linux di atas mengembalikan persis apa yang kami cari:

 Satu cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka,  

Mari kita jelaskan apa yang kami lakukan di atas. Pertama -tama, kami menggunakan -Saya Opsi untuk membuat pencarian case-sensitif kami, seperti yang kami lakukan pada contoh sebelumnya, daripada yang kami gunakan ^ Meta-karakter, diikuti oleh "O", mencari garis yang dimulai dengan surat ini.

Kami daripada menggunakan dua yang baru meta-karakter: . Dan *. Apa peran mereka dalam ekspresi reguler? Itu . cocok dengan karakter tunggal, sedangkan * adalah operator pengulangan, yang cocok dengan elemen sebelumnya nol atau lebih kali. Akhirnya kami menentukan ,, koma, untuk dicocokkan secara harfiah sebagai karakter terakhir sebelum akhir garis, cocok dengan dirinya sendiri oleh $ Meta-karakter.

Mencocokkan satu set karakter dengan tanda kurung persegi

Dalam contoh di atas kami menggunakan titik, ., untuk menentukan pola yang cocok dengan setiap karakter tunggal. Bagaimana jika kita hanya ingin mencocokkan sebagian karakter? Katakanlah, misalnya, kami ingin menemukan semua baris dimulai dengan "o" atau "i": untuk mendapatkan hasil seperti itu, kami dapat melampirkan himpunan karakter yang mungkin dicocokkan dalam tanda kurung persegi:

$ grep -i ^[o, i] lotr.txt

Perintah akan melakukan pencarian case-sensitif untuk "o" atau "i" yang terletak di awal baris. Inilah hasilnya:

Satu untuk Tuan Kegelapan di Tahta Gelapnya di Tanah Mordor di mana bayang -bayang berbaring. Satu cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayangan berbaring. 


Agar pola dicocokkan, karena di atas, setidaknya salah satu karakter yang terkandung dengan kurung harus ditemukan. Saat menentukan karakter di dalam tanda kurung persegi, kami dapat menentukan juga a jangkauan dengan menggunakan - karakter. Jadi, misalnya, untuk mencocokkan angka yang bisa kita tulis [0-9]. Kembali ke teks kami, kami dapat menggunakan sintaks ini untuk mencocokkan garis yang dimulai dengan huruf dari "i" ke "s" (case tidak sensitif):

$ grep -i ^[i -s] lotr.txt

Output perintah:

Tujuh untuk Kata Kurcaci di Aula Batu mereka, sembilan untuk orang-orang fana ditakdirkan untuk mati, satu untuk Tuan Gelap di Tahta Gelap di Tanah Mordor di mana bayang-bayang berbaring. Satu cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayangan berbaring. 

Di atas hampir seluruh teks puisi: hanya baris pertama, yang dimulai dengan huruf "t" (tidak termasuk dalam kisaran yang kami tentukan), telah dikeluarkan dari pertandingan.

Di dalam kurung persegi, kami dapat mencocokkan juga kelas karakter tertentu, menggunakan yang telah ditentukan sebelumnya Ekspresi braket. Beberapa contoh adalah:

  • [: alnum:] - karakter alfanumerik
  • [: digit:] - digit dari 0 hingga 9
  • [: lebih rendah:] - huruf kecil
  • [: Upper:] - huruf besar huruf besar
  • [: blank:] - Spaces and Tabs

Yang di atas bukanlah daftar lengkap, tetapi Anda dapat dengan mudah menemukan lebih banyak contoh ekspresi braket yang berkonsultasi dengan manual grep.

Membalik hasil kecocokan

Dalam contoh -contoh di atas kami mencari setiap baris yang dimulai dengan "o" atau "i", menggunakan pencarian case yang tidak sensitif. Bagaimana jika kita ingin mendapatkan output yang berlawanan, dan hanya menemukan garis tanpa kecocokan?

Grep memungkinkan kami untuk mendapatkan hasil ini menggunakan -v opsi (pendek untuk --Match terbalik). Opsi, seperti yang disarankan, menginstruksikan Grep untuk mengembalikan pertandingan terbalik. Jika kami menjalankan perintah terakhir yang kami gunakan di atas menyediakan opsi ini, kami hanya harus memperoleh baris pertama puisi sebagai output. Mari kita verifikasi:

$ grep -i -v ^[i -s] lotr.txt

Hasilnya, sama seperti yang kami harapkan, hanya baris pertama puisi:

Tiga cincin untuk raja elf di bawah langit,

Dalam contoh kami, kami dapat memperoleh hasil yang sama dengan mengawali daftar karakter antara tanda kurung persegi dengan ^ karakter, yang dalam konteks ini mengasumsikan makna yang berbeda, menyebabkan pola hanya mencocokkan karakter yang tidak terkandung dalam daftar. Jika kita menjalankan:

$ grep -i ^[ ^i -s] lotr.txt

Kami menerima, output yang sama seperti sebelumnya:

Tiga cincin untuk raja elf di bawah langit,

Mode Ekspresi Diperpanjang

Dengan menggunakan Egrep atau grep dengan -E Opsi (yang terakhir adalah cara yang disarankan), kami dapat mengakses meta-karakter lainnya untuk digunakan dalam ekspresi reguler. Mari kita lihat mereka.



Operator pengulangan lanjutan

Kami sudah bertemu * operator pengulangan yang tersedia juga dalam mode ekspresi reguler dasar. Saat menggunakan ekspresi yang diperluas, kami memiliki akses ke operator lain semacam itu:

  • ? - cocok dengan item sebelumnya satu atau nol kali
  • + - cocok dengan elemen sebelumnya satu kali atau lebih

Kami juga dapat menentukan lebih banyak pengulangan granular dengan menggunakan sintaks kawat gigi keriting. Misalnya, pola berikut cocok dengan setiap kemunculan "L" ganda:

grep l 2 lort.txt

Output dari perintah di atas adalah:

Tujuh untuk Kata Kurcaci di aula batu mereka, satu cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, satu cincin untuk membawa semuanya, dan dalam kegelapan mengikat mereka, 

Dengan sintaks yang sama kami dapat menentukan jumlah minimum kejadian, dengan menggunakan X,, atau seluruh rentang yang memungkinkan, menggunakan x, y, Di mana X Dan y mewakili, masing -masing, jumlah pengulangan minimum dan maksimum dari item sebelumnya.

Alternasi

Saat bekerja dengan ekspresi reguler yang diperluas, kami juga memiliki akses ke | meta-karakter, juga disebut inflix operator. Dengan menggunakannya, kami dapat bergabung dengan dua ekspresi reguler, menghasilkan ekspresi yang akan cocok dengan string apa pun yang cocok dengan ekspresi alternatif.

Penting untuk memperhatikan bahwa kedua sisi dari inflix Operator akan selalu berusaha dicocokkan: ini berarti bahwa operator ini tidak berfungsi sebagai kondisional atau operator, di mana sisi kanan dievaluasi hanya jika sisi kiri salah: ini dapat diverifikasi dengan mengamati output dari perintah berikut:

$ grep -n -e '^o | l 2' lotr.txt 2: Tujuh untuk Kurcaci-Kata di Aula Batu mereka, 4: Satu untuk Tuan Kegelapan di Tahta Gelap 6: Satu Cincin untuk menguasai mereka semua, satu cincin untuk menemukan mereka, 7: satu cincin untuk membawa mereka semua, Dan dalam kegelapan mengikat mereka, 

Amati output: Setiap baris dimulai dengan modal "O", atau berisi "L" ganda telah dimasukkan dalam output. Pada garis 6 Dan 7, Namun, kedua ekspresi di sisi kiri dan kanan inflix Operator menghasilkan kecocokan. Ini, seperti yang dinyatakan di atas berarti bahwa kedua sisi operator dievaluasi dan jika keduanya menghasilkan kecocokan, kedua pertandingan disertakan.

Fgrep

Jika, secara default, GREP mendukung operator ekspresi reguler dasar, dan dengan menggunakan -E opsi atau Egrep kita dapat menggunakan ekspresi reguler yang diperluas, dengan -F sakelar (pendek untuk string -fixed) atau fgrep, kita dapat menginstruksikan program untuk selalu menafsirkan pola sebagai daftar string tetap.

Ini berarti bahwa string selalu mencoba dicocokkan secara harfiah, dan semua meta-karakter kehilangan makna khusus mereka. Ini bisa berguna saat beroperasi pada teks atau string yang berisi banyak karakter yang dapat dianggap sebagai operator tanpa harus menghindarinya secara manual.

Menutup pikiran

Dalam tutorial ini kami belajar untuk mengetahui grep perintah unix. Kami melihat bagaimana kami dapat menggunakannya untuk menemukan kecocokan dalam teks dengan menggunakan ekspresi reguler dan kami juga memeriksa perilaku variannya: Egrep Dan fgrep. Kami memeriksa beberapa opsi yang sangat berguna seperti -Saya, yang dapat digunakan untuk melakukan pencarian case-sensitif.

Akhirnya kami melakukan tur beberapa operator ekspresi reguler yang lebih banyak digunakan. GREP secara definitif adalah salah satu alat sistem terpenting dan memiliki dokumentasi yang sangat lengkap: berkonsultasi itu selalu merupakan ide yang bagus!

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Lanjutan regex bash canggih dengan contoh
  • Menguasai loop skrip bash
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Loop bersarang dalam skrip bash
  • Ekspresi reguler Python dengan contoh
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Bash Regexps untuk pemula dengan contoh
  • Tutorial debugging GDB untuk pemula
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 3