Menggunakan ekspresi biasa dalam Awk

Menggunakan ekspresi biasa dalam Awk

Ekspresi biasa adalah alat yang berkuasa untuk pemprosesan teks dengan AWK. Mereka membolehkan anda mencari corak dalam fail teks dan memanipulasi data berdasarkan corak tersebut. Dalam artikel ini, kami akan meneroka cara menggunakan ekspresi biasa dengan AWK dengan contoh.

Asas ungkapan biasa

Ekspresi biasa adalah corak yang sesuai dengan set watak tertentu. Jadual berikut menyenaraikan beberapa metacharacters ekspresi asas asas yang boleh anda gunakan dalam AWK:

MetacharacterPenerangan
.Memadankan watak tunggal
[]Memadankan watak dalam kurungan
^Sepadan dengan permulaan garis
$Sepadan dengan akhir garis
*Memadankan sifar atau lebih banyak kejadian watak sebelumnya
+Memadankan satu atau lebih kejadian watak sebelumnya
?Sepadan dengan sifar atau satu kejadian watak sebelumnya

AWK menyediakan dua fungsi terbina dalam untuk menggunakan ungkapan biasa: perlawanan () dan sub (). The perlawanan () fungsi digunakan untuk mencari kejadian pertama ungkapan biasa dalam rentetan, dan sub () digunakan untuk menggantikan kejadian pertama ungkapan biasa dalam rentetan. Berikut adalah beberapa contoh:

Contoh 1: Memadankan ungkapan biasa

Katakan kami mempunyai fail yang mengandungi senarai alamat e -mel, dan kami ingin mencari semua alamat e -mel yang berakhir dengan ".com "". Kita boleh menggunakan perlawanan () berfungsi untuk mencapai tugas ini seperti berikut:

awk 'if (match ($ 0, /\.com $/)) cetak $ 0 'e -mel.txt
12345awk 'if (match ($ 0, /\.com $/)) cetak $ 0 'e -mel.txt

Di sini, kami menggunakan perlawanan () berfungsi untuk mencari ungkapan biasa /.com $/ (yang sepadan dengan rentetan yang berakhir dengan ".com ") dalam setiap baris fail. Sekiranya perlawanan dijumpai, kami mencetak garis.

Contoh 2: Menggantikan ungkapan biasa

Katakan kami mempunyai fail yang mengandungi senarai nombor telefon, dan kami mahu menggantikan semua contoh "555" dengan "666". Kita boleh menggunakan sub () berfungsi untuk mencapai tugas ini seperti berikut:

awk 'sub (/555/, "666", $ 0) Cetak $ 0' Telefon.txt
1234awk 'sub (/555/, "666", $ 0) Cetak $ 0' Telefon.txt

Di sini, kami menggunakan sub () berfungsi untuk mencari ungkapan biasa /555/ (yang sepadan dengan rentetan yang mengandungi "555") dalam setiap baris fail, dan menggantinya "666". Kami kemudian mencetak garis yang diubah suai.

Teknik Ekspresi Biasa Lanjutan

Sebagai tambahan kepada metacharacters ekspresi asas asas, AWK menyokong beberapa teknik ekspresi biasa yang boleh membantu anda menyelesaikan tugas pemprosesan teks yang lebih kompleks. Ini termasuk:

1. Pengumpulan:

Anda boleh mengumpulkan bahagian -bahagian ungkapan biasa bersama -sama menggunakan tanda kurung. Ini membolehkan anda memohon kuantifier kepada kumpulan secara keseluruhan, atau untuk mengekstrak bahagian tertentu rentetan yang dipadankan.

Katakan kami mempunyai fail yang mengandungi senarai nama dan gaji pekerja, dan kami ingin mengeluarkan nama dan gaji secara berasingan. Kita boleh menggunakan kumpulan untuk menyelesaikan tugas ini seperti berikut:

awk 'if (match ($ 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 'Pekerja.txt
12345678awk 'if (match ($ 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 'Pekerja.txt

Di sini, kami menggunakan kumpulan untuk memadankan ungkapan biasa / (\ w+) \ s+(\ d+) $ / (yang sepadan dengan garis yang mengandungi satu atau lebih aksara perkataan diikuti oleh satu atau lebih aksara ruang putih, diikuti oleh satu atau lebih digit) dan mengeluarkan nama dan gaji secara berasingan.

2. Backreferences:

Anda boleh menggunakan backReferences (i.e., \ 1, \ 2, dll.) untuk merujuk kepada bahagian ungkapan biasa yang dipadankan oleh kumpulan. Ini membolehkan anda menggunakan semula substring yang dipadankan dalam rentetan penggantian.

Katakan kami mempunyai fail yang mengandungi senarai nombor telefon dalam format (xxx) xxx-xxxx, dan kami ingin menukar format ke xxx-xxx-xxxx. Kita boleh menggunakan backreferences untuk mencapai tugas ini seperti berikut:

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

Di sini, kami menggunakan backReferences (i.e., \ 1, \ 2, dan \ 3) untuk merujuk kepada tiga kumpulan digit yang dipadankan dengan ungkapan biasa "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (yang sepadan dengan nombor telefon dalam format (xxx) xxx-xxxx) dan ganti format dengan xxx-xxx-xxxx.

3. Lookahead dan mencari:

Anda boleh menggunakan lookahead (?=) dan mencari (?<=) untuk memadankan corak hanya jika mereka diikuti oleh atau didahului oleh corak lain, masing -masing.

Katakan kami mempunyai fail yang mengandungi senarai URL, dan kami hanya mahu mengeluarkan nama domain (i.e., teks antara "Http: //" dan seterusnya "/" watak). Kita boleh menggunakan Lookahead dan Lookbehind untuk menyelesaikan tugas ini seperti 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 memadankan ungkapan biasa "/(?<=http://)[^/]+/" (yang sepadan dengan mana -mana watak yang akan datang "Http: //" Dan sebelum yang seterusnya "/" watak) dan ekstrak nama domain.

4. Kelas watak yang ditolak:

Katakan kami mempunyai fail yang mengandungi senarai alamat e -mel, dan kami hanya mahu mengeluarkan alamat yang dimiliki oleh domain tertentu (e.g., Contoh.com). Kita boleh menggunakan kelas watak yang ditolak untuk menyelesaikan tugas ini seperti berikut:

awk 'if (match ($ 0, /^[^@]+@contoh \.com $/)) cetak $ 0 'e -mel.txt
12345awk 'if (match ($ 0, /^[^@]+@contoh \.com $/)) cetak $ 0 'e -mel.txt

Di sini, kami menggunakan kelas watak yang ditolak ([^@]+) untuk memadankan mana -mana watak yang tidak "@" dan ekstrak nama pengguna, dan kemudian sepadan dengan rentetan literal "@Example.com "" untuk memastikan bahawa alamat itu milik domain yang ditentukan.

5. Penggantian:

Katakan kami mempunyai fail yang mengandungi senarai nombor telefon, dan kami hanya mahu mengeluarkan nombor yang sama ada dalam format "(xxx) xxx-xxxx" atau "xxx-xxx-xxxx". Kita boleh menggunakan penggantian untuk menyelesaikan tugas ini seperti berikut:

awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) cetak substr ($ 0, rstart, rlength) 'telefon.txt
12345awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) cetak substr ($ 0, rstart, rlength) 'telefon.txt

Di sini, kami menggunakan penggantian (|) untuk dipadankan sama ada ungkapan biasa "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (yang sepadan dengan nombor telefon dalam format (xxx) xxx-xxxx) atau ungkapan biasa "/(\ D 3)-(\ d 3)-(\ d 4)/" (yang sepadan dengan nombor telefon dalam format xxx-xxx-xxxx).

Kesimpulan

Ekspresi biasa adalah alat yang berkuasa untuk pemprosesan teks dengan AWK. Mereka membolehkan anda mencari corak dalam fail teks, dan memanipulasi data berdasarkan corak tersebut. Dengan menguasai ekspresi biasa dalam AWK, anda boleh menjadi lebih berkesan dan efisien dalam tugas pemprosesan teks anda, dan mencapai manipulasi data yang kompleks dengan mudah.