Regular Expressions Version 0.1 Hüseyin Kaya hkaya@be.itu.edu.tr 2001 Özet Bu belge Linux and Unix Shell Programming adlı kitaptan faydalalınarak yazılmıştır. Kitabın yazarı David Tansley. İngilizce bilenler veya tercüme okumak istemeyenler kitabın aslını okusunlar. 1
Bölüm 1 Regular Expressions Örnekler 1.1 Giriş Bu bölümde özel anlamı olan bazı karakterleri tanıtmaya çalışalaım. * Bütün karakterler anlamına gelir. ˆ Satır başı anlamına gelir. Bazı durumlarda birşeyin tersi anlamında da kullanılır. $ Satır sonu anlamında kullanılır.. Tek karaktere karşılık gelir. [ ] Karakter olasılıklarını karşılar. Mesela [0-9] herhangi bir rakamı ifade eder. \ Özel karakterleri özel anlamlarından kaçırmak için kullanılır. ifade \{n\} ifade nin n kere tekrarını gösterir. Mesela X \{2\} XX e karşılık gelir. Bulunduğunuz yerdeki dizinleri bulmak için: $ ls -al grep d... Büyük harfle başlayan bütün dosyaları görmek için $ ls grep ^[A-Z] Bir dosyanın içinde a harfinin en az 3 kere yanyana kullanıldığı satırları görmek için: $ grep a\{3,\} dosya Ana dizindeki bütün mp3 dosyalarını bulmak için: 2
$ find / -iname *.mp3 Bir dosyanın içindeki boş satırları satır numaraları ile birlikte görüntülemek için: $ grep -n ^$ dosya 1.2 awk awk belli formatlardaki metin dosyaları ile oynamanızı sağlayan, değişiklikler yapabilen kendi çapında bir dildir. Bütün komutlarını buraya aktarmak mümkün olmadığı için bazı temel özellikleri ile yetineceğiz. İyi bir kabuk programcısı awk dilini çok iyi bilmelidir. awk ı çalıştırmanın birçok yolu var. Bunlardan en temel olanı ve burada en sık kullanacağımız şekli $ awk [-F ayrac] komutlar dosya(lar) awk ayraç olarak hiçbirşey tanımlanmazsa boşluk karakterinin kullanacaktır. /etc/passwd gib dosyalarla uğraşıyorsanız : ayracını kullanmanız gerekecektir. Diğer bir yöntem ise awk komutlarını ayrı bir dosyaya yazdırmak ve hepsinin birden çalıştırmaktır. $ awk -f awk_dosyasi dosya(lar) awk nasıl çalışır? Awk dosyayı belirtilen ayraca uygun olarak okur. Ayraç olarak boşluk karakterini düşünelim. awk ilk karşılaştığı elemenı ilk sütun elemanı olarak düşünecektir. Ayracı atladıktan sonra karşılaştığı elemanı ikinci sütün elemanı olarak atayacaktır. Bu şekilde satır sonuna kadar ilerler. Bu şekilde işlediği her satırı bir kayıt gibi düşünecektir. awk betiklerinin sonuçlarını kaydetmek için iki yol vardır. Birincisi > yönlendirmesi ile yapılır. Bu yöntem en sık kullanılan yöntemdir. Yönlendirdiğiniz dosya eğer yoksa oluşturulur, varsa üstüne yazılır. Bu yüzden dikkatli olmanızda yarar var. Ayrıca yazdığınız betiğin istediğiniz sonuçları verip vermediğini hemen kontrol edemezsiniz. İkinci yol ise tee komutunu kullanmak. Bu buyruk ilk önce sonuçları gösterir ardından dosyaya kaydeder. Örnekler Bir dosyanın bütün içeriğini göstermek için: $ awk {print $0} dosya Bir dosyanın ilk ve dördüncü sütunlarını görüntülemek için: 3
Örnekler $ awk {print $1,$4} dosya Çıktının üst tarafına sütun elemanlarını beilrlemek için bazı şeyler yazabilirsiniz $ awk BEGIN {print "isim soyisim\n --------------"} {print $1"\t"$4} dosya Metim işlemlerinin en alt kısmına birşeyler eklemek için END komutunu kullanabilirsiniz. awk BEGIN {print "isim soyisim\n ----------------"} {print $1"\t"$2} END {print "Listenin Sonu"} dosya Dikkat etmeniz gereken nokta şu; END komutunu bütün metin işlem komutları bittikten sonra koymak. En son yapılacak işlem END işlemidir. Özel Karakterler: ˆ$. [] () * +? karakterleridir. Bunlardan + ve? işaretleri sed ve grep tarafından özel olarak algılanmazlar ama awk tarafından özel karakterler olarak nitelendirilir. + Bir veya daha fazla karakter anlamında gelir. [a-z]+ bütün küçük karakterli kelimeler anlamına gelir. awk ın karşılaştırma operatörlerinden bahsedelim. < Küçüktür <= Küçük veya eşit == Eşittir!= Eşit değildir >= Büyük veya eşittir Karşılaştırma ( Regular Expressions ile)! Karşılaştırmamak ( Regular Expressions ile) Eğer bir satırın içinde belirli bir kelimeyi arıyorsanız $ awk $0 ~/kelime/ dosya kalıbını kullanabilirsiniz. Veya tersini de yapabilirsiniz. $ awk $0!~/kelime/ dosya Kelime ararken büyük küçük harf ayırımını gözardı etmemek için $ awk /[hh]üseyin/ dosya kalıbını kullanabilirsiniz. 4
awk ın kendine has bazı değişkenlerine şimdi değinelim. ARGV ARGV ENVIRON FILENAME FNR FS NF NR OFS ORS Komut satırından girilen argüman sayısı Argümanlar dizisi Çevre değişkenlerinin tutulduğu dizi Awk ın üzerinde çalıştığı dosyanın ismi Dosya içindeki kayıt sayısı Ayracı belirleyen komut Her kayıttaki alan(sütun) sayısı O ana kadar okunan kayıt sayısı Sonuç dosyasının ayracı Sonuç dosyasının kayıtlar arası ayracı Bu değişkenler çok çeşitli sonuç dosyalarının oluşturulabilmesini sağlar. $ awk {print NF,NR,$0}END {print FILENAME} dosya NF değişkeninin sık kullanıldığı yerlerden birisi bulunulan dizinin yalın ismini elde etmektir. $ pwd /usr/local/smms $ echo $PWD awk -F/ {print $NF} smms = += *= /= %= ˆ= Atama operatörleri? Conditional expression operator &&! VEYA, VE ve DEGIL operatörleri! Karşılaştırma operatörleri < <= > >= ==! = İlişkisel operatörler + - * / % ˆ Aritmetik operatörler ++ - - Ön ve kuyruk ekleri awk da sütun değişkenlerine isimler atanabilir. Mesela elimizde şöyle bir dosya olsun; Hüseyin Kaya 0216 3448740 Ümraniye _Istanbul Andre Kolya 0212 3330333 Beykoz _Istanbul Nihal Çim 0312 4440444 Aydınlık Ankara Ali Veli 0216 2156325 Beşiktaş _Istanbul Bu dosyayı awk a okuturken ilk sütun değişkeninde isim, dördüncü sütuna da telefon değişkenini atayalım. $ awk {isim=$1;telefon=$4; if(isim ~/Hüseyin/)print isim Hüseyin telefonu : 3448740 " telefonu : "telefon} kayit 5
Bulunduğunuz yerdeki dosyaların toplam boyutunu awk sayesinde hesaplayabilirsiniz. $ ls -al awk /^[^d]/ {print $9"\t"$5} {top+=$5} END {print "toplam KB= "top} awk ın bazı karakter (string) fonksiyonlarından bahsedelim. gsub(r,s) gsub(r,s,t) index(s,t) length(s) match(s,r) $0 içindeki r leri s ile değiştirir $t içindeki r leri s ile değiştirir t nin s in içindeki ilk pozisyonu s nin uzunluğu r yi s nin içinde arar gsub için bir örnek yapalım. $ awk gsub(/andre/,"mahmut") {print $0} kayit Yeni kelimenin tırnaklar içinde yazılmasına dikkat edin. Eğer karakter yerine rakam yazsaydınız tırnaklara gerek olmayacaktı. Kabukda kullanılan değişkenleri awk a aktarmak için borulama kullanılabilir. $ STR="dosya.txt" $ echo $STR awk {print substr($str,1,5)} dosya Özel kelime karakterlerini aşağıdaki tabloda görebiliriz. Bir örnek yapalım \b Geri sil \n Yeni satır \r Enter \t Tab \ddd Karakterin octal değeri $ awk BEGIN {print "\n\andre\t\kolya\n\andre\t\104\141\171"} Andre Kolya Andre Kolya 6