Menggunakan ekspresi reguler di AWK
- 3136
- 729
- Enrique Purdy
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:
Metacharacter | Keterangan |
---|---|
. | 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:
12345 | AWK '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:
1234 | AWK '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.txt12345678 | 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 |
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.txt1234 | awk '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.txt12345 | AWK '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.txt12345 | awk '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.txt12345 | awk '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.