Menggunakan ekspresi reguler di AWK

Menggunakan ekspresi reguler di AWK

Ekspresi reguler adalah alat yang ampuh untuk pemrosesan teks di AWK. Mereka memungkinkan Anda untuk mencari pola dalam file teks dan memanipulasi data berdasarkan pola tersebut. Dalam artikel ini, kami akan mengeksplorasi cara menggunakan ekspresi reguler dalam AWK dengan contoh.

Dasar Ekspresi Reguler

Ekspresi reguler adalah pola yang cocok dengan serangkaian karakter tertentu. Tabel berikut mencantumkan beberapa metacharacters ekspresi reguler dasar yang dapat Anda gunakan di AWK:

MetacharacterKeterangan
.Cocok dengan karakter tunggal
[]Cocok dengan karakter apa pun dalam tanda kurung
^Cocok dengan awal garis
$Cocok dengan akhir garis
*Cocok dengan nol atau lebih kejadian karakter sebelumnya
+Cocok dengan satu atau lebih kejadian dari karakter sebelumnya
?Cocok dengan nol atau satu kemunculan karakter sebelumnya

AWK menyediakan dua fungsi bawaan untuk menggunakan ekspresi reguler: cocok() Dan sub(). Itu cocok() Fungsi digunakan untuk menemukan kemunculan pertama dari ekspresi reguler dalam string, dan sub() digunakan untuk menggantikan kejadian pertama dari ekspresi reguler dalam string. Berikut beberapa contoh:

Contoh 1: Mencocokkan ekspresi reguler

Katakanlah kami memiliki file yang berisi daftar alamat email, dan kami ingin menemukan semua alamat email yang diakhiri dengan “.com ". Kita bisa menggunakan cocok() Fungsi untuk menyelesaikan tugas ini sebagai berikut:

AWK 'if (match ($ 0, /\.com $/)) print $ 0 'Email.txt
12345AWK 'if (match ($ 0, /\.com $/)) print $ 0 'Email.txt

Di sini, kami menggunakan cocok() berfungsi untuk mencari ekspresi reguler /.com $/ (yang cocok dengan string apa pun yang diakhiri dengan ".com ”) di setiap baris file. Jika kecocokan ditemukan, kami mencetak garis.

Contoh 2: Mengganti ekspresi reguler

Katakanlah kami memiliki file yang berisi daftar nomor telepon, dan kami ingin mengganti semua contoh "555" dengan "666". Kita bisa menggunakan sub() Fungsi untuk menyelesaikan tugas ini sebagai berikut:

AWK 'Sub (/555/, "666", $ 0) Cetak $ 0' Telepon.txt
1234AWK 'Sub (/555/, "666", $ 0) Cetak $ 0' Telepon.txt

Di sini, kami menggunakan sub() berfungsi untuk mencari ekspresi reguler /555/ (yang cocok dengan string apa pun yang berisi "555") di setiap baris file, dan menggantinya dengan "666". Kami kemudian mencetak garis yang dimodifikasi.

Teknik ekspresi reguler canggih

Selain metacharacters ekspresi reguler dasar, AWK mendukung beberapa teknik ekspresi reguler canggih yang dapat membantu Anda menyelesaikan tugas pemrosesan teks yang lebih kompleks. Ini termasuk:

1. Pengelompokan:

Anda dapat mengelompokkan bagian dari ekspresi reguler bersama -sama menggunakan tanda kurung. Ini memungkinkan Anda untuk menerapkan kuantifikasi ke grup secara keseluruhan, atau untuk mengekstrak bagian tertentu dari string yang cocok.

Katakanlah kami memiliki file yang berisi daftar nama dan gaji karyawan, dan kami ingin mengekstrak nama dan gaji secara terpisah. Kami dapat menggunakan pengelompokan untuk menyelesaikan tugas ini sebagai berikut:

awk 'if (cocok ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) gaji = substr ($ 0, rstart+panjang (nama) +1 , panjang ($ 0) -rstart-length (name)) cetak nama cetak gaji 'karyawan.txt
12345678awk 'if (cocok ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) gaji = substr ($ 0, rstart+panjang (nama) +1 , panjang ($ 0) -rstart-length (name)) cetak nama cetak gaji 'karyawan.txt

Di sini, kami menggunakan pengelompokan untuk mencocokkan ekspresi reguler /^(\ w+) \ s+(\ d+) $ / (yang cocok dengan garis yang berisi satu atau lebih karakter kata diikuti oleh satu atau lebih karakter whitespace, diikuti oleh satu atau lebih digit) dan mengekstrak nama dan gaji secara terpisah.

2. Backreferences:

Anda dapat menggunakan backreferences (i.e., \ 1, \ 2, dll.) untuk merujuk bagian dari ekspresi reguler yang cocok dengan kelompok. Ini memungkinkan Anda untuk menggunakan kembali substring yang cocok di string pengganti.

Katakanlah kami memiliki file yang berisi daftar nomor telepon dalam format (xxx) xxx-xxxx, dan kami ingin mengubah format ke xxx-xxx-xxxx. Kita dapat menggunakan referensi keunggulan untuk menyelesaikan tugas ini sebagai berikut:

awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Cetak $ 0 'Telepon.txt
1234awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Cetak $ 0 'Telepon.txt

Di sini, kami menggunakan backreferences (i.e., \ 1, \ 2, dan \ 3) untuk merujuk pada tiga kelompok digit yang cocok dengan ekspresi reguler “/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (yang cocok dengan nomor telepon dalam format (xxx) xxx-xxxx) dan ganti format dengan xxx-xxx-xxxx.

3. Lookahead dan lookbehind:

Anda dapat menggunakan lookahead (?=) dan lookbehind (?<=) untuk mencocokkan pola hanya jika mereka diikuti oleh atau didahului oleh pola lain, masing -masing.

Katakanlah kami memiliki file yang berisi daftar URL, dan kami hanya ingin mengekstrak nama domain (i.e., teks antara “Http: //” dan berikutnya "/" karakter). Kita dapat menggunakan lookahead dan lookbehind untuk menyelesaikan tugas ini sebagai berikut:

AWK 'if (match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt
12345AWK 'if (match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt

Di sini, kami menggunakan lookahead (?<=) untuk mencocokkan ekspresi reguler “/(?<=http://)[^/]+/" (yang cocok dengan karakter apa pun yang datang setelahnya “Http: //” Dan sebelum berikutnya "/" karakter) dan ekstrak nama domain.

4. Kelas karakter yang dinegasikan:

Katakanlah kami memiliki file yang berisi daftar alamat email, dan kami hanya ingin mengekstrak alamat yang termasuk dalam domain tertentu (e.G., contoh.com). Kita dapat menggunakan kelas karakter yang dinegasikan untuk menyelesaikan tugas ini sebagai berikut:

awk 'if (cocok ($ 0, /^[^@]+@contoh \.com $/)) print $ 0 'Email.txt
12345awk 'if (cocok ($ 0, /^[^@]+@contoh \.com $/)) print $ 0 'Email.txt

Di sini, kami menggunakan kelas karakter yang dinegasikan ([^@]+) untuk mencocokkan karakter apa pun yang tidak “@” dan mengekstrak nama pengguna, dan kemudian mencocokkan string literal "@contoh.com " untuk memastikan bahwa alamat tersebut milik domain yang ditentukan.

5. Alternasi:

Katakanlah kami memiliki file yang berisi daftar nomor telepon, dan kami hanya ingin mengekstrak nomor yang ada dalam format "(xxx) xxx-xxxx" atau "xxx-xxx-xxxx". Kita dapat menggunakan pergantian untuk menyelesaikan tugas ini sebagai berikut:

awk 'if (cocok ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) print substr ($ 0, rstart, rlength) 'ponsel.txt
12345awk 'if (cocok ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) print substr ($ 0, rstart, rlength) 'ponsel.txt

Di sini, kami menggunakan pergantian (|) untuk mencocokkan ekspresi reguler “/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (yang cocok dengan nomor telepon dalam format (xxx) xxx-xxxx) atau ekspresi reguler “/(\ D 3)-(\ d 3)-(\ d 4)/” (yang cocok dengan nomor telepon dalam format xxx-xxx-xxxx).

Kesimpulan

Ekspresi reguler adalah alat yang ampuh untuk pemrosesan teks di AWK. Mereka memungkinkan Anda untuk mencari pola dalam file teks, dan memanipulasi data berdasarkan pola tersebut. Dengan menguasai ekspresi reguler di AWK, Anda dapat menjadi lebih efektif dan efisien dalam tugas pemrosesan teks Anda, dan menyelesaikan manipulasi data yang kompleks dengan mudah.