Kalıp Tarama Ve İşleme Dili awk İle Linux'ta gawk Programlama (Bölüm I)


Okan ÖZEREN <okan.ozeren at students dot comu dot edu dot tr>
A. Murat EREN <meren at comu dot edu dot tr>


29/08/2003 Adana, v.0.1b


   İÇİNDEKİLER

  1. AWK VE GAWK'NİN TARİHİ
  2. TANIMLAMA
  3. GİRİŞ
    1. awk Kullanarak Neler Yapabiliriz
  4. GEREKLİ YAZILIMLAR VE DESTEK
  5. BAŞLANGIÇ
    1. awk Programın Çalıştırılması
      1. Tek Satırlık awk Programları
      2. Girdi Dosyası Olmadan awk İle Çalışma
      3. awk'de Uzun Programlar
      4. Çalıştırılabilir Programlar
      5. awk'de Açıklama
      6. Kabukta Tırnak (' veya ") Kuralları
    2. İşlenecek Verinin Formatı
    3. Basit Örnekler
    4. İki Kural İle Çalışma Örneği
    5. Daha Karmaşık Bir Örnek
    6. Temel Olarak
    7. awk İfadelerinin Ayrı Satırlarda Yazılması
    8. awk'daki Diğer Özellikler
    9. awk Ne Zaman Kullanılır
  6. BÖLÜM II (DÜZENLİ İFADELER (REGULAR EXPRESSIONS) )

   1. AWK VE GAWK'NİN TARİHİ


   awk, adını dizaynırlarının (Alfred V. Aho, Peter J. Weinberger ve Brain W. Kernighan) isimlerinin baş harflerinden alır. awk'nın orijinal versiyonu 1977'de AT&T Bell Laboratuarlarında yazılmıştır. 1985'te, yeni versiyonu programlama dilini daha güçlü yapmıştır; kullanıcı tanımlı fonksiyonlar eklenmiş, çoklu giriş akışları ve düzenli ifadeleri hesaplayabilme özellikleri geliştirilmiştir. UNIX Sistem V Sürüm 3.1(SVR3.1) ile birlikte bu yeni versiyon yeni kullanım olanakları oluşturmuştur. SVR4'teki yeni özellikler eklemiş ve dildeki bazı "karanlık köşeler" içindeki davranışları temizlemiştir. POSIX Komut Dili ve Araçları standardı seviyesinde awk'nin özellikleri gelişmiştir. gawk ve orijinal Bell Laboratuarları awk dizaynırları POSIX özellikleri için geriye dönüşü sağlamışlardır.

   Paul Rubin 1986'da gawk'nın GNU işlemlerini yürütmüştür. Jay Fenlason, Richard Stallman'ın önerileri ile bunu tamamlamıştır. John Wood'da kod parçalarına iyi bir şekilde yardımcı olmuştur. 1988 ve 1989'da David Trueman, Arnold Robbins' in yardımlarıyla yepyeni awk ile uyumlu olacak şekilde gawk'yi tamamen baştan oluşturmuşlardır. Aşağı yukarı 1915 te bunu asıl sürdüren Arnold Robbins olmuştur. Geliştirmenin aktif odağı açıkların düzeltilmesi, performansın arttırılması, standarta uygunlaştırlması ve ara sıra meydana gelen şekli olmuştur.

   Mayıs 1997'de Jürgen Kahrs awk'de ağ erişimleri konusuna değinmeye ihtiyaç duymuş ve Arnold Robbins'in de biraz yardımını alarak, gawk'ya yeni şeyler ekleyerek şekil vermiştir. Hala gawk'de TCP/IP Internetworking'i büyütme çalışmaları yapmaktadır (dökümanları ayırma, kullanıma hazır bir şekilde parçalar halinde dağıtma). Onun kodunun son ana parçası gawk, gawk V3.1 ile dağıtılandır.



   2. TANIMLAMA


   gawk GNU pojesi altında yürütülen awk programlama dilidir. POSIX 1003.2 Komut Dili ve Araçları standardında dil tanımlamalarına uyumludur. Bu versiyon Aho, Weinberger, Kernighan'ın AWK Programlama Dilinin temeline dönük tanımlanmıştır, bununla birlikte UNIX awk'nın SVR4 versiyonundan fazla birtakım özelliklerede sahiptir. Yakın zamanda gawk genişletilmiş Bell Laboratuarlarının awk'sini ve GNU ya özgü özellikleri sağlamıştır.

   Komut satırı gawk'nin, awk program kodu (eğer kod dosyadan çağrılıyorsa -f veya --file parametreleri ile) ve hazır ARGC ve ARGV öntanımlı değişkenlerine değer vermek kendi özelliklerinden ibarettir.



   3. GİRİŞ


   awk programlama dili bir script dilidir ve kesinlikle bir binary dosya oluşmaz çünkü awk bir derleyici değil bir yorumlayıcıdır. Derleyiciler kaynak dili yüksek seviyeli bir dil, amaç dili alçak seviyeli bir dil olan (sembolik makine dili) olan programlardır, yorumlayıcılar ise kaynak programı ele alarak kısım kısım çalıştırırlar ve sonuçta bir amaç kod üretmezler. Yorumlama işlemi aşama aşama yapılmaz, yukarıdan aşağıya doğru sıra ile yapılır ve bu yüzden de hatanın ilk bulunduğu yerde programın çalışması kesilir. Yorumlayıcıların her zaman kaynak koda ihtiyaç duymaları da kaynak kodun gizliliği ve güvenliği açısından büyük bir dezavantajdır.

   Program kodlarının işlenmesi için awk'de belli bir veri girişinin olması gerekmektedir. Bu veri girişi sürekli akar ve awk bu veriler içerisinde istediğimiz işlemleri yapar. awk işlemleri o kadar kısa kodla o kadar çok kolaylaştıtırki mesela C/C++, Pascal ile aynı işlemleri yapmasını istediğimiz bir program için yazmak zorunda olduğumuz onlarca satırın eziyetinden bizi kurtarır. Neredeyse bir satırlık bir kodla yapılması imkansız gibi görünen işlemler yapılabilir. awk alanında biçilmiş kaftandır. awk ile programlamanın ilk adımı awk'nin hata mesajlarına önem vermektir. Bu hata mesajlarının ne anlama geldiğini, neden kaynaklandığını araştırıp öğrenmek neden olan hataların nasıl giderileceği konusunda tecrübelerinizi arttıracaktır. Böylelikle boşu boşuna uğraşmanızdan dolayı oluşacak zaman kaybınızı azaltacaktır.

   awk komutu, GNU nun yürüttüğü, SVR4 versiyon awk ile tamamen uyumlu, daha yukarıya dönük gawk'yi çağırır. gawk bir de awk'nin POSIX standartlarıyla tamamen uyumludur. Böylelikle awk de yazılan programlar kesinlikle gawk ile gerektiği gibi çalışır. Bizler genellikle awk ile gawk arasındaki programı yürütme farkını anlamayız.


   3.i. awk kullanarak neler yapabiliriz :
  • küçük, kişisel veritabanlarının yönetimi
  • rapor oluşturma
  • verileri onaylar
  • index oluşturur ve diğer görev dökümanlarını hazırlığını yerine getirir
  • algoritmalarla deneyimli olsa bile diğer bilgisayar dilleri geç adapte olur




   4. GEREKLİ YAZILIMLAR VE DESTEK


   gawk genellikle şu anki bütün linux sürümleriyle beraber gelmektedir. gawk sizin linux sürümünüzde bulunmuyorsa veya elinizdeki gawk sürümü eskiyse, elde etmek ve bilgisayarınıza kurmak için aşağıdaki web adresleri size yardımcı olacaktır.

   Bulmak için :

   Web sayfaları : http://www.gnu.org/manual/gawk/
http://gnu.software-archive.net/gawk/
      Versiyon 3.1.3 (kararlı) 09-07-2003'de sürülmüş
The GNU General Public License, Version 2 or later
(Genel Kamu Lisansı, Versiyon 2 veya sonrası) altında lisanslı GNU paketi.
http://www.gnu.org/software/gawk/gawk1.html
   Sıkıştırılmış şekilde kaynak : http://ftp.gnu.org/gnu/gawk/gawk-3.1.3.tar.gz


   Destek bağlantısı :

   Geliştirme haberleri : http://comp.lang.awk
   Hata listesi : <bug-gawk@gnu.org>


   Proje bağlantısı :

   Projeyi devam ettirenler : Arnold Robbins <arnold@gnu.org>
   Geliştiriciler : Arnold Robbins <arnold@gnu.org>


   Bilgi :

   Arayüzler : komut satırı
   Programlar : igawk
   Kaynak diller : C
   Anlatılmış programlar : Diffutils, Grep, Patch


   Bilgi girişi :

   Lisansı onaylayan : Janet Casey <jcasey@gnu.org> 22-06-2002'de
   Derleyip düzenleyen : Janet Casey <jcasey@gnu.org>


   gawk'nin komut satırında kullanılışı aşağıdaki gibidir :

   ]# gawk [ POSIX veya GNU standartlarına uygun parametreler ] -f program_dosyası [ -- ] dosya ...
   ]# gawk [ POSIX veya GNU standartlarına uygun parametreler ] [ -- ] program_kodu dosya ...


    ]# awk '{print $0,}' dosyaadı
    awk: syntax error near line 1
    awk: illegal statement near line 1
   

   gawk genellikle daha üstün ve anlaşılır hata mesajları sunar. Hatanın nerede olduğunun ve neden kaynaklandığının daha iyi belirtildiği gawk'da sorun anlaşılıp çözümü dahada kolaylaşır.


    ]# gawk '{print $0,}' dosyaadı
    gawk: cmd. line:1: {print $0,}
    gawk: cmd. line:1:           ^ parse error
   

   awk'de hatanın nereden kaynaklandığını anlayamadığınız zamanlarda kodu birde gawk ile deneyerek sorunu daha iyi anlabilirsiniz.

   Büyük ihtimalle şu anda bilgisayarınızda kurulu olan Linux sürümünde awk kurulu değildir gawk kuruludur. Bunun nedeni awk'nin açık kaynak kodlu olmaması ve gawk'nin açık kaynak kodlu olmasıdır. Fakat awk komutuda çalışacaktır."/bin/awk" binary dosyasının özelliklerine bakacak olursak "/bin/gawk" binary dosyasını gösteren bir link olduğunu göreceğiz. Aşağıdaki örneğe bakarak bunu daha iyi anlayacağınızdan eminim :


    ]# ls -l /bin/awk
    lrwxrwxrwx    1 root     root            4 Nis  2 05:45 /bin/awk -> gawk*
   


   5. BAŞLANGIÇ


   Dosyalarda belirli modelleri (şablon) satırları (başka bir yazı birimide olabilir) aramak awk'nin temel fonksiyonudur. Bir satır belirtilen modele uyum sağladığında awk bu satır üzerinde yapılacak işlemleri yerine getirir. awk girdinin sonuna ulaşana kadar girdi satırlarını bu doğrultuda ele alarak işler.

   awk'da yazılmış programlar diğer dillerin çoğunda yazılmış programlardan farklıdır, çünkü awk programları data-driven'dır (istediğin iş ile birlikte veriyide tanımlayarak uygun olduğu anda bu veriyi işlemektir). Diğer dillerin çoğu prosedürel'dir (programdaki her adım alınıp önemli detaylar tanımlanır). Prosedürel dillerle çalışıldığında, genellikle programınızda işlenecek temiz veri tanımlamak çok zordur. Bunun için awk programları yazma ve okumanın her ikisinde de kolayca yenilenebilir.

   awk çalıştırıldığında, awk'ye ne yapılması gerektiğini söyleyen awk programı kesinlikle belirtilmelidir. Program bir takım kurallardan ibarettir (bu aynı zamanda daha ilerde ele alacağımız fonksiyon tanımlamalarını da kapsar). Her bir kural aranılacak modeli ve bu modele uygun veri bulunduğunda yapılacak işi belirtir.

   Sözdizimi yönünden, kural işin takip ettiği bir modelden ibarettir. İş kıvrımlı parantezler arasında yazılır ve modelden ayrılır. Kurallar genellikle yeni satırlarla bölünür. Aşağıdaki gibi:

   şablon(model) { iş }
   şablon(model) { iş }
   ...


   5.i. awk Programın Çalıştırılması

   awk, eğer belirtilmişse, ilk önce program kaynağını program dosyası(ları)ndan okur veya program dosyası(ları) belirtilmemişse bunu konsoldan direk alabilir. Program kodları, program dosyaları ve beraber sıralanmış komut satırı kaynaklarının hepsi gibi ise awk bunu okur. Bu awk foksiyon kütüphanelerini oluştururken çok yararlı olacaktır. Bu oluşturduğumuz kütüphaneleri yeni awk programlarımızın içine gömerek kullanabiliriz. Hem de komut satırı programları ile birlikte kütüphane fonksiyonlarını karıştıran bir yetenekte sağlar.

   awk programları, işlemleri, birbirini takip edecek düzende yerine getirir. Öncelikle -v parametresiyle kesinlikle belirtilmiş tüm değişkenlerin yapacağı işlemler yerine getirilir. Daha sonra dahili yapı içindeki program kodunu derler. Ondan sonra awk, BEGIN bloğu(ları) arasındaki kodu çalıştırır, sonra ARGV içindeki herbir dosya adını okuyarak işler. Özel eleman olan ARGV boş ise o zaman awk onu atlar. Eğer komut satırında (ARGV) hiç dosya adı yoksa awk girdileri standart girdiden okur.

   Komut satırı üzerinde var(variable:değişken)=val(value:değer) ataması ile değişken ataması yapılabilir. Bu awk ile program yaparken dinamik değişken değeri ataması, awk kullanırken alan ve kayıtlar içinde kesme yapılabilmesi açısından çok faydalıdır. Bu tek veri dosyası üzerinde çalışılıyorsa programı esnek bir şekilde kontrol edebilmek açışından önemlidir. Böylelikle veri dosyası içerisinde kayıtlar arasında atlama veya geçiş yapabilmemizi sağlanır.

   Girdideki herbir kayıt için kalıbın uygunluğu tek tek kontrol edilir. Kalıba uygun bulunan her bir kayıt istenilen işe göre işlenir. Bu test edilme ve işlenme işi sırayla devam eder.

   Sonunda girdi tamamen bittikten sonra END bloğundaki(ları) kodlar çalıştırılır. Programın kodları tamamen çalıştırılmış olur.

   awk programlarını çalıştırmanın birkaç yolu vardır. Program kodu kısa ise awk'yi çalıştıran komutun içine gömmek daha kolaydır. Model ve iş sırasından ibaret olan programda program kodu daha önceden de hazırlanmış olarak konsolda ilave edilebilir. Program kodu uzun olduğu zaman genellikle bunu dosyaya koymak ve böyle çalıştırmak daha uygundur. Yani awk, komutları komut satırından standart girdi olarak alabilir veya dosyadan okuyabilir. Bu konuları ilerde daha da açacağız.

   awk'ye veri girişi de girdi dosyasındaki formatlı veriler ile veya başka bir programın çıktısını boru (|) işaretiyle girdi olarak almak suretiyle sağlanabilir. İleride bu konuyu ilgili örneklerle pekiştireceğiz. Bu komutların çıktılarını standart çıktı olarak görüntüleyebilir, bir dosya içerisine yazabilir veya başka bir programa boru (|) işaretiyle girdi olarak gönderebiliriz.


   5.i.1 Tek Satırlık awk Programları

   Bu yapı oldukça basittir. Bu şekilde bir yapıyı kısa, temel işlevleri yerine getirmesini istediğimiz bir koda ihtiyaç duyduğumuz zamanlarda kullanmak daha akıllıca olacaktır ve bir de sürekli ihtiyaç duymayacağımız işlemleri yapacak kod parçalarına ihtiyacımız olduğunda böyle bir yazım şeklini seçebiliriz. Birtakım veri dizisi üzerinde bir anda çok önemli sorgular yapabilir, veri dizilerini süzebilir ve ihtiyacımız olan verileri çıktı olarak alabiliriz. Yazı şekli örnekteki gibidir :


    ]# awk 'program' girdi-dosyası1 girdi-dosyası2 ...
   

   'program' kalıbı yerinde, istediğimiz işlemi yapacak awk program kodunu belirtiriz. girdi-dosyası1... dosyalarında ise işlenecek verilerin bulunduğu dosyalar belirtilir. Bu veri dosyaları ve işlenecek verilerin yapıları hakkında daha geniş bilgiye yer vereceğiz.


   5.i.2 Girdi Dosyası Olmadan awk İle Çalışma

   awk ile girdi dosyasi olmadan bile çalışabilmek mümkündür. Bu çalışma, aşağıdaki temel kalıpta olduğu gibi yapılır :


    ]# awk 'program'
   

   O zaman awk uygulaması olan programlarınız genellikle satndart girdi işlemleri olacaktır. Böyle işlemlerin hepsi konsoldan direk kod girilerek yapılır. Bu süreç dosya-sonu-karakeri olan Control-d karakterine gelene kadar devam eder (Diğer işletim sistemlerinde dosya-sonu-karakteri farklı olabilir. Örneğin OS/2 ve MS-DOS işletim sistemlerinde Control-z'dir.)

   Şimdi ekrana kısaca bir mesaj basan bir program kodunu deneyelim (bu kodda kullanılan 'BEGIN' anahtar kelimesini henüz anlatmadık, ilerde öğreneğinizden şüpheniz olmasın...) .


    ]# awk "BEGIN { print \"Okan'ın awk programı\" }"
   

   Bu program hiç girdiye ihtiyaç duymadan çalışır. Program ifadesini çift tırnak ("") karakterleriyle kapattığımız için print komutuyla ekrana bastıracağımız katarı sınırladığımız "" karakterlerini yorumlayıcıdan kaçırmamız gerekmektedir. Bunun için bu karakterleri kaçırma karakteri (\) ile \" şeklinde yazdık. Böylelikle tek tırmak (') ve çift tırnak (") karakterlerini de bir arada kullanabilmemiz mümkün olmaktadır.

   Şimdi basit bir cat emülatörü uygulaması olan, sizin girdiğiniz katarları tekrar ekrana basan aşağıdaki örneği bir inceleyin (Niçin böyle çalıştığını kısaca izah edebilirmisiniz...)


    ]# awk '{ print }'
    Okan Ozeren
    Okan Ozeren
    Murat Eren
    Murat Eren
    Control-d
    ]#
   


   5.i.3 awk'de Uzun Programlar

   Bazen awk'de uzun program kodlarına ihtiyaç duyabiliriz. Böyle zamanlarda program kodlarımızı ayrı dosyalarda yazmamız çok daha uygun olacaktır. Aşağıdaki kalıp böyle bir ihtiyaca cevap olacaktır :


    ]# awk -f program-dosyası girdi-dosyası1 girdi-dosyası2 ...
   

   Bu tür komutların kullanıldığı yerlerin daha kompleks sorguların, matematiksel işlemlerin veya string işlemlerinin yapılması gereken yerler olması daha uygundur. En önemlisi de yazdığımız koddaki işlemler sürekli ihtiyaç duyabileceğimiz türde olmalıdır. Böylelikle bu programı kayıtlı bir şekilde saklayıp ihtiyacımız olduğunda kısa bir kodla çağırabilir ve dilediğimiz rahatlıkta kullanabiliriz. Böyle bir şekilde kodun yazımı konsoldan yazdığımız kadar zor olmayacağı için işin karmaşıklığının üstesinden gelebilmemiz kolay olacaktır.

   Çalıştırılacak program-dosyası isimli, program kodunun kayıtlı olduğu dosyayı "-f" parametresi ile programa dahil etmeliyiz. girdi_dosyası... dosyalarından ilerde bahsedeceğiz. "-f" parametresiyle programa dahil edeceğimiz dosyanı içine aşağıdaki belirtilmiş şekilde bir kod örneği yazarak awk_prog isminde kaydedelim.


    BEGIN{
      print "Okan'ın awk programı"
    }
   

   Bu dosyayı aşağıdaki komutla awk'ye dahil ederek çalıştırmamız mümkündür :


    ]# awk -f awk_prog
    Okan'ın awk programı
   

   Sonucun awk "BEGIN { print \"Okan'ın awk programı\" }" ile aynı olduğunu görmüşsünüzdür. Genellikle "-f" ile belirtilmiş program dosyalarında program kodlarını tek tırnak (') karakterleri arasında yazmaya gerek yoktur. Tek tırnaklar yalnızca awk komut satırından sağlanan programlar için lüzumlulur.

   awk programlarım dosyalarımızı, dosya isimlerine '.awk' uzantısı eklenmiş şekilde sağlamak daha iyi olacaktır. Bu bizim dosyaları bulabilemiz konusunda bize kolaylık sağlayacaktır.


   5.i.4 Çalıştırılabilir Programlar

   awk'yi daha iyi öğrendiğinde awk ile kendini kapsayan, yani çalıştırılabilir awk scriptleri yazmalısındır. Bunu için "#!" mekanizması kullanılır. Bu mekanizmayı Unix Sistemlerde kullanabilirsiniz (bazen GNU sistemlerde de).

   "awk_prog" isimli dosyayı biraz daha geliştirecek olursak :


    #! /bin/awk -f

    BEGIN{
      print "Okan'ın awk Programı" #Açıklama
    }
   

   Bu kodu awk_prog_calisiyor adıyla kaydedelim. Daha sonra bu dosyaya çalıştırılabilme özelliği vermemiz gerekmektedir. Onun için konsoldan aşağıdaki komutu girmeliyiz.


    ]# chmod +x awk_prog_calisiyor
    ]# ls -l awk_prog_calisiyor
    -rwxrwxrwx    1 seeyou   seeyou        123 Ağu 23 10:10 awk_prog_calisiyor*
   

   Daha sonra çalışma izni vermiş olduğumuz bu dosyayı çalıştırmak için aşağıdaki komutu konsoldan girmemiz yeterlidir. Bu dosya aynı "awk -f awk_prog" komutundaki gibi dosya içindeki kodu çalıştıracaktır.


    ]# ./awk_prog_calisiyor
    Okan'ın awk Programı
   

   Bazı sistemlerde limit 32 karakter olduğu halde yorumlayıcı ismi ve yolu 32 karakterden uzun bir şekilde gösterilebilir. Bu gibi durumlarda sık sık sembolik linkler kullanılarak yorumlayıcı ismi ve yolu 32 karakterden kısa bir şekilde ifade edilebilir.

   Program dosyasının en başına önce "#!" daha sonra yorumlayıcı yolu ve dosya ismi en sonuna da program kodunun bir dosyadan okunacağını belirten "-f" parametresi yazılır (#! /bin/awk -f) (bu değer sizin awk'yi kurup yapılandırırken seçtiğiniz seçeneklere göre değişebilir). Bu işaret ile yazmış olduğunuz yol ile awk yorumlayıcınızın binary dosyasının yolunu göstermiş olursunuz. İşletim sistemi satırların hepsini tek argümanmış gibi alır ve awk'ye geçirir.

   İşletim sisteminize bağlı olan ARGV[0] değişkenini, bazı sistemlerde yolu gösterilmiş olan awk yorumlayıcısını sadece adını bazılarında hem yolunu hem adını tutar veya bazılarındaysa program kodunu yazmış olduğumuz dosyaya vermiş olduğumuz ismi ("awk_prog_calisiyor" gibi) tutar. Bu nedenle bu değişkenin program dosyamızın ismini tuttuğuna güvenemeyiz.


   5.i.5 awk'de Açıklama

   Program dosyası oluştururken, program kodunun istediğimiz yerine, diğer kullanıcılar için açıklama mahiyetinde yazılar yazabiliriz. Bu yazıları "#" karakterinden sonra yazmamız gerekmektedir. Bu yazılar, awk tarafından dikkate alınmayarak çalıştırılmacakları için programda herhangi bir değişikliğe neden olmazlar. Basit bir program dosyası içeriği (awk_prog isimli dosya)

awk_prog
    # Bu bilgiler bu programı kulanacak diğer
    # kullanıcılar için yararlı olacak
    # birtakım bilgilerdir. Sizlere yardımcı
    # olması dileğimle awk Programcısı...
     BEGIN{
      print "Okan'ın awk Programı" # ekrana "Okan'ın awk Programı" katarını basar
     }
    

   Not : Eğer komut satırında yazdığımız programlara açıklama eklemek istiyorsak apostrof (tek tırnak) karakteri kullanmaktan kaçınmalıyız. Aşağıdaki örnekteki gibi apostrof kullanacak olursak :


    ]# awk '{ print "Merhaba" } # Okan'ın açıklaması'
    > Control-c
    ]#
    

   Kabuk alt satıra geçerek girişin devam etmesi için bekler. Çünkü program kodunun sonunu getirememiştir. Peki aşağıdaki gibi girersek ne olacağına bir göz atalım :


    ]# awk '{ print "Merhaba" } # Okan'ın açıklaması'
    > '
    awk: komut satırı:2: ölümcül: `açıklaması' okumak için açılamıyor (No such file or directory)
    

   Kabuk yine alt satıra geçerek girişin devam etmesi için bekler. Bu kez de kalıbı kapatmak için bir tırnak işareti daha koyacak olursak awk 'açıklaması' ifadesini girdi dosyası zannedip açmaya çalışacaktır.

   Apostrof (tek tırnak) karakterini kaçırmak için "\" karakteri ile kullanmanında bir faydası olmayacaktır. Özel bir karakter olan tek tırnağı kalıbın içinde kullanamayız. İlerde kabuğun tırnak kurallarına değineceğiz.


   5.i.6 Kabukta Tırnak (' veya ") Kuralları

   Kısayla normal arası uzunlukta awk programları için program kodunu komut satırından girmek çok daha uygun olacaktır. Girilen programı da apostrof (tek tırnak) karakterleri arasında yazmak en iyisidir. Bunun doğru olup olmadığını kabukta program kodu girerek veya geniş kabuk script parçaları yazarak deneyelim.

   awk 'program_kodu' girdi_dosyası1 girdi_dosyası2 ...

   Bir kere birlikte çalıştığımız kabuk hakkında temel bilgilere değinmemiz faydalı olacaktır. Anlatacağımız kurallar sadece bsh (Bourne Shell(kabuk))'da geçerlidir. Eğer siz csh (C Shell) kullanıyorsanız ona özel kuralları öğrenmelisiniz.

  • Tırnak işaretleri diğer (tırnak işareti olmayan) simgeleri sonraki tırnak işaretlerine kadar sıralayabilir. Kabuk, komut için bir argüman içindeki herşeyi devirli olarak yorumlar.
  • Komut üzerinde bazı karakterler '\' (tersbölü) karkteri ile kullanılabilir. Böyle kullanıldığı zaman bu karakter kabuktan kaçırılmış olur. Yani kabuk bu karakteri siler ve onun gösterdiği simgeyi sadece karakter olarak ele alır.
  • Açma ve kapatma karakterleri olarak tek tırnak işareti, arasındaki herşeyi muhafaza eder. Kabuk kelimesi kelimesine komut üzerindeki bu tek tırnak işaretlerini yorumlamaz ve pas geçer. Tek tırnakla ayrılmış bu komut yapısının içine tek tırnak karakterini gömmek imkansızdır (bazı özel metodlar haricinde).
  • Açma ve kapatma karakterleri olarak çift tırnak işareti, arasında çok daha fazla şeyi muhafaza edebilir. Farklı kabuklarda çift tırnak işaretlerinin ayıraç olarak kullanımı sonucunda komutun işlenişi farklı olacaktır.

    Kabuk tarafından işlenen çift tırnak karakteri, program kodu içerisinde bazı özel karakterlerin kaçırılması için kullanılabilir. '$', ''', '\' ve '"' karakterleri '\' karakteri ile birlikte kullanılarak, çift tırnak ayıracı arasında yazılmış kodda kabuktan kaçırılabilir (mesela '"' karakterini \" şekilnde yazarak).

        ]# awk "BEGIN{ print \"Okan'ın awk Programı\" }"
        
    

    Not : Tek tırnak karakterini çift tırnak karakteri arasında yazılmış bir ifadede kabuktan kaçırmaya gerek yoktur.
  • Çift tırnak karakteri "-F" parmetresiyle birlikte kullanılarak veri dosyasındaki alan ayıracının null-belirteç olarak belirlenmesine sağlanabilir. FS değerine "" ile NULL değerini atamak aşağıda gördüğümüz şekilde olabilir :

       awk -F "" 'program_kodu' girdi_dosyası1 girdi_dosyası2 ...

    Bu şekilde kullanarak girdi dosyasındaki alanların (sütunların) arasında herhangi bir karakter olmayacağını awk'ye belirtmiş oluruz. Ama aşağıdaki şekilde kulanmamalısınız :

       awk -F"" 'program_kodu' girdi_dosyası1 girdi_dosyası2 ...

    Çünkü "" NULL değer belirteci ile "-F" parametresi arasında en az bir karakter boşluk olmalıdır.

   Püf Noktası

   Program kodunu ' ' işaretlerinin içinde yazmakla " " işaretlerinin içinde yazmak arasında küçük farklar vardır. Ekrana ' işareti bastırılması gereken bazı özel durumlar karşısında kodu " " işareti arasında yazmak ' işaretini yorumlayıcıdan kaçırmamızı sağlayacaktır, " karakterini kaçırmak içinse \" şeklinde yazmalıyız.

   Kodu " " arasında yazdığımız bazı durumlarda yazdığımız kod çalışmayacaktır. awk bazı özel durumlar için " " yazım şeklini desteklemez. Eğer kodu " " işaretleri içinde yazarsak sütunları belirttiğimiz $1, $2, $3 ... değerlerini ekrana bastıramayız. " " işaretlerini sadece ekrana bir yazı bastırmak istediğimiz zamanlarda kullanabiliriz. ' ' işaretleri arasında kod yazmışsak ve ' karakterini ekrana bastırmak istiyorsak o zaman ' karakterinin ASCII kodunu yazarak bu karakteri ekrana bastırabiliriz.


    ]# awk 'BEGIN {print " \47 "}'
     '
   

   Veya aşağıdaki 1. örnekteki gibi ' ' ile tanımlanmış aralıkta, print fonksiyonunun " " aralığında '" "' ile yeni bir aralık açıp ' karakterini programdan kaçırabiliriz, hatta 2. örnekteki gibi yine ' ' ile tanımlanmış aralıkta, print fonksiyonunun " " aralığında ' ' karkterleri arasına \ (kaçırma) karakteri ile \' kullanım şeklinde ' karakterini yorumlayıcıdan kaçırabiliriz.


1. örnek
    ]# awk 'BEGIN {print " '" ' "' "}'
     '
   
2. örnek
    ]# awk 'BEGIN {print " '\'' "}'
     '
   


   5.ii İşlenecek Verinin Formatı

   Komutları işleyebilmek tablo formatında düzenli bir veri akışının olması gerekmektedir. Aşağıdaki iki örnekte olduğu gibi :

telefon_listesi
    isim        tarih       saniye  A:gündüz, B:gece, C:hafta sonu

    ali     2003/08/18  300 A
    okan        2003/08/19  1200    B
    murat       2003/08/21  650 A
    kemal       2003/07/20  100 A
    recep       2003/08/02  230 C
    sami        2003/09/01  400 C
    halil       2003/08/05  450 B
   

   Yukarıdaki tabloda kimin hangi tarihte gecemi, gündüzmü yoksa hafta sonumu kaç saniye konuşma yaptığı bilgilerini tutulmaktadır. bu tabloda her satır bir kayıttır ve bu kayıtlar çok sayıda sütunlardan oluşabilir. Bu sütunlar birbirlerinden boşluk veya tab karakterleriyle ayrılabildiği gibi aşağıdaki gibi "-" karakteriylede ayrılabilirler.


    isim-tarih-saniye-A:gündüz, B:gece, C:hafta sonu

    ali-2003/08/18-300-A
    okan-2003/08/19-1200-B
    murat-2003/08/21-650-A
    kemal-2003/07/20-100-A
    recep-2003/08/02-230-C
   

   Alanların (sütunlar) bu karakter ile ayrılmış olduğunu awk'ye -F parametresiyle belirtmek gerekir. Eğer böyle bir belirtme yapılmamışsa öntanımlı olarak tab yada boşluk karakterine göre işlem yapılır. Parametrelerden ilerde söz edeceğiz.


   5.iii Basit Örnekler

   Aşağıdaki awk program kodunda, "telefon_listesi" olarak programa verilen girdi dosyasi içerisindeki verilerde, "A" karakter dizisini arama ve böyle bir eşleştirmenin yapıldığı kayıtlar (satırlar) ekrana basılmaktadır ("A" yerine herhangi başka bir karakter veya katarda aranabilir. Genelde karakter gruplarına katar adı verilmektedir.)


    ]# awk '/A/ { if( NR != 1 ) print $0; }' telefon_listesi
   

   "A" karakterini/katarını kapsayan satırlar bulunduğunda, o satır "print $0" komutu ile ekrana basılır. "if(NR!=1)" (NR = NumberRow(satır numarası)) ifadesi ile de 1. satırdaki kayıt haricindekileri ekrana basması belirtilmektedir (Çünkü birinci satırda kayıtların hangi değerleri tuttukları hakkında bilgiler bulunmaktadır).

   "A" karakterinin "/" (slaş) karakterleri arasında yazılı olduğuna dikkat ediniz. Slaş arasında yazılmış olan kalıp aranacak kalıptır. Bu kalıp arama tipi ilerde daha detaylı anlatılacak olan düzenli ifadelere (RegularExpression) özgüdür. Belirtilen kalıp kelime parçalarının eşleştirilmesine izin verir. Kabuğa özel karakterlerin kabuk tarafından yorumlanmasını istemediğimiz için, awk programını tek tırnak içinde yazarız.


    ]# awk '/A/ { if( NR != 1 ) print $0; }' telefon_listesi
    ali             2003/08/18      300     A
    murat           2003/08/21      650     A
    kemal           2003/07/20      100     A
   

   awk kuralları içinde, kalıp veya yapılacak işin ikisinden biri yapılmayabilir, fakat her ikisi değil. Eğer kalıp yapılmıyorsa, o zaman yapılacak işlem her girdi satırı için yerine getirilir. Eğer yapılacak iş yapılmıyorsa, o zaman da kalıba göre öntanımlı olarak uygun satırlar tamamen ekrana basılır.

   Mesela az önceki örneğimizde, yapılacak işi program kodundan çıkaracak olursak (yani kıvrımlı parantezler ve arasındakileri), o zaman sadece "/A/" eşleştirmesi yapılacak ve buna uyan bütün satırlar ekrana baasılacaktır. "if(NR!=1) print $0;" ifadesini çıkarıpta kıvrımlı parantezleri tutacak olursak o zaman da boş işlem yapılacağını belirtmiş oluruz. Bu da hiçbir işlem yapılmaması demektir. Aşağıdaki gibi :


    ]# awk '/A/' telefon_listesi
    isim            tarih           saniye  A:gündüz, B:gece, C:hafta sonu
    ali             2003/08/18      300     A
    murat           2003/08/21      650     A
    kemal           2003/07/20      100     A

    ]# awk '/A/ {}' telefon_listesi
    ]#
   

   Çoğu pratik awk programı bir ya da iki satırdır. İlerdeki kısa örnekler, sizin, awk programlamaya atacağınız ilk adım olması açısından çok faydalı olacaktır. Bazı örnek programlarda henüz görmediğimiz bazı yapıları veya özellikleri içermektedirler. Örnekleri çoğunda "veri" isimli veri dosyası kullanılmaktadır. Sizde, size ait "veri" isimli herhangibir dosyayı da kullanabilirsiniz. İlerisi için, programlardaki bazı şeylerin nasıl yapıldığını sık sık not tutlmalısınız. Bazı noktalarda önceki örneklere dönüp tekrar gözden geçirerek, bir işlemi yaptırmanın farklı yollarıda olduğunu göreceksiniz.

  • En uzun girdi satırının uzunluğu ekrana basılmaktadır :

        ]# awk  '{ if( length($0) > mks_uzn ) mks_uzn = length($0);  } END { print mks_uzn; }' veri
        
    

  • Uzunluğu 60 karakterden kısa olan her satır ekrana basılmaktadır :

        ]# awk  'length($0) < 60' veri
        
    

    Bu ifade kendinin kalıbıdır. Öntanımlı olarak eşleşmeye uyan tüm satırlar ekrana basılacaktır.
  • "veri" dosyası içindeki en uzun satırın uzunluğu ekrana basılmaktadır :

        ]# expand veri | awk '{if( x < length() ) x = length(); } END{ print" Maksimum satır uzunluğu : " x; }'
        
    

    Önce girdi "expand" programı tarafından işlenerek içerisindeki tab karakterleri boşluk karakteri ile değiştirilir. Böylelikle uzunluklar, sağ kenara kadar gerçek uzunlukları ele alınarak karşılaştırılır.
  • İstenilen alan (sütun) sayısına sahip kayıtların ekrana bastırılması :

        ]# awk 'NF > 0' veri
        
    

    Bu yol, veri dosyasındaki boş satırların silinebilmesi için en iyi yoldur (veya tercihen, eski veri dosyasındaki boş satırları silerek yeni bir veri dosyası oluşturmanın en iyi yoludur).
  • 0 - 100 aralığında 10 tane rastgele sayının ekrana basılması :

        ]# awk 'BEGIN{ for ( i = 1 ; i <= 10 ; ++i ) print int( 100 * rand() ) }';
        
    

  • Listelenen dosyaların toplam boyutlarının byte cinsinden ekrana bastırılması :

        ]# ls -l dosyalar | awk '{ x += $5 } END{ print "Toplam Dosya Boyutu : "x" bytes"; }'
        
    

  • Listelenen dosyaların toplam boyutlarının kilobyte cinsinden ekrana bastırılması :

        ]# ls -l dosyalar | awk '{ x += $5 } END{ print "Toplam Dosya Boyutu : "( x + 1023 ) / 1024" K-bytes"; }'
        
    

  • Sistemdeki bütün kullanıcıların kullanıcı isimleri sıralanarak ekrana basılmaktadır :

        ]# awk -F : '{ print $1 }' /etc/passwd | sort
        
    

  • Veri dosyasındaki satırların sayısı ekrana basılmaktadır :

        ]# awk 'END{ print NR }' veri
        
    

  • Satır sayısı çift-sayı olan (mod 2'ye göre 0 olan) satırlardaki veriler ekrana basılmaktadır :

        ]# awk 'NR % 2 == 0' veri
        
    

    Eğer yerine 'NR % 2 == 1' ifadesini kullanacak olsaydık o zaman satır sayısı tek-sayı olan satırlardaki veriler ekrana basılacaktı. Bu örneği de kendiniz deneyip sonucuna bakabilirsiz.

   Girdileri bir dosyadan alan ve bu dosyadaki kayıtları işleyen bir örneğe daha açıklamalı olarak göz atalım.

   Kodlama sırasında hata yapmamak ve istediğimiz sonuçları elde edebilmek için kayıt dosyamızın içeriğine cat komutu kullanarak bir bakmalı ve yapısını iyice anlamalıyız. Örnek bir dosyanın (ornek.txt'nin) içeriğine göz atacak olursak :


    ]# cat ornek.txt
    -rw-r--r--    1 root     root         9167 Mar 12 19:38 gnome-vfs-mime-magic
    -rw-r--r--    1 root     root          920 Eyl  5  2002 im_palette-small.pal
    -rw-r--r--    1 root     root          955 Oca 23 17:01 krb5.conf
    -rw-r--r--    1 root     root         9498 Oca 16 22:47 mailcap
    -rw-r--r--    1 root     root         9407 Oca 16 22:47 mailcap.vga
    -rw-r--r--    1 root     root        99960 Mar 14 17:23 mime-magic.dat
    ...
   

   Amacımız "ornek.txt" isimli dosyada 9. alanı (sütunu) ve sonrada 5. alanı görüntülemektir. Diğer alanlar görmemezlikten gelinir. Biz daha önce "ornek.txt" isimli dosyanın içeriğine bakarak yapısı hakında bir fikir sahibi olmuştuk. Biliyoruzki 5. sütunda (alanda) sayısal bir veri yani dosyanın (dizinin) boyutu (byte cinsinden) tutuluyor. 9. satırda da string tipinde bir veri yani dosya ismi yer almaktadır.


    ]# awk '{print "Dosya adı : "$9 " - boyutu : "$5 " byte"; }' ornek.txt
    Dosya adı : gnome-vfs-mime-magic - boyutu : 9167 byte
    Dosya adı : im_palette-small.pal - boyutu : 920 byte
    Dosya adı : krb5.conf - boyutu : 955 byte
    ...
    ]# awk '{printf "Dosya adı : %20s  -  boyutu : %5d byte\n",$9,$5 }' ornek.txt
    Dosya adı : gnome-vfs-mime-magic  -  boyutu :  9167 byte
    Dosya adı : im_palette-small.pal  -  boyutu :   920 byte
    Dosya adı :            krb5.conf  -  boyutu :   955 byte
    ...
   

   Yukarıdaki komutların ikiside aynı işlemi yapar. Ancak ikincisi biraz farklı olarak, formatlı bir şekilde çıktıyı konsolda ekrana basar (C/C++ hakkında bilgi sahibi iseniz printf ile formatlı çıktının yaklaşık olarak aynı şekilde yapıldığının farkına varacaksınızdır). %20s ile 20 karakterlik bir alanda sağa dayalı olarak $9 string verisinin, %8d ile 8 karakterlik bir alanda sağa dayalı olarak $5 sayısal verisinin ekrana basılacağı belirtilmiştir.


   5.iv İki Kural İle Çalışma Örneği

   awk, bir anda, girdi dosyasının bir satırını işler. Herbir satır için, awk, herbir kural kalıbını çalıştırır. Eğer kalıplardan birkaçı eşleştirilirse o zaman o kalıplara uygun birkaç iş düzenli ardışıklıkla yerine getirilir. Hangi iş yapılırsa awk programında onu sonuçları meydana çıkar. Hiçbir kalıp eşleştirilmezse o zaman hiçbir iş yerine getirilmez.

   Bütün kurallara göre eşleştirilen o satır işlendikten sonra, awk sonraki satırı okur. Bu işlemler dosya sonuna erişilene kadar devam eder.

   Örnek awk programı :

    /A/  { print $0 }
    /21/ { print $0 }
  

   İki tane kuralı yukarıda belirttik. Birinci kuralda "/A/" ile aranılacak kalıbın katarını ve "print $0" ile de yapılacak işi, ikinci kuralda ise "/24/" ile aranılacak kalıbın katarını ve "print $0" ile de yapılacak işi programa gösterdik. Herbir kuralın yapılacak işi kendi kıvırcık paranteziyle kapalıdır.

   Bu awk programı "A" ve "21" katarlarını kapsayan herbir satırı ekrana basar. Eğer satır kalıpların her ikisini de kapsıyorsa, o zaman iki kere, yani herbir kural için bir kere ekrana basılır.

   Bunun ne olduğunu "telefon_listesi" "ay_listesi" isimlerinde iki tane veri dosyasını programımızda kullanarak deneyelim :


    ]# awk '/A/  { if( NR !=1 ) print $0 }
    >       /21/ { print $0 }' telefon_listesi ay_listesi
    ali             2003/08/18      300     A
    murat           2003/08/21      650     A
    murat           2003/08/21      650     A
    kemal           2003/07/20      100     A
    ocak            21      400     1
    subat           21      425     2
    nisan           21      350     2
   

   Az önce de bahsettiğimiz gibi "murat" ile başlayan satırdan (her iki kurala da uyduğu için) iki kere, yani herbir kural için bir kere ekrana basılmıştır.


   5.v Daha Karmaşık Bir Örnek

   Bu örnek size, awk programlarının tipi hakkında daha iyi bir fikir verecektir. Örnekte gösterilen awk programının çalışmasının özeti aslında başka bir programın çıktısını seçme ve yeniden düzenlemedir. Henüz görmediğimiz ifadeleri içeren bu programdaki herşeyi anlayamayabilirsiniz.


    ]# ls -l | awk '$6 == "Ağu" { toplam += $5 } END { print toplam }'
   

   Bu komut içinde bulunulan klasördeki son değiştirilme tarihi "Ağu" (Ağustos) (herhangi bir yılda) olan bütün dosyaların byte cinsinden boyutlarının toplamını ekrana basmaktadır. (Eğer C shell içinde çalışıyor olsaydınız ifadeleri noktalı virgül ile bitirmeniz ve alt satıra da geçmek için ters bölü işareti kullanmanız gerekecekti. Bu örnek Bourne shell veya Bash, GNU Bourne-Again shell de gösterilmştir.)

   Örnekteki, sistem komutu olan "ls -l" kısmı klasördeki dosyaları, boyutları ve son değiştirilme tarihleri ile listeler. Çıktıya dikat ediniz


    toplam 120
    drwxrwxr-x    9 seeyou   seeyou       4096 Ağu 21 16:38 awk/
    -rwxrwxrwx    1 seeyou   seeyou      64392 Ağu 24 18:11 awk1.html*
    drwxrwxr-x    2 seeyou   seeyou       4096 Tem 12 10:23 awk_manual/
    -rwxrwxrwx    1 seeyou   seeyou      44298 Ağu 21 16:25 awk_yedek.html*
   

   Birinci alan (sütun) okuma-yazma izni bilgilerini, ikinci alan dosyanın kaç tane bağı olduğunu, üçüncü alan dosyanın sahibini tanımlar. Dördüncü alan dosyanın grubunu tanımlar. Beşinci alanda dosyaların boyutları yer almaktadır. Altıncı, yedinci ve sekizinci alanlarda sırasıyla dosyanın son değiştirilme zamanı ay, gün ve saat biçiminde bulunmaktadır. Dokuzuncu alan ise dosyanın ismini içermektedir.

   "$6 == "Ağu"" ifadesi ile "ls -l" komutu ile alınan çıktıda, altıncı sütünda yer alan verinin değerinin, yani $6 değişkeninin değerinin "Ağu" değerine eşit olup olmadığı kontrol ediliyor. "Ağu" eşleştirmesinin sağlandığı her an, o satırda "toplam += $5" işlemi yerine getirilir. Yani burda, beşinci alandaki veri (dosya boyutu), toplam değişkenine eklenmektedir. Sonuçta, yani awk bütün girdi satırlarını okuduğu ve işlediği zaman, toplam değişkeninin değeri, eşleştirmenin yapıldığı satırlardaki dosyaların boyutlarının toplamına eşit olur. (bu program çalışır çünkü awk değişkenleri otomatik olarak 0 değeri ile oluşturulur.)

   "ls -l" komutu ile alınan çıktının son satırından sonra END bloğu içindeki iş yerine getirilir. END bloğu içinde "print toplam" komutu yer almaktadır ve bu komut ile toplam değişkeninin değeri, yani 112786 değeri ekrana basılır.

   Çok daha gelişmiş awk tekniklerini kapsayan programları daha ilerde ele alacağız. Daha ileri seviye awk programlamaya geçmeden önce, girdilerinizi ve çıktı görüntülerinizi awk'nin nasıl yorumladığını bilmelisiniz. Alanların işlenmesi ve print ifadesi ile çok kullanışlı ve etkili bazı raporlamalar meydana getirebilirsiniz.


   5.vi Temel Olarak

   - awk "file" (dosya), "record" (kayıt) ve "field" (alan) gibi kavramları tanır.
   - awk'ya girdi olarak belirlenen verilerin veya dosyaların satırlardan oluşmuş kayıtları barındırması gerekmektedir. awk'da bir satır bir kayıttır. Bir kayıtta bir veya birden fazla veri olabilir.
   - awk bir kaydı bir anda işler.
   - Kayıtlar boşlukla birbirinden ayrılmış belli sayıda sütunlardan oluşmuştur. Anlamlı bir ayrımın yapılabilmesi için bu sütunlar ayrı ayrı veriler olmalıdır.
   - $1 ile sütun sayısı 1 olana, $2 ile 2. sütuna erişilir. Diğer sütunlarada aynı şekilde erişilir. $0 ile tüm kayıt alınır.


   5.vii awk İfadelerinin Ayrı Satırlarda Yazılması

   awk programlarını içindeki herbir satır çok sık olarak ayrılmış ifade veya ayrılmış kural olarak yazılabilir :


    ]# awk '/A/  { if( NR !=1 ) print $0 }
    >       /21/ { print $0 }' telefon_listesi ay_listesi
   

   Fakat gawk yeni satırdan sonra şunları anlamazlıktan gelir :

   ,    {    ?    :    ||    &&    do    else

   Yeni satırda, bazı noktalarda ifade sonunu göz önünde tutmak gerekir. (Ayrılmış satırlardan sonra '?' ve ':' ikinci dereceden gawk uzantısıdır. '?' ve ':' burda üç operandla verilmişse koşula bağlı ifade tanımlanmıştır. Bunu Koşula Bağlı İfadeler başlığı altında ayrıntılı olarak göreceğiz)

   Eğer tek bir ifadeyi ortadan ikiye bölersek ve bunları ayrı iki satırda yazarsak o zaman ilk satırın sonunda program bitirilir, devam edebilmek için ilk satırın sonuna '\' (backslash) karakteri koymamız gerekmektedir. Satırın sonuna konan bu karakter devam ettirici karakter olarak yorumlanır. Bu, ifadenin herhangi bir yerinden hatta düzenli bir ifadenin bile tam ortasından ayrılmasına tamamen izin verir. Aşağıdaki gibi :


    ]# awk '/Bu düzenli ifade çoook uzun, bu nedenle\
    > sonraki satırda devam ediyor/ { print $1 }' veri_dosyasi
   

   Biz '\' devam ettirmesini bu döküman içerisinde genellikle kullanmadık. gawk'den beri satır uzunluğunda limit yoktur ve programın daha iyi okunabilir olması açısından hiçbir zaman buna tam anlamıyla ihtiyaç olmamıştır. Hem aynı sebepten hemde açıklık için örnek programlardaki ifadeleri çok kısa tutmaya özen gösterdik. Tersbölü devam ettiricisi, komut satırından dahil ederek kullandığımız program dosyalarındaki komutları yazarken çok faydalı olabilir. Fakat awk programlarınızın taşınabilirliği açısından düzenli ifadeleri veya katarları ortadan ikiye ayırmamak en iyisidir.

   Önemli : Tersbölü devam ettiricisi C-shell'de daha önceden tanımlanmadığı için çalışmaz.

   Tersbölü ile devam ettirme dosyalardaki awk programları için çalışır. Bir de POSIX-uyumlu kabuk (Bourne shell veya Bash, GNU Bourne-Again shell gibi.) kullanıyorsanız tek satırlık programlarda sağlanır. Fakat C-shell başka şekilde davranır. O hususta, takip eden yeni satırda iki tane tersbölü karakteri kullanmalısınız. Yine de C-shell kullandığınız zaman, her yeni satıra geçerken tersbölü karakterini kaçırmayı ihmal etmeyin (yani \\ şeklinde kullanmalısınız). Örnekteki C-shell'deki kullanımını görmektesiniz :


    ]# awk 'BEGIN { \
    ? print \\
    ? "awk Programlama" \
    ? }'
    awk Programlama
   

   '?' belirteci C-shell'de yeni satıra geçildiğinde ekrana basılır. Bash kabuğunda bu karakter yerine '>' karakteri ekrana basılır.

   awk satıra yönelik dildir. Her kuralın işi kalıpla eşleştirilen satır üzerinde yapılır. Kalıp ve işin ayrı satırlarda yazılabilmesi için tersbölü devam ettiricisi kullanmaktan başka yol yoktur.

   Tersbölü devam ettiricisini ve açıklama metinlerini beraber kullanamazsınız. Aşağıda gördüğünüz gibi '#' karakteriyle başlayan açıklama metninden sonra programı ayırırsak tüm satırdaki herşey görmemezlikten gelinecektir :


    ]# gawk 'BEGIN { print "awk Programlama" # oyun bozan açıklama \
    >                            BEGIN kuralı \
    > }'
    gawk: komut satırı:2:                              BEGIN kuralı \
    gawk: komut satırı:2:                              ^ parse error
   

   Gördüğünüz gibi ilk satır ikinci satırdan tersbölü devam ettiricisi ile ayrılmıştır. Fakat tersbölü-yeni satır kombinasyonu hakkında uyarıda bile bulunulmamıştır, çünkü tersbölü ('\') karakteri açıklamanın içinde gizlenmiştir. Böylelikle, BEGIN aralığı sözdizimi hatasına neden olmuştur.

   awk ifadelerini kısa bir kural içinde, tek bir satıra koyarak yazabilirsiniz. Bunun için bu kuralları noktalıvirgül ';' ile ayırmamız gerekir.

   Daha önceki örneğimiz üzerinde bu değişikliği yaptık ve aşağıdaki gibi yazdık :

    /A/  { print $0 } ; /21/ { print $0 }
  

   Not : Orjinal awk dilinde aynı satırdaki o kuralları noktalı virgülle ayırmak gerekli değildir. Noktalıvirgül, işlerdeki ifadelerin davranışına uyum için eklenmiştir.


   5.viii awk'daki Diğer Özellikler

   awk dili birkaç öntanımlı veya kurulum değişkeni (built-in değişkenler) sağlar. Bunlar programınızda kullanabileceğiniz, awk hakkında bilgiler verir. Diğer değişkenler programınızda verilerinizi awk'nın nasıl işleyeceğini kontrol edebilmenizi sağlar.

   Ek olarak awk, genel hesaplamalar ve katarlarla ilgili işlemler için birkaç kurulum fonksiyonu da (built-in fonksiyonlar) sağlar. gawk zaman işaretleyicileri ile çalışan, bit işlemesi yapan ve çalışma zamanı katar çevirisi için kurulum fonksiyonları sağlar.

   awk'yi anlatan dökümanların geliştiricileri olarak bizler sizlere bir çok değişken ve fonksiyon hakkında bilgi vereceğiz. İlerde bu kurulum değişkenleri ve fonksiyonları hakkında daha geniş bilgilere yer vereceğiz.


   5.ix awk Ne Zaman Kullanılır

   awk ile sizlere çok faydası olabilecek programların nasıl yapılacağının ve ne harika sonuçlara varabileceğinizin az çok farkına vardınız. Sizler faydalı programlar, gelişmiş kalıplar, alan ayıraçları, aritmetik ifadeler ve diğer seçim kriterleri kullanarak çok çok kompleks çıktılar alabileceksiniz. awk dili, diğer çok faydalı programlardan alınan çıktı bilgileri özeti gibi (mesela ls), geniş miktarda ham veriden raporlar hazırlamak için çok faydalıdır.

   awk dili ile yazılan programlar, aynı işlemi yapabilecek diğer dillerde yazılmış programlardan genellikle çok çok küçük boyutlarda olmaktadır. awk programları kolay oluşturulur ve kullanılır. awk programları genelde konsolda yazılır, hemen kullanılır ve sonra da atılır. Yorumlayıcı awk programlarından beri, derleme aşamasını oluşturan yaz-derle-test et-hata ayıkla tipi yazılım geliştirme işlemlerinden uzak durabilirsiniz.

   awk'de 8-bit mikroişlemciler için hazırlanmış programlar veya Prolog bilgisayarlara özel assembler mikrokodları dahil ederek kompleks programlar oluşturabilirsiniz. Bunula beraber awk'nin, karmaşık görevler için özel bir uğraş verme gibi bir yeteneği de vardır.

   Eğer kendi kendinize awk scriptleri yazdığınızda kendinizi, bunların birkaç yüz satır olduğunu söylerken bulursanız, o zaman daha farklı programlama dilleri kullanarak ne kadar satırda yazabileceğinizi düşünmelisiniz. Eğer sizin katar ve kalıp eşleştirme yeteneğince çok üstün bişeylere ihtiyacınız varsa, o zaman oldukça seçkin olan Emacs Lisp en iyi seçim olacaktır. Kabuk, katar ve kalıp eşleştirmede iyi olsa bile; ek olarak, etkili sistem araçlarının kullanımına da izin verir. Çok yaygın diller, örneğin C, C++ ve Java, sistem programlama ve geniş programların karmaşıklığının yönetimi için daha iyi imkanlar sunar. awk programlarıyla aynı işleve sahip programlar, bu dillerde çok fazla satır kod yazılmasını gerektirir, fakat daha kolay bir şekilde koruma sağlamak ve genellikle daha çok verim elde edebilmek için yinede ihtiyaç duyulur.




Bu Bölümün Başına Git (BÖLÜM I) - BÖLÜM II'ye git - BÖLÜM III'e git -

Yasal Açıklamalar:

   Bu belgeyi, Free Software Foundation tarafından yayınlanmış bulunan GNU Özgür Belgeleme Lisansının 1.1 ya da
daha sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. 
Bu Lisansın bir kopyasını http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.

    Linux, Linus Torvalds adına kayıtlı bir ticarî isimdir.

    Feragatname:
    Bu belgedeki bilgilerin kullanımından doğacak sorumluluklar, ve olası zararlardan belge yazarları
sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluğu uygulayana aittir.

    Tüm telif hakları aksi özellikle belirtilmediği sürece sahiplerine aittir. Belge içinde geçen herhangi bir terim 
bir ticarî isim ya da kuruma itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması 
ona onay verildiği anlamında görülmemelidir.

   


Teknik Bilgiler
Bilgisayar, Linux, Internet, WWW

http://teknik.ekitap.gen.tr/