0

Kaldıgımız yerden devam edelim bir önceki yazımızda ” JOKER KARAKTERLER VE DÜZENLİ İFADELER ” devam ediceğimizi belitmiştik

[su_button url=”https://www.aridoshika.com/2018/05/ls-komutunu-bilenler-icin-linux-101/” target=”blank” style=”flat” background=”#d1d8d9″ size=”4″ center=”yes” radius=”0″ icon=”icon: linux” icon_color=”#f02c2b” text_shadow=”0px 0px 0px #ded7d7″]Linux-101 -1[/su_button]

[su_button url=”https://www.aridoshika.com/2018/06/ls-komutu-bilenler-icin-linux-101-2//” target=”blank” style=”flat” background=”#d1d8d9″ size=”4″ center=”yes” radius=”0″ icon=”icon: linux” icon_color=”#f02c2b” text_shadow=”0px 0px 0px #ded7d7″]Linux-101 -2[/su_button]

[su_button url=”https://www.aridoshika.com/blog/2018/07/18/ls-komutu-bilenler-icin-linux-101-3/” target=”blank” style=”flat” background=”#d1d8d9″ size=”4″ center=”yes” radius=”0″ icon=”icon: linux” icon_color=”#f02c2b” text_shadow=”0px 0px 0px #ded7d7″]Linux-101 -3[/su_button]

 

Joker karakterler (wildcards), Giriş

Günlük Linux kullanımında çok defa bir operasyonu tek seferde birden fazla nesne için çalıştırmak iste-
yebileceğiniz (rm gibi) durumlarla karşılaşabilirsiniz. Böyle durumlarda, aşağıdaki gibi bütün dosyaları
komut satırına yazmak çok gereksizdir:

$ rm dosya1 dosya2 dosya3 dosya4 dosya5 dosya6 dosya7 dosya8

Bu problemi çözmek için, Linux’un kendi içinde yer alan joker karakter desteğinin getirdiği avantajdan
yararlanabilirsiniz. Aynı zamanda (tarihsel nedenlerden dolayı) ”globbing” olarak da adlandırılan bu
destek, joker karakter modelini kullanarak tek seferde birden fazla dosyayı belirlemenize olanak sağlar.
Bash ve diğer Linux komutları joker karakter modeline bakarak ve dosya sistemi üzerinde bu modele uyan
dosyaları bularak komutu yorumlar. Bu durumda diyelim ki bulunduğumuz dizinde dosya1, dosya2, … ,
dosya8 isimli dosyalar varsa bu dosyaları aşağıdaki şekilde yok edebilirsiniz:

$ rm dosya[1-8]

Ya da daha basitçe ismi dosya ile başlayan bütün dosyaları yok etmek istediğinizde aşağıdaki gibi
yazabilirsiniz:

$ rm dosya*

Uyuşmazlıkları (non-matches) Anlamak

Veya /etc içinde yer alan ve ismi g ile başlayan tüm nesneleri listelemek istediğinizde aşağıdaki gibi yazabilirsiniz:

 

Peki ya acaba herhangi dosya sistemi nesnesi ile uyuşmayan bir yol belirlendiğinde ne olacaktır?
Aşağıdaki örnekte, /usr/bin altında yer alan, asdf ile başlayan ve jkl ile biten bütün dosyaları listelemek
istiyoruz:

$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: Böyle bir dosya ya da dizin yok

Bu durumu şöyle açıklayabiliriz. Normalde mevcut dosya sisteminde yer alan bir ya da daha fazla nesne ile
uyuşan bir model belirlediğimizde kabuk, yazdığımız modeli her uyuşan nesne boşlukla ayrılacak şekilde
listeler. Fakat model herhangi bir nesne ya da nesnelerle uyuşmuyorsa, kabuk ifadeyi olduğu gibi bırakır.
Ve sonuçta ls, /usr/bin/asdf*jkl dosyasını bulamaz ve hata verir. Buradaki kural şudur: Kullanılan model,
sadece modelin belirlediği nesne ya da nesneler sistemdeki nesnelerle uyuşuyorsa açılmaktadır.

Joker karakter sözdizimi: *

Artık joker karakterlerin nasıl çalıştığını anladığımıza göre, biraz da joker karakterlerin sözdizimine göz
atalım. joker karakterler arasında birkaç özel karakter kullanabilirsiniz; işte bunlardan bir tanesi: *

Yıldız (asterix) * işareti sıfır veya daha fazla karakterle eşleşecektir. Bunun anlamı * olan yere herhangi
bir şey gelebileceğidir. Örnekler:
• /etc/g* belirtimi /etc’nin altında g ile başlayan tüm nesnelerle eşleşir.
• /tmp/my*1 beliritim /tmp’nin altında my ile başlayan ve 1 ile biten tüm nesnelerle eşleşir.

Joker karakter sözdizimi: ?

?
Soru işareti ’ ?’ herhangi bir tek karakterle eşleşir. Örnekler:
• dosyam? belirtimi dosyam ile başlayıp bir tane daha karakter içeren nesnelerle eşleşir.
• /tmp/notlar?txt belirtimi hem /tmp/notlar.txt, hem /tmp/notlar txt dosyasıyla eşleşir, eğer mevcutlarsa.

Joker karakter sözdizimi: [ ]

[ ]
Bu joker karakterler ’ ?’ ile benzerdir, ancak daha fazla kesinlikte ayrım yapma şansını verir. Bu joker
karakterleri kullanmak için, [ ] arasında eşlemek istediğiniz tüm karakterleri koymalısınız. Sonuçta elde
edilen eşleşme bu karakterlerin herhangi birinin tek eşleşmesini verecektir. – (eksi) işaretini bir aralık
vermek için kullanabilirsiniz, hatta birden fazla aralığı birlikte kullanabilirsiniz. Örnekler:
• dosyam[12] belirtimi dosyam1 ve dosyam2 ile eşleşecektir. Wildcard, çalışılan dizindeki en bu dos-
yalardan en az bir tanesi mevcut olacak şekilde genişletilecektir.
• [Cc]hange[Ll]og belirtimi Changelog, ChangeLog, changeLog, ve changelog ile eşleşecektir. Gördü-
ğünüz gibi, köşeli parantez joker karakterlerini kullanmak küçük / büyük harf eşleşmelerindeki
kombinasyonları yakalamak için faydalı olacaktır.
• ls /etc/[0-9]* komutu /etc ’nin altında rakamla başlayan tüm dosyaları listeler.
• ls /tmp/[A-Za-z]* komutu /tmp ’nin altında küçük ya da büyük harfle başlayan tüm dosyaları
listeler.

Joker karakter sözdizimi: [!]

[!]
[!] yapısı [] yapısına benzemektedir. Ancak bu sefer [] parantezde yer alan karakterle eşleştirme yerine,
parantezler içerisinde bulunmayan karakterler ile eşleştirme yapılmaktadır.
Örnekler:

rm dosyam[!9]

bu komut ismi dosyam9 olan dosya dışındaki tüm dosyaları yok eder.

Joker karakter ile ilgili uyarılar

Burada joker karakter kullanırken dikkat edilmesi gereken bazı noktalara değineceğiz. Bash wildcard ile
ilgili karakterler (?, [, ], ) yazıldığı zaman buna göre özel bir işlem yapacağından, bir komuta para-
metre geçirirken bu karakterler kullanılacaksa dikkat edilmelidir. Örneğin, [fo]
ifadesini içeren bir dosya
yaratmak istediğimizde aşağıdaki yazılı olan komut yapmak istediğimiz şeyi gerçekleştirmeyecektir:

$echo [fo]* > /tmp/yenidosyam.txt

 

Eğer [fo]* modeli, dizin içerisinde herhangi bir dosya ile eşleşiyorsa, bu durumda /tmp/yenidosyam.txt
dosyası içerisinde görmeyi beklediğiniz [fo]* ifadesi yerine bu eşleşen dosyaları göreceksiniz. O halde
çözüm nedir? Bunun için gerekli çözümlerden birisi karakterlerinizi tek tırnak içerisinde yazmanızdır. Bu
yaklaşım, kabuğa bu karakterler üzerinde hiç bir joker karakter işlemi yapmaması gerektiğini anlatır.

 

$echo ’[fo]*’ > /tmp/yenidosyam.txt

Bu yaklaşımı kullandığınızda yeni dosyanız beklediğiniz gibi [fo]* karakter dizimini içerecektir. Alternatif
olarak, ters bölü (backslash) kullanarak karakterlerinizin bash için, joker karakter yerine normal karakter
anlamına gelmesini sağlayabilirsiniz. (escape characters)

$ echo \[fo\]\* > /tmp/yenidosyam.txt

Yukarıda anlatılan her iki yaklaşımda aynı şekilde çalışacaktır. Ters bölü (backslash) karakterinin bu
şekilde kullanımından da bahsettiğimize göre, eğer karakter olarak backslash () kullanmak istiyorsanız
bunu tek tırnak içinde ya da \şeklinde yazabileceğinizi söyleyebiliriz.

Düzenli İfadeler

Düzenli ifade nedir?

Düzenli ifadeler (”regex” veya ”regexp” de denir) yazı kalıplarını ifade etmek için kullanılan özel bir
biçimdir. Linux sistemlerinde, arama ve değiştirme işlerinde olduğu kadar yazı kalıplarının bulunmasında
da düzenli ifadeler kullanılır.

Glob kıyaslaması

Düzenli ifadelere bakarken düzenli ifade sözdiziminin (sentaksının) önceki eğitimdeki (bu bölümün so-
nundaki Kaynaklar başlığının altındaki Bölüm 1’e bakın) dosya ismi açılımı (globbing) kurallarına ben-
zediğini düşünebilirsiniz. Ancak sakın bunu sizi aldatmasına izin vermeyin; bu iki kavram ancak ve ancak
çok yüzeysel olarak birbirlerini andırırlar. Düzenli ifadeler de dosya ismi açılım kuralları da her ne kadar
başlangıçta benzer gibi görünseler de aslında çok farklı kurallara sahip ve farklı durumlarda kullanılan
iki sistemdir.

Basit bir dizi parçası

Uyarımızı yaptıktan sonra düzenli ifadelerin en basit türüne bakalım, basit dizi parçası. Bunun için
grep komutunu kullanacağız. Bu komut bir dosyanın içeriğini tarayıp belli bir düzenli ifade kalıbına uyan
kısımları bulur. grep, düzenli ifade kalıbına uyan her satırı basar ve buna uymayan satırları da görmezden
gelir:

$ grep bash /etc/passwd
root:x:0:0:root:/home/root:/bin/bash
knoppix:x:1000:1000:Knoppix User:/home/knoppix:/bin/bash

Yukarıda, grep programına ilk parametre olarak bir düzenli ifade geçildiğini ve ikinci parametre olarak
bir dosya ismi verildiğini görebilirsiniz. Grep /etc/passwd dosyasındaki her satırı okur bash olarak verilmiş
basit karakter dizi parçasının o satırda mevcut olup olmadığına, başka bir deyişle o satırın kendisine verilen
düzenli ifade kalıbı ile eşleşip eşleşmediğine bakar. Eğer bir eşleşme söz konusu olursa ilgili satırı basar,
olmazsa bir sonraki satıra geçer

Basit karakter dizisi parçasını anlamak

Genellikle eğer belli bir karakter dizisini arıyorsanız bunu herhangi bir ”özel” karakter kullanmadan
olduğu gibi yazabilirsiniz. Ancak ve ancak aradığınız karakter dizisinin içinde +, ., *, [, ], ve karakterle-
rinden biri ya da birkaçı var ise o zaman bunları tırnak içine almanız ve bunlardan önce tersbölü karakteri
basmanız gerekir. Birkaç basit örneğe daha bakalım:

• /tmp (/tmp karakter dizisini arar)
• ”[kutu]” ([kutu] karakter dizisini arar)
• ”komik” (komik karakter dizisini arar)
• ”ld.so” (ld.so karakter dizisini arar)

Metakarakterler

Düzenli ifadeler ile çalışırken yukarıdaki örneklerde incelediğimiz aramalardan çok daha karmaşık arama-
ları metakarakterleri kullanarak gerçekleştirebilirsiniz. Bu metakarakterlerden biri . (nokta) karakteridir
ve bu ”herhangi bir karakter” anlamına gelir:

$ grep dev.hda /etc/fstab
/dev/hda1 swap swap defaults 0 0
/dev/hda2 /mnt/hda2 auto noauto,user,exec 0 0

Bu örnekte gördüğünüz gibi programın /etc/fstab dosyasına bakarak ürettiği çıktıda dev.hda gibi bir
karakter dizisi mevcut değildir. Ancak grep programının aradığı dev.hda karakter dizisi değil dev.hda
kalıbı idi. Hatırlarsanız . herhangi bir karakter anlamına geliyordu. Gördüğünüz gibi . metakarakteri
işlevsel olarak komut satırındaki dosya ismi açılımı mekanizmasındaki ? metakarakterine benzemektedir.

[ ] Kullanımı

Eğer . sembolünü kullanarak yaptığımızdan daha özel bir eşleşme isteseydik [ ve ] sembollerini (köşeli
parantez karakterleri) kullanarak belli bir karakter kümesini gösterebilirdik:

$ grep dev.hda[10] /etc/fstab
/dev/hda1 swap swap defaults 0 0

Gördüğünüz gibi bu sözdizim kuralı da tıpkı dosya ismi açılımlarındaki [] özelliğine benzemektedir.
İşte düzenli ifadelerle ilgili dikkat etmeniz gereken noktalardan biri daha: Sözdizimi olarak benzer görünen
ama birebir aynı olmayan bazı kurallar düzenli ifadeleri öğrenmeyi güçleştirebilir.

[ ˆ ] Kullanımı

Köşeli parantezlerin anlamını [ karakterinden hemen sonra bir k̂arakteri koyarak tersine çevirebilirsiniz.
Bu durumda köşeli parantezlerin içindeki karakterler değil de onların dışında geriye kalan diğer karakter-
lerden herhangi biri yakalanır. Bu arada lütfen dikkat edin: düzenli ifadelerde [ˆ] kullanırken dosya açılım
kurallarında [!] kullanıyorduk:

$ grep dev.hda[^10] /etc/fstab
/dev/hda2 /mnt/hda2 auto noauto,user,exec 0 0

Farklılaşan söz dizimi

Köşeli parantezler içindeki sözdiziminin farklı olduğuna dikkatleri çekmekte fayda var. Mesela köşeli pa-
rantez içinde bir . karakteri yazarsanız bu gerçekten de nokta karakterini yakalamak istediğinizi gösterir
tıpkı yukarıdaki örneklerde 1 ve 2 karakterlerinin eşleşmesinde olduğu gibi. Köşeli parantezlerin dışında
ise . nokta karakteri herhangi bir karakterin yerine geçer ve başına
karakteri gelmediği sürece özel olarak nokta karakterinin yakalanmasını zorunlu kılmaz. Bundan fayda-
lanarak /etc/fstab dosyasında dev.hda içeren tüm satırları şu komut ile bulabiliriz:

$ grep dev[.]hda /etc/fstab

Alternatif olarak şöyle de yazabilirdik:

$ grep "dev\.hda" /etc/fstab

Her iki düzenli ifade de /etc/fstab dosyasındaki herhangi bir satır ile eşleşmeyecektir.

”*” metakarakteri

Bazı metakarakterler kendi başlarına herhangi bir şey ile eşleşmezler ancak bunun yerine kendilerinden
önce gelen karakterin anlamını değiştirirler. Bunlardan biri de * (yıldız) karakteridir ve kendinden önce
gelen karakterin sıfır ya da daha çok tekrar eden şeklini yakalar. Birkaç örneğe bakacak olursak:
• abc (abbbbc’yi yakalar ama abqc’yi yakalamaz)
• ab
c (abc’yi yakalar ama abbqbbc’yi yakalamaz)
• abc (ac’yi yakalar ama cba’yi yakalamaz)
• b[cq]
e (bqe’yi yakalar ama eb’yi yakalamaz)
• b[cq]e (bccqqe’yi yakalar ama bccc’yi yakalamaz)
• b[cq]
e (bqqcce’yi yakalar ama cqe’yi yakalamaz)
• b[cq]e (bbbeee’yi yakalar)
• .
(herhangi bir karakter dizisini yakalar)
• foo.* (foo ile başlayan herhangi bir karakter dizisini yakalar)

ac satırı ab*c regex ile eşleşir çünkü * metakarakteri kendisinden önce gelen ifadenin sıfır defa tekrar
etmesine (yani hiç bulunmamasına) izin verir. Şunu da eklemek gerekir ki * metakarakteri temel olarak
* glob karakterinden daha farklı bir şekilde yorumlanmaktadır.

Satır Başı ve Satır Sonu

Burada ayrıntılı olarak inceleyeceğimiz ve sırasıyla satır başı ve satır sonunu ifade eden son metakarakter-
ler v̂e $ metakarakterleridir. Düzenli ifadenizin en başında m̂etakarakterini kullanarak modelinizin satır
başında bulunmasını zorlayabilirsiniz. Aşağıdaki örnekte # karakteri ile başlayan herhangi bir satırla
eşleştirme yapmak için #̂ düzenli ifadesini kullanıyoruz:

$grep ^# /etc/apt/sources.list
#See sources.list(5) for more information, especialy
#Remember that you can only use http, ftp or file URIs
#CDROMs are managed through the apt-cdrom tool.

Tam Satır Düzenli İfadeler

ve $ metakarakterleri tüm satır ile eşleştirme yapmak için birlikte kullanılabilir. Örneğin, aşağıdaki
örnekte yer alan düzenli ifade içerisinde herhangi bir sayıda diğer karakterlerin yer aldığı, # ile başlayan
ve . karakteri ile sonlanan bir satırla eşleştirmeyi sağlayacaktır:

$ grep ’^#.*\.$’ /etc/fstab
# CDROMs are managed through the apt-cdrom tool.

Yukarıdaki örnekte, $ karakterinin kabuk tarafından yorumlanmasını engellemek için tüm ifadeyi tek
tırnak karakterleri arasında yazdık. Tek tırnak olmasaydı, daha grep yorumlamadan $ karakteri düzenli
ifade içerisinden yok olacaktı.

Bu yazımızında sonunda geldik bir donraki seride Dosya Standartlarına geçicez.

 

Akademisyen Yapay Zeka: BİNA48

Previous article

SOSYAL MUHENDİSLİKTE PSİKOGRAFİ VE DEMOGRAFİ 1

Next article

You may also like

Comments

Bir Cevap Yazın

More in Anasayfa