GNU/Linux >> Belajar Linux >  >> Linux

Contoh tutorial Regex untuk Linux (Sed &AWK)

Agar berhasil bekerja dengan editor sed Linux dan perintah awk di skrip shell Anda, Anda harus memahami ekspresi reguler atau singkatnya regex. Karena ada banyak mesin untuk regex, kami akan menggunakan shell regex dan melihat kekuatan bash dalam bekerja dengan regex.

Pertama, kita perlu memahami apa itu regex; maka kita akan melihat cara menggunakannya.

Apa itu regex

Bagi sebagian orang, ketika mereka melihat ekspresi reguler untuk pertama kalinya, mereka mengatakan apa itu ASCII pukes !!

Nah, ekspresi reguler atau regex, secara umum, adalah pola teks yang Anda definisikan yang digunakan oleh program Linux seperti sed atau awk untuk memfilter teks.

Kami melihat beberapa pola tersebut saat memperkenalkan perintah dasar Linux dan melihat bagaimana perintah ls menggunakan karakter karakter pengganti untuk memfilter keluaran.

Jenis ekspresi reguler

Banyak aplikasi yang berbeda menggunakan berbagai jenis regex di Linux, seperti regex yang disertakan dalam bahasa pemrograman (Java, Perl, Python,) dan program Linux seperti (sed, awk, grep,) dan banyak aplikasi lainnya.

Pola regex menggunakan mesin ekspresi reguler yang menerjemahkan pola tersebut.

Linux memiliki dua mesin ekspresi reguler:

  • Ekspresi Reguler Dasar (BRE) mesin.
  • Extended Regular Expression (ERE) mesin.

Sebagian besar program Linux bekerja dengan baik dengan spesifikasi mesin BRE, tetapi beberapa alat seperti sed memahami beberapa aturan mesin BRE.

Mesin POSIX ERE hadir dengan beberapa bahasa pemrograman. Ini memberikan lebih banyak pola, seperti mencocokkan angka dan kata. Perintah awk menggunakan mesin ERE untuk memproses pola ekspresi regulernya.

Karena ada banyak implementasi regex, sulit untuk menulis pola yang berfungsi di semua mesin. Oleh karena itu, kami akan fokus pada regex yang paling umum ditemukan dan mendemonstrasikan cara menggunakannya di sed dan awk.

Tentukan Pola BRE

Anda dapat menentukan pola untuk mencocokkan teks seperti ini:

$ echo "Testing regex using sed" | sed -n '/regex/p'
$ echo "Testing regex using awk" | awk '/regex/{print $0}'

Anda mungkin memperhatikan bahwa ekspresi reguler tidak peduli di mana pola muncul atau berapa kali dalam aliran data.

Aturan pertama yang harus diketahui adalah bahwa pola ekspresi reguler peka terhadap huruf besar/kecil.

$ echo "Welcome to LikeGeeks" | awk '/Geeks/{print $0}'
$ echo "Welcome to Likegeeks" | awk '/Geeks/{print $0}'

Regex pertama berhasil karena kata "Geeks" ada dalam huruf besar, sedangkan baris kedua gagal karena menggunakan huruf kecil.

Anda dapat menggunakan spasi atau angka dalam pola Anda seperti ini:

$ echo "Testing regex 2 again" | awk '/regex 2/{print $0}'

Karakter khusus

pola regex menggunakan beberapa karakter khusus. Dan Anda tidak dapat memasukkannya ke dalam pola Anda, dan jika Anda melakukannya, Anda tidak akan mendapatkan hasil yang diharapkan.

Karakter khusus ini dikenali oleh regex:

.*[]^${}\+?|()

Anda harus keluar dari karakter khusus ini menggunakan karakter garis miring terbalik (\).

Misalnya, jika Anda ingin mencocokkan tanda dolar ($), hindari dengan karakter garis miring terbalik seperti ini:

$ cat myfile

There is 10$ on my pocket
$ awk '/\$/{print $0}' myfile

Jika Anda perlu mencocokkan garis miring terbalik (\) itu sendiri, Anda harus menghindarinya seperti ini:

$ echo "\ is a special character" | awk '/\\/{print $0}'

Meskipun garis miring ke depan bukan karakter khusus, Anda masih mendapatkan kesalahan jika menggunakannya secara langsung.

$ echo "3 / 2" | awk '///{print $0}'

Jadi Anda harus menghindarinya seperti ini:

$ echo "3 / 2" | awk '/\//{print $0}'

Karakter jangkar

Untuk menemukan awal baris dalam teks, gunakan karakter tanda sisipan (^).

Anda dapat menggunakannya seperti ini:

$ echo "welcome to likegeeks website" | awk '/^likegeeks/{print $0}'
$ echo "likegeeks website" | awk '/^likegeeks/{print $0}'

Karakter tanda sisipan (^) cocok dengan awal teks:

$ awk '/^this/{print $0}' myfile

Bagaimana jika Anda menggunakannya di tengah teks?

$ echo "This ^ caret is printed as it is" | sed -n '/s ^/p'

Itu dicetak seperti karakter biasa.

Saat menggunakan awk, Anda harus menghindarinya seperti ini:

$ echo "This ^ is a test" | awk '/s \^/{print $0}'

Ini tentang melihat bagian awal teks, bagaimana dengan melihat bagian akhir?

Tanda dolar ($) memeriksa akhir baris:

$ echo "Testing regex again" | awk '/again$/{print $0}'

Anda dapat menggunakan tanda sisipan dan dolar pada baris yang sama seperti ini:

$ cat myfile
this is a test
This is another test
And this is one more
$ awk '/^this is a test$/{print $0}' myfile

Seperti yang Anda lihat, ia hanya mencetak garis yang memiliki pola yang cocok saja.

Anda dapat memfilter baris kosong dengan pola berikut:

$ awk '!/^$/{print $0}' myfile

Di sini kami memperkenalkan negasi yang dapat Anda lakukan dengan tanda seru !

Pola mencari baris kosong di mana tidak ada antara awal dan akhir baris dan meniadakan bahwa untuk mencetak hanya baris yang memiliki teks.

Karakter titik

Kami menggunakan karakter titik untuk mencocokkan karakter apa pun kecuali baris baru (\n).

Lihat contoh berikut untuk mendapatkan idenya:

$ cat myfile
this is a test
This is another test
And this is one more
start with this
$ awk '/.st/{print $0}' myfile

Anda dapat melihat dari hasil bahwa ia hanya mencetak dua baris pertama karena mengandung pola st sedangkan baris ketiga tidak memiliki pola itu, dan baris keempat dimulai dengan st, sehingga juga tidak cocok dengan pola kita.

Kelas karakter

Anda dapat mencocokkan karakter apa pun dengan karakter khusus titik, tetapi bagaimana jika Anda hanya mencocokkan satu set karakter, Anda dapat menggunakan kelas karakter.

Kelas karakter cocok dengan sekumpulan karakter jika ada yang ditemukan, polanya cocok.

Kita dapat mendefinisikan kelas karakter menggunakan tanda kurung siku [] seperti ini:

$ awk '/[oi]th/{print $0}' myfile

Di sini kami mencari karakter apa pun yang memiliki karakter o atau i sebelumnya.

Ini berguna saat Anda mencari kata yang mungkin berisi huruf besar atau kecil, dan Anda tidak yakin tentang itu.

$ echo "testing regex" | awk '/[Tt]esting regex/{print $0}'
$ echo "Testing regex" | awk '/[Tt]esting regex/{print $0}'

Tentu saja, ini tidak terbatas pada karakter; Anda dapat menggunakan angka atau apa pun yang Anda inginkan. Anda dapat menggunakannya sesuka Anda selama Anda memiliki ide.

Meniadakan kelas karakter

Bagaimana dengan mencari karakter yang tidak ada di kelas karakter?

Untuk mencapai itu, awali rentang kelas karakter dengan tanda sisipan seperti ini:

$ awk '/[^oi]th/{print $0}' myfile

Jadi apapun bisa diterima kecuali o dan i.

Menggunakan rentang

Untuk menentukan rentang karakter, Anda dapat menggunakan simbol (-) seperti ini:

$ awk '/[e-p]st/{print $0}' myfile

Ini cocok dengan semua karakter antara e dan p kemudian diikuti oleh st seperti yang ditunjukkan.

Anda juga dapat menggunakan rentang untuk angka:

$ echo "123" | awk '/[0-9][0-9][0-9]/'
$ echo "12a" | awk '/[0-9][0-9][0-9]/'

Anda dapat menggunakan beberapa rentang dan terpisah seperti ini:

$ awk '/[a-fm-z]st/{print $0}' myfile

Pola di sini berarti dari a sampai f, dan m sampai z harus muncul sebelum teks pertama.

Kelas karakter khusus

Daftar berikut termasuk kelas karakter khusus yang dapat Anda gunakan:

[[:alpha:]] Pola untuk karakter alfabet apa pun, baik huruf besar maupun kecil.
[[:alnum:]] Pola untuk  0–9, A–Z, atau a–z.
[[:blank:]] Pola untuk spasi atau Tab saja.
[[:digit:]] Pola untuk 0 hingga 9.
[[:bawah:]] Pola untuk huruf kecil a–z saja.
[[:print:]] Pola untuk setiap karakter yang dapat dicetak.
[[:punct:]] Pola untuk karakter tanda baca apa pun.
[[:spasi:]] Pola untuk karakter spasi putih apa pun:spasi, Tab, NL, FF, VT, CR.
[[:upper:]] Pola untuk huruf besar A–Z saja.

Anda dapat menggunakannya seperti ini:

$ echo "abc" | awk '/[[:alpha:]]/{print $0}'
$ echo "abc" | awk '/[[:digit:]]/{print $0}'
$ echo "abc123" | awk '/[[:digit:]]/{print $0}'

Tanda bintang

Tanda bintang berarti karakter harus ada nol kali atau lebih.

$ echo "test" | awk '/tes*t/{print $0}'
$ echo "tessst" | awk '/tes*t/{print $0}'

Simbol pola ini berguna untuk memeriksa kesalahan ejaan atau variasi bahasa.

$ echo "I like green color" | awk '/colou*r/{print $0}'
$ echo "I like green color" | awk '/colou*r/{print $0}'

Di sini, dalam contoh ini, apakah Anda mengetiknya warna atau warna itu akan cocok, karena tanda bintang berarti jika karakter "u" ada berkali-kali atau nol waktu yang akan cocok.

Untuk mencocokkan sejumlah karakter apa pun, Anda dapat menggunakan titik dengan tanda bintang seperti ini:

$ awk '/this.*test/{print $0}' myfile

Tidak peduli berapa banyak kata di antara kata "ini" dan "ujian", baris mana pun yang cocok, akan dicetak.

Anda dapat menggunakan karakter asterisk dengan kelas karakter.

$ echo "st" | awk '/s[ae]*t/{print $0}'
$ echo "sat" | awk '/s[ae]*t/{print $0}'
$ echo "set" | awk '/s[ae]*t/{print $0}'

Ketiga contoh cocok karena tanda bintang berarti jika Anda menemukan nol kali atau lebih karakter “a” atau “e”, cetaklah.

Ekspresi reguler yang diperluas

Berikut ini adalah beberapa pola yang dimiliki oleh Posix ERE:

Tanda tanya

Tanda tanya berarti karakter sebelumnya bisa ada sekali atau tidak sama sekali.

$ echo "tet" | awk '/tes?t/{print $0}'
$ echo "test" | awk '/tes?t/{print $0}'
$ echo "test" | awk '/tes?t/{print $0}'

Kita dapat menggunakan tanda tanya dalam kombinasi dengan kelas karakter:

$ echo "tst" | awk '/t[ae]?st/{print $0}'
$ echo "test" | awk '/t[ae]?st/{print $0}'
$ echo "tast" | awk '/t[ae]?st/{print $0}'
$ echo "taest" | awk '/t[ae]?st/{print $0}'
$ echo "test" | awk '/t[ae]?st/{print $0}'

Jika salah satu item kelas karakter ada, pencocokan pola akan lolos. Jika tidak, polanya akan gagal.

Tanda plus

Tanda plus berarti bahwa karakter sebelum tanda plus harus ada satu kali atau lebih, tetapi harus ada setidaknya satu kali.

$ echo "test" | awk '/te+st/{print $0}'
$ echo "test" | awk '/te+st/{print $0}'
$ echo "tst" | awk '/te+st/{print $0}'

Jika karakter "e" tidak ditemukan, itu gagal.

Anda dapat menggunakannya dengan kelas karakter seperti ini:

$ echo "tst" | awk '/t[ae]+st/{print $0}'
$ echo "test" | awk '/t[ae]+st/{print $0}'
$ echo "teast" | awk '/t[ae]+st/{print $0}'
$ echo "teeast" | awk '/t[ae]+st/{print $0}'

jika ada karakter dari kelas karakter, itu berhasil.

Kurung kurawal

Kurung kurawal memungkinkan Anda menentukan jumlah keberadaan suatu pola, pola ini memiliki dua format:

n:Regex muncul tepat n kali.

n,m:Ekspresi reguler muncul setidaknya n kali, tetapi tidak lebih dari m kali.

$ echo "tst" | awk '/te{1}st/{print $0}'
$ echo "test" | awk '/te{1}st/{print $0}'

Di awk versi lama, Anda harus menggunakan opsi –re-interval untuk perintah awk agar membaca kurung kurawal, tetapi di versi yang lebih baru, Anda tidak memerlukannya.

$ echo "tst" | awk '/te{1,2}st/{print $0}'
$ echo "test" | awk '/te{1,2}st/{print $0}'
$ echo "test" | awk '/te{1,2}st/{print $0}'
$ echo "teeest" | awk '/te{1,2}st/{print $0}'

Dalam contoh ini, jika karakter "e" ada satu atau dua kali, itu berhasil; jika tidak, gagal.

Anda dapat menggunakannya dengan kelas karakter seperti ini:

$ echo "tst" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "test" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "test" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "teeast" | awk  '/t[ae]{1,2}st/{print $0}'

Jika ada satu atau dua contoh huruf "a" atau "e", polanya lolos; jika tidak, gagal.

Simbol pipa

Simbol pipa membuat OR logis antara 2 pola. Jika salah satu pola ada, itu berhasil; jika tidak, gagal, ini contohnya:

$ echo "Testing regex" | awk '/regex|regular expressions/{print $0}'
$ echo "Testing regex" | awk '/regex|regular expressions/{print $0}'
$ echo "This is something else" | awk '/regex|regular expressions/{print $0}'

Jangan ketik spasi di antara pola dan simbol pipa.

Mengelompokkan ekspresi

Anda dapat mengelompokkan ekspresi sehingga mesin regex akan menganggapnya sebagai satu kesatuan.

$ echo "Like" | awk '/Like(Geeks)?/{print $0}'
$ echo "LikeGeeks" | awk '/Like(Geeks)?/{print $0}'

Pengelompokan "Geeks" membuat mesin regex memperlakukannya sebagai satu kesatuan, jadi jika "LikeGeeks" atau kata "Suka" ada, itu berhasil.

Contoh praktis

Kami melihat beberapa demonstrasi sederhana menggunakan pola ekspresi reguler. Saatnya untuk menerapkannya, hanya untuk berlatih.

Menghitung file direktori

Mari kita lihat skrip bash yang menghitung file yang dapat dieksekusi dalam folder dari variabel lingkungan PATH.

$ echo $PATH

Untuk mendapatkan daftar direktori, Anda harus mengganti setiap titik dua dengan spasi.

$ echo $PATH | sed 's/:/ /g'

Sekarang mari kita ulangi setiap direktori menggunakan for loop seperti ini:

mypath=$(echo $PATH | sed 's/:/ /g')

for directory in $mypath; do

done

Hebat!!

Anda bisa mendapatkan file di setiap direktori menggunakan perintah ls dan menyimpannya dalam variabel.

#!/bin/bash

path_dir=$(echo $PATH | sed 's/:/ /g')

total=0

for folder in $path_dir; do

	files=$(ls $folder)

	for file in $files; do

		total=$(($total + 1))

	done

	echo "$folder - $total"

	total=0

done

Anda mungkin melihat beberapa direktori tidak ada, tidak masalah dengan ini, tidak apa-apa.

Dingin!! Inilah kekuatan regex—beberapa baris kode ini menghitung semua file di semua direktori. Tentu saja, ada perintah Linux untuk melakukannya dengan sangat mudah, tetapi di sini kita membahas cara menggunakan regex pada sesuatu yang dapat Anda gunakan. Anda dapat menemukan beberapa ide yang lebih berguna.

Memvalidasi alamat email

Ada banyak sekali situs web yang menawarkan pola regex siap pakai untuk semuanya, termasuk email, nomor telepon, dan banyak lagi, ini berguna, tetapi kami ingin memahami cara kerjanya.

[email protected]

Nama pengguna dapat menggunakan karakter alfanumerik apa pun yang dikombinasikan dengan titik, tanda hubung, tanda tambah, garis bawah.

Nama host dapat menggunakan karakter alfanumerik apa pun yang dikombinasikan dengan titik dan garis bawah.

Untuk nama pengguna, pola berikut cocok untuk semua nama pengguna:

^([a-zA-Z0-9_\-\.\+]+)@

Tanda plus berarti satu karakter atau lebih harus ada diikuti dengan tanda @.

Maka pola hostname harus seperti ini:

([a-zA-Z0-9_\-\.]+)

Ada aturan khusus untuk TLD atau domain tingkat atas, dan aturan tersebut tidak boleh kurang dari 2 dan maksimal lima karakter. Berikut ini adalah pola regex untuk domain tingkat atas.

\.([a-zA-Z]{2,5})$

Sekarang kita gabungkan semuanya:

^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$

Mari kita uji ekspresi reguler itu dengan email:

$ echo "[email protected]" | awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'
$ echo "[email protected]" | awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'

Luar biasa!!

Ini hanyalah awal dari dunia regex yang tidak pernah berakhir. Saya harap Anda memahami muntahan ASCII ini dan menggunakannya secara lebih profesional.

Saya harap Anda menyukai postingan ini.

Terima kasih.


Linux
  1. Tutorial perintah cd Linux untuk pemula (8 Contoh)

  2. Tutorial Perintah Tanggal Linux untuk Pemula (8 Contoh)

  3. Tutorial Perintah Hostname Linux untuk Pemula (5 Contoh)

  1. Tutorial perintah comm Linux untuk pemula (5 contoh)

  2. Tutorial Perintah Linux df untuk Pemula (8 Contoh)

  3. Tutorial Perintah Linux du untuk Pemula (10 Contoh)

  1. Tutorial Perintah gema Linux untuk Pemula (5 Contoh)

  2. Tutorial Perintah Linux env Untuk Pemula (5 Contoh)

  3. Tutorial Perintah ukuran Linux untuk Pemula (6 Contoh)