Pengenalan kepada Grep dan Ekspresi Biasa

Pengenalan kepada Grep dan Ekspresi Biasa

Objektif

Setelah membaca tutorial ini, anda harus dapat memahami bagaimana perintah grep berfungsi, dan cara menggunakannya dengan ekspresi tetap asas dan lanjutan.

Kesukaran

Mudah

Pengenalan

Grep adalah salah satu alat yang paling berguna yang boleh kita gunakan ketika mentadbir mesin berasaskan Unix: tugasnya adalah mencari corak yang diberikan di dalam satu atau lebih fail dan mengembalikan pertandingan yang ada.

Dalam tutorial ini kita akan melihat cara menggunakannya, dan kami akan mengkaji juga variannya: Egrep dan fgrep. Kami akan meletakkan petikan ini yang sangat terkenal dari buku "The Lord of the Rings" pada fail, dan kami akan menggunakan sebagai sasaran untuk contoh kami:

Tiga cincin untuk elven-raja di bawah langit, tujuh untuk kerdil-dewan di dewan batu mereka, sembilan untuk lelaki fana ditakdirkan mati, satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang-bayang berbaring. Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayang -bayang berbaring. 

Fail akan dipanggil LOTR.txt.

Varian grep

Dalam pengenalan kami bercakap mengenai dua varian grep: Egrep dan fgrep. Varian ini sebenarnya tidak ditetapkan, kerana ia bersamaan dengan berjalan dengan grep dengan -E dan -F pilihan masing -masing. Sebelum kita mula menerangkan apa variasi tersebut berbeza dari yang asal kita mesti memeriksa tingkah laku grep lalai ketika menggunakan ekspresi biasa.

Mod ungkapan biasa asas

Ungkapan biasa adalah corak yang dibina mengikut peraturan khusus untuk memadankan rentetan atau pelbagai rentetan. Secara lalai grep menggunakan apa yang dipanggilnya Bre atau ungkapan biasa asas: Dalam mod ini hanya beberapa meta-akhbar (aksara dengan makna khas dalam ungkapan biasa) tersedia.

Sebagai contoh pertama kita akan cuba menggunakan grep untuk memadankan rentetan yang sangat mudah, perkataan "fana". Sintaks Grep sangat mudah: Kami memanggil program yang menyediakan corak yang dipadankan sebagai hujah pertama, dan fail sasaran sebagai yang kedua:

$ grep fortal lotr.txt


Perintah di atas mengembalikan tiada perlawanan, walaupun perkataan "fana" muncul dalam teks: ini kerana secara lalai grep melakukan carian di kes sensitif mod, jadi, kerana perkataan "fana" dimodalkan, ia tidak sepadan dengan corak yang kami berikan. Untuk mengatasi masalah ini dan melakukan carian yang lebih "generik", kita boleh menggunakan -i pilihan (pendek untuk --abaikan kes, yang menjadikan Grep mengabaikan perbezaan kes:

$ grep -I Mortal Lotr.txt

Kali ini arahan menghasilkan output berikut (perlawanan sebenar diserlahkan dengan warna merah):

Sembilan untuk lelaki fana ditakdirkan untuk mati,

Satu perkara penting untuk diperhatikan, ialah, secara lalai, Grep mengembalikan keseluruhan baris di mana perlawanan dijumpai. Tingkah laku ini, bagaimanapun boleh diubah suai menggunakan -o pilihan, atau versi panjangnya --hanya perlawanan. Apabila menggunakan pilihan ini, hanya perlawanan itu sendiri dicetak:

$ grep -o -i mortal lotr.txt fortal 

Satu lagi suis menarik yang boleh kita gunakan ialah -n, ringkasan untuk --nombor garisan. Apabila pilihan ini digunakan, bilangan baris di mana perlawanan dijumpai dimasukkan ke dalam output grep. Perintah ini:

$ grep -n -i fortal lotr.txt

Menghasilkan output berikut:

3: Sembilan untuk lelaki fana ditakdirkan untuk mati

Di mana 3 adalah bilangan garis di mana perlawanan dijumpai.

Bagaimana jika kita hanya mahu memperoleh bilangan sebenar yang dijumpai, bukannya perlawanan sendiri? Grep mempunyai pilihan khusus untuk mendapatkan hasil ini: -c, atau --hitung. Menggunakan arahan di atas dengan pilihan ini mengembalikan output berikut:

1

Iaitu, seperti yang dijangkakan, bilangan pertandingan yang terdapat dalam teks.

Meta-characters asas

Sudah tiba masanya untuk melakukan carian yang lebih rumit. Kami kini ingin mencari semua baris bermula dengan huruf "O". Walaupun bekerja dengan ungkapan biasa asas kita boleh menggunakannya ^ watak untuk memadankan rentetan kosong pada permulaan baris:



$ grep -i ^o lotr.txt

Seperti yang dijangkakan, hasil arahan adalah:

Satu untuk Tuhan yang gelap di atas takhta gelapnya satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, 

Itu cukup mudah. Sekarang mari kita anggap kita ingin lebih mengehadkan carian kita, dan cari semua baris bermula dengan "O" dan berakhir dengan watak ",". Kita boleh menggunakan contoh ini untuk memperkenalkan beberapa meta-aksara lain yang boleh kita gunakan dalam mod asas Regex:

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

Perintah Linux di atas mengembalikan apa yang kami cari:

 Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka,  

Mari kita jelaskan apa yang kita lakukan di atas. Pertama sekali, kami menggunakan -i pilihan untuk menjadikan kes carian kami tidak sensitif, seperti yang kita lakukan dalam contoh sebelumnya, daripada kami menggunakan ^ meta-watak, diikuti dengan "o", mencari baris bermula dengan surat ini.

Kami daripada menggunakan dua baru meta-characters: . dan *. Apakah peranan mereka dalam ungkapan biasa? The . sepadan dengan watak tunggal, sementara * adalah pengendali pengulangan, yang sepadan dengan elemen sebelumnya sifar atau lebih kali. Akhirnya kami menentukan ,, koma, dipadankan secara literal sebagai watak terakhir sebelum akhir garis, dipadankan dengan dirinya $ meta-watak.

Memadankan satu set aksara dengan kurungan persegi

Dalam contoh di atas kami menggunakan titik, ., Untuk menentukan corak yang sesuai dengan setiap watak. Bagaimana jika kita mahu memadankan hanya subset watak? Katakanlah, sebagai contoh, kami ingin mencari semua baris yang bermula dengan "O" atau "I": Untuk mendapatkan hasil sedemikian, kami dapat memasukkan set aksara yang mungkin dipadankan dalam kurungan persegi:

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

Perintah akan melakukan carian kes-tidak sensitif untuk "o" atau "i" yang terletak pada permulaan garis. Inilah hasilnya:

Satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang -bayang berbaring. Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayang -bayang berbaring. 


Untuk corak yang dipadankan, seperti di atas, sekurang -kurangnya salah satu watak yang terkandung dengan kurungan harus dijumpai. Semasa menentukan watak di dalam kurungan persegi, kita dapat menentukan juga a julat dengan menggunakan - watak. Jadi, sebagai contoh, untuk memadankan digit yang boleh kita tulis [0-9]. Kembali ke teks kami, kami boleh menggunakan sintaks ini untuk memadankan baris bermula dengan huruf dari "i" ke "s" (kes tidak sensitif):

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

Output arahan:

Tujuh untuk orang kerdil di dewan batu mereka, sembilan untuk lelaki fana ditakdirkan untuk mati, satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang-bayang berbaring. Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayang -bayang berbaring. 

Di atas adalah hampir keseluruhan teks puisi: hanya baris pertama, yang bermula dengan huruf "t" (tidak termasuk dalam julat yang kami tentukan), telah dikecualikan dari perlawanan.

Dalam kurungan persegi, kita boleh memadankan juga kelas watak tertentu, menggunakan yang telah ditetapkan Ekspresi kurungan. Beberapa contoh adalah:

  • [: Alnum:] - Watak alfanumerik
  • [: digit:] - digit dari 0 hingga 9
  • [: lebih rendah:] - huruf kecil
  • [: atas:] - huruf besar atas
  • [: kosong:] - Ruang dan Tab

Yang di atas bukan senarai lengkap, tetapi anda dapat dengan mudah mencari lebih banyak contoh ekspresi kurungan yang berunding dengan manual grep.

Membalikkan hasil pertandingan

Dalam contoh di atas, kami mencari setiap baris bermula dengan "O" atau "I", menggunakan carian tidak sensitif kes. Bagaimana jika kita mahu mendapatkan output yang bertentangan, dan sebagainya hanya mencari baris tanpa perlawanan?

Grep membenarkan kami mendapatkan hasil ini menggunakan -v pilihan (pendek untuk --Pertandingan terbalik). Pilihan, seperti yang dicadangkan, mengarahkan Grep untuk mengembalikan perlawanan terbalik. Sekiranya kita menjalankan arahan terakhir yang kita gunakan di atas menyediakan pilihan ini, kita hanya harus memperoleh baris pertama puisi sebagai output. Mari sahkan:

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

Hasilnya, seperti yang kita harapkan, hanya baris pertama puisi:

Tiga Cincin untuk Elven-Kings Di Bawah Langit,

Dalam contoh kita, kita dapat memperoleh hasil yang sama dengan mengutamakan senarai aksara antara kurungan persegi dengan ^ watak, yang dalam konteks ini menganggap makna yang berbeza, menyebabkan corak hanya sesuai dengan watak yang tidak terkandung dalam senarai. Sekiranya kita berlari:

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

Kami menerima, output yang sama seperti dahulu:

Tiga Cincin untuk Elven-Kings Di Bawah Langit,

Mod ekspresi lanjutan

Dengan menggunakan Egrep atau grep dengan -E pilihan (yang terakhir adalah cara yang disyorkan), kita boleh mengakses meta-aksara lain yang akan digunakan dalam ekspresi biasa. Mari lihat mereka.



Pengulangan pengulangan lanjutan

Kami sudah bertemu * pengendali pengulangan yang juga tersedia dalam mod ungkapan biasa asas. Apabila menggunakan ungkapan lanjutan, kami mempunyai akses kepada pengendali lain seperti itu:

  • ? - sepadan dengan item sebelum ini satu atau sifar kali
  • + - sepadan dengan elemen sebelumnya satu atau lebih kali

Kami juga boleh menentukan lebih banyak pengulangan berbutir dengan menggunakan sintaks pendakap keriting. Sebagai contoh, corak berikut sepadan dengan setiap kejadian "L":

grep l 2 lort.txt

Output arahan di atas adalah:

Tujuh untuk orang kerdil di dewan batu mereka, satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, 

Dengan sintaks yang sama kita dapat menentukan bilangan minimum kejadian, dengan menggunakan x,, atau julat yang mungkin, menggunakan x, y, di mana x dan y mewakili, masing -masing, minimum dan bilangan maksimum pengulangan item sebelumnya.

Penggantian

Semasa bekerja dengan ekspresi biasa yang dilanjutkan, kami juga mempunyai akses ke | meta-watak, juga dipanggil inflix pengendali. Dengan menggunakannya, kita boleh menyertai dua ungkapan biasa, menghasilkan ungkapan yang akan sepadan dengan mana -mana rentetan yang sepadan sama ada Ekspresi Alternatif.

Penting untuk melihat bahawa kedua -dua belah pihak inflix pengendali akan sentiasa cuba dipadankan: ini bermakna pengendali ini tidak berfungsi sebagai bersyarat atau Operator, di mana sebelah kanan dinilai hanya jika sebelah kiri palsu: ini boleh disahkan dengan memerhatikan output perintah berikut:

$ grep -n -e '^o | l 2' lotr.TXT 2: Tujuh untuk Dwarf-Lords di Dewan Batu mereka, 4: Satu untuk Tuhan Gelap di atas takhta gelapnya 6: Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, 7: satu cincin untuk membawa mereka semua, Dan dalam kegelapan mengikat mereka, 

Perhatikan output: Setiap baris bermula dengan modal "O", atau mengandungi "L" ganda telah dimasukkan ke dalam output. Pada baris 6 dan 7, Walau bagaimanapun, kedua -dua ungkapan di sebelah kiri dan kanan inflix Pengendali menghasilkan perlawanan. Ini, seperti yang dinyatakan di atas bermakna kedua -dua belah pengendali dinilai dan jika kedua -duanya menghasilkan perlawanan, kedua -dua perlawanan dimasukkan.

Fgrep

Jika, secara lalai, GREP menyokong pengendali ekspresi asas asas, dan dengan menggunakan -E pilihan atau Egrep kita boleh menggunakan ungkapan biasa yang dilanjutkan, dengan -F Tukar (pendek untuk -bentuk -rentetan) atau fgrep, Kami boleh mengarahkan program untuk sentiasa mentafsir corak sebagai senarai rentetan tetap.

Ini bermakna bahawa rentetan selalu cuba dipadankan secara literal, dan semua meta-karaknya kehilangan makna istimewa mereka. Ini berguna apabila beroperasi pada teks atau rentetan yang mengandungi banyak aksara yang mungkin dianggap sebagai pengendali tanpa perlu melepaskannya secara manual.

Pemikiran penutupan

Dalam tutorial ini, kami belajar mengetahui grep perintah unix. Kami melihat bagaimana kita boleh menggunakannya untuk mencari perlawanan dalam teks dengan menggunakan ungkapan biasa dan kami juga mengkaji tingkah laku variannya: Egrep dan fgrep. Kami memeriksa beberapa pilihan yang sangat berguna seperti -i, yang boleh digunakan untuk membuat carian kes tidak sensitif.

Akhirnya kami melawat beberapa pengendali ekspresi biasa yang lebih banyak digunakan. Grep adalah salah satu alat sistem yang paling penting dan mempunyai dokumentasi yang sangat lengkap: Perundingan itu selalu menjadi idea yang baik!

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Advanced Bash Regex dengan contoh
  • Menguasai Gelung Skrip Bash
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Gelung bersarang dalam skrip bash
  • Ungkapan biasa python dengan contoh
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Bash regexps untuk pemula dengan contoh
  • Tutorial Debugging GDB untuk Pemula
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 3