HomeMapIndexSearchNewsArchivesLinksAbout LF
[Top bar]
[Bottom bar]
[Photo of the Author] 
Javier Palacios Bermejo 

Yazar hakk�nda: 

Javier �spanya'daki bir �niversitenin Astronomi b�l�m�nde Prof. Dr. olarak �al��maktad�r. G�revi bir i� istasyonu grubunu �al��t�rmakt�r. �� yerinde g�nl�k i�lerinin tamam� Unix makineler �zerinde yap�lmaktad�r. Evvelki baz� problemlerinden ve deneyimlerinden �t�r� slackware Linux'u kullanmay� tercih etti. Linux, di�er markal� Unix sistemlerinden �ok daha iyi hale geldi. 

��erik

  1. Awk hakk�nda genel bilgi
  2. Bir problem (ve bir ��z�m)
  3. �leri d�zeyde AWK
  4. Kar���k sat�rlar �zerinde �al��ma
  5. Programlama dili olarak awk
  6. ��erdi�i k�t�phaneler
  7. Sonu�lar
  8. Daha fazla bilgi

Awk ile ilgili �rnekler: K�sa bir tan�t�m

[Ilustration] �eviri : Okan Kurtkaya ve �lknur �olak

�zet:
Bu makale AWK ile yapabilece�iniz hileler hakk�nda size baz� bilgiler vermektedir. Bu bir ders niteli�inde olmayacak ancak, size kullanabilece�iniz canl� �rnekler verecektir.



Ger�ekte, bu fikir LinuxFocus dergisindeki Guido Socher taraf�ndan yaz�lm�� bir �ift yaz�y� okuduktan sonra akl�ma geldi. Bunlardan biri, komutlar� bulmak ve anlatmak ile ilgili, bu bana g�sterdi ki komut sat�r�n� kullanan tek ki�i de�ilim. �o�unlukla k���k GUI'ler baz� �eylerin nas�l yap�ld���n� tam olarak s�ylemezler (bu y�ntem nedeniyle Windows y�llar �nce gitti). Di�er yaz�n�n konusu kurall� deyimlerdi. Her ne kadar bu yaz�da kurall� deyimlere sadece �ok az de�inilmi�se de awk'dan ve sed ve grep gibi di�er komutlardan da tam verim alabilmek i�in bunlar� bilmeniz gerekmektedir.

Anahtar soru awk'n�n ger�ekten kullan��l� bir komut olup olmad���d�r. Cevap kesinlikle evetdir! Normal bir kullan�c� i�in text dosyalar�n� �al��t�rabilmek yararl� olabilir, yeniden format atmak, vb...Ancak bir sistem y�neticisi i�in AWK son derece �nemli bir hizmettir. /var/yp/Makefile civar�nda dolan�n ya da �nceki yaz�lara bak�n. AWK her yerde kullan�l�r. 

Awk hakk�nda genel bilgi

Benim AWK hakk�ndaki ilk yaz�m, bunu unutmama yetecek kadar eskidir. K���k bir Cray'den ger�ekten b�y�k baz� ��kt�lar alarak �al��mak isteyen bir meslekta��m var. awk i�in Cray'deki ayr�nt�l� bilgiler b�l�m� ger�ekten k���k, ancak o, her ne kadar nas�l kullanaca��n� tam olarak anlam�� olmasa da AWK'�n arad��� �eye �ok benzedi�ini s�yledi.
Uzun bir zaman sonra, yeniden beraberiz, ba�ka bir yerde tesad�fi bir ba�lang��, ba�ka bir meslekta��m AWK'y� kullanarak ilk s�tunu tablodan geni�letmi�ti:

awk '  '{print $1}'   file
Kolay, �yle de�il mi? Bu basit taslak C'de karma��k bir programlamaya, ya da di�er derleyici veya aray�z programlar�na gerek duymaz. Bir sat�r AWK bunu halleder.

Bir zamanlar bir derste s�tunlar� geni�leterek dosyalar�n ad�n� de�i�tirme gibi baz� �eyleri yapabilece�imizi ��renmi�tik:
ls -1 pattern | awk '{print "mv "$1" "$1".new"}' | sh

... ve daha fazlas�. �nceki �rnekte sed veya grep'i bir arada kullanmak bize daha g��l� ara� sa�lam��t�r.

  1. isim i�inde yeniden adland�rma yapmak

  2. ls -1 *old* | awk '{print "mv "$1" "$1}' | sed s/old/new/2 | sh
    (bununla birlikte baz� durumlarda �al��mayabilir, file_old_and_old da oldu�u gibi)
  3. sadece dosyalar� silmek (rm'i yaln�z kullanarak yap�labilir, ancak 'rm -r' gibi bir yeniden adland�rma i�in ne denilebilir)

  4. ls -l * | grep -v drwx | awk '{print "rm "$9}' | sh
    (yine garip isimlerde ya da �al��ma izinlerinde �al��mayabilir). Bunu kendinize ait bir dizinden ba�ka yerde �al��t�r�rken dikkatli olun. Dosyalar� sileriz!
  5. sadece dizinleri silme

  6. ls -l | grep '^d' | awk '{print "rm -r "$9}' | sh
    (Bence bu her durumda �al���r, ve bunu ls -p | grep /$ | wk '{print "rm -r "$1}' yazarak d�zeltebiliriz )
    Bunu kendi dizininizden ba�ka yerde denerken dikkatli olun. Dosyalar� sileriz!
G�rd���n�z gibi ayn� hesaplamalar �st �ste tekrarland���nda AWK ger�ekten yard�mc� oluyor... ve bunun haricinde �o�unlukla bir �eyi 20 kere yapmaktansa AWK ile program yazmak �ok daha e�lenceli olmaktad�r.

Her ne kadar awk-command ismini kullanacak olsak da, awk asl�nda bir �e�it komut ismi de�ildir. awk, C ile uyu�an bir �ok s�zdizisine sahip bir programlama dilidir. Bir aray�z dilidir ve awk aray�z� (interpreter) verilen bilgileri i�ler.

Buyru�un kendisi ile ilgili:

# gawk --help
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
        gawk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options:
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
        -m[fr] val
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W help                 --help
        -W lint                 --lint
        -W lint-old             --lint-old
        -W posix                --posix
        -W re-interval          --re-interval
        -W source=program-text  --source=program-text
        -W traditional          --traditional
        -W usage                --usage
        -W version              --version

Buglar�  Cc: [email protected] ile [email protected] adresine bildirin,
Buyruk sat�r�nda programlar� sadece (') kesme ile ay�raca��m�za, bunlar� bir dosyaya yazabiliriz, ve onu -f se�ene�i ile �a��rabiliriz, ayr�ca yazd���m�z programa baz� �ok iyi bilinen de�i�kenleri ekleyebilmek i�in buyruk sat�r�nda -v var=val buyru�unu kullan�r�z.

Awk, zor ��renilen ve tablolar� y�netmeye yap�land�r�lm�� bir dildir. Yani, i�erideki bir alanda gruplanabilen ve kaydedilebilen baz� bilgiler. Buradaki avantaj, kaydedilebilen bilgilerin (ve ayn� zamanda alan�n) olduk�a esnek olmas�d�r.

Awk olduk�a g��l�d�r. Bir sat�rl�k kay�tla �al��mas� i�in tasarlanm��t�r, fakat bu nokta biraz gev�ek olabilir. Benzerliklerin baz�lar�n� g�rebilmek i�in, baz� ders verici (ve ger�ek) �rneklere g�z ataca��z.
 

  • Tablolar� yazmak olduk�a kolay bir yol

  • Belki, bir yerden al�nan ASCII tablolar�n� yazmak zorunda kalm��s�n�zd�r. �rne�in, hostname, ethernet ve bir listedeki IP numaralar�. Bu tablolar �ok b�y�k oldu�u zaman onlar� okumak �ok g�� hale gelebilir ve bunlar� LaTeX'de g�r�nt�lenmi� olarak listelemek isteyebilirsiniz ya da en az�ndan daha iyi bir bi�imde. E�er tablo basitse (ve/veya awk kullanmay� iyi biliyorsak), �ok zor de�ildir.
     
    BEGIN {
      printf "LaTeX preample"
      printf "\\begin{tabular}{|c|c|...|c|}"
      }
    { printf $1" & "
      printf $2" & "
      .
      .
      .
      printf $n" \\\\ "
      printf "\\hline"
      }
    END {
      print "\\end{document}"
      }
    Asl�nda, bu bir generic program de�ildir, fakat hemen ba�l�yoruz...
    (�ift backslash'lar (\) gereklidirler ��nk� bunlar kabuk ��k�� karakterleridir.)
     
  • ��kt� dosyalar�n� dilimlemek

  •  

    SIMBAD di�er �eyler aras�nda astronomiksel nesnelerin veritaban�d�r, g�ky�z� �zerinde bir ba�lang�� konumu belirler. Ge�mi�te bir keresinde baz� nesnelerin �evresinde haritalar �izebilmeye gerek duydum. Aray�z, sonu�lar� metin dosyalar�nda kaydetmeyi sa�lar, ve bu konuda iki yakla��m�m vard�: her nesne i�in bir dosya yaratmak, ya da onu tam bir girdi listesiyle beslemek, ben awk'� b�y�k ��kt� k�t�klerini par�alara ay�rmak i�in kullan�yorum. A��k�a, baz� ��kt� karakterlerinden avantaja gereksinimim vard�.

    1. Her istem a�a��daki gibi bir bi�im ile ba�l�k �retir. 

    2. ====> name : nlines <==== 
      Birinci ba�l�k bize yeni bir nesne ba�lad���n� bildirir ve d�rd�nc� ise nesnenin ne kadar giri�e sahip oldu�unu g�sterir (buna ra�men veri �ok fazla gerekli de�ildir.) 
    3. '|' karakteri,  farkl� s�t�nlar� i�aretlemek i�in liste ��kt�lar�nda kullan�l�r. Bu, ��kt�y� kontrol edecek fazladan iki d�zg� sat�r�na gerek duyar ve ben sadece ilgilendi�im alanlar� al�r�m.
    ( $1 == "====>" ) {
      NomObj = $2
      TotObj = $4
      if ( TotObj > 0 ) {
        FS = "|"
        for ( cont=0 ; cont<TotObj ; cont++ ) {
            getline
            print $2 $4 $5 $3  >> NomObj
            }
        FS = " "
        }
      }
    NOT: Asl�nda, nesne ad� geri g�nderilmedi, ve o biraz daha karma��kt�, ancak bu ders niteli�indeki bir �rnek olarak verilmi�tir.
  • Posta d�ng�s�yle oynamak
  • BEGIN {
      BEGIN_MSG  = "From"
      BEGIN_BDY  = "Precedence:"
      MAIN_KEY   = "Subject:"
      VALIDATION = "[MONTH REPORT]"
     
      HEAD = "NO"; BODY = "NO"; PRINT="NO"
      OUT_FILE = "Month_Reports"
      }
     
      {
     
      if ( $1 == BEGIN_MSG ) {
        HEAD = "YES"; BODY = "NO"; PRINT="NO"
        }
     
      if ( $1 == MAIN_KEY ) {
        if ( $2 == VALIDATION ) {
          PRINT = "YES"
          $1 = ""; $2 = ""
          print "\n\n"$0"\n" > OUT_FILE
          }
        }
     
      if ( $1 == BEGIN_BDY ) {
        getline
        if ( $0 == "" ) {
          HEAD = "NO"; BODY = "YES"
        } else {
          HEAD = "NO"; BODY = "NO"; PRINT="NO"
          }
        }
     
      if ( BODY == "YES" && PRINT == "YES" ) {
        print $0 >> OUT_FILE
        }
    
      }
    Belki bir posta listesini y�netiyor olabiliriz ve  zaman zaman, baz� �zel mesajlar (�rne�in, ayl�k raporlar) �zel bir bi�imde ('[MONTH REPORT] month , dept' gibi konularla) listeye eklenebilir. Aniden, y�l�n sonunda b�t�n bu mesajlar� di�erlerinin yan�na kaydederek bir araya getirmeyi tasarlar�z. 
    Bu, posta d�ng�s�n� soldaki programdaki awk ile birlikte �al��t�r�rsak olabilir. 

    Ki�isel bir dosyada yaz�lan raporlar�n her birini biraraya getirmek demek, fazlal�k �� tane d�zg� sat�r� demektir. 

    NOT: Bu �rne�in tahmin etti�im gibi posta d�ng�s�n� yap�land�rd��� kabul edildi. Asl�nda ger�ek bi�imi bilmiyorum, ama bu program benim tesisat�mda �al��maktad�r (tabi yine baz� ilgin� durumlarda �al��mayabilir).
     Bu gibi programlar�n planlanmas� sadece 5 dakika al�r ve  5 dakika da yazmas� tutar (veya, en e�lenceli yoluyla, hi� d���nmeden, sadece deneme ve hatalarla 20 dakikadan fazla s�rer).

    awk'� ba�ka bir �ok taslak i�in kulland�m (basit bir veritaban�ndan al�nan bilgilerle bir a� sayfas�n� otomatik olarak meydana getirme) ve awk programlamas� hakk�nda bir �ok �eyin yap�labilece�ine emin olacak kadar �ok �ey biliyorum.
    Sadece hayal g�c�n�z� u�u�a b�rak�n.

    Bir problem

    (ve bir ��z�m)

    Problemimiz awk'�n m�kemmel tabular bilgisine gereksinim duymas�d�r, hatas�z, awk sabit geni�likteki s�tunlarla �al��maz. E�er awk'�n girdisini kendimiz haz�rlarsak bu sorun te�kil etmez: alanlar� ay�rmak i�in ortak olmayan bir �ey se�in, daha sonra onu FS ile yerle�tirece�iz ve hallettik say�l�r!!! E�er �oktan bir girdimiz varsa bu biraz daha sorunlu olabilir, ��nk� alanlar�n ay�r�c� karakteri (mesela FS'in bir bo�luk alan� vard�r, bu nedenle baz� birle�ik kelimeler bir problem olabilir. Mesela bunun gibi bir tablo: ) sorun meydana getirebilir. 
    1234  HD 13324  22:40:54 ....
    1235  HD12223   22:43:12 ....
    Bunu awk ile ele almak zordur. Benzeri girdiler bazen yap�lmas� gereken buyruklar i�erebilir. Bunun yan�nda, herhangi bir veri girdisi homojen olmad���ndan bu biraz benzer yap�dad�r. E�er bu karakterlerden yaln�zca bir s�tunum varsa, problemi ��zebiliriz (e�er bir jenerik b�l�m�nde birden fazla s�tunun nas�l yap�laca��n� bilen varsa, l�tfen beni haberdar etsin!). 
    Bir keresinde, bu tablolardan yukar�da tan�mlanana benzer yap�da bir tanesiyle kar��la�t�m. Her zaman oldu�u gibi, eklenen bo�luklar ile birlikte, bu s�tundan sonraki bir s�tunu kullanarak s�n�fland�rma yapt�m. G�m�l� alanlarda da ayn� sorunu veren sort +/-n.m ile bir �ok kez denedim.
    Birden akl�ma geldi, benim ay�rmak istedi�im s�tun sonuncusuydu ve awk ge�erli kay�tta ne kadar alan ayr�laca��n� biliyor. Bu nedenle, sonuncuyu �al��t�rabilmek i�in yeterlidir (bazen $9, ve bazen $11, ama her zaman NF). G�n�n sonunda, istenilen sonu� elde edilmi� olur: 
    {
      printf $NF
      $NF = ""
      printf " "$0"\n"
    }
    Bu bana girdiye e�it bir ��kt� verir, ancak son s�tunla ilk pozisyona ��kar. A��k�a, bu metod sondan ba�layarak ���nc� alana al�n�r, veya her zaman ayn� de�ere sahip olan bir kontrol alan�ndan sonraki alana al�n�r. 
    Son s�tun ilk pozisyonuna hareket ettikten sonra, veriyi herhangi bir problemle kar��la�madan sort edebiliriz. 
    Sadece fikirlerinizi ve hayal g�c�n�z� kullan�n.

    �leri d�zeyde AWK

    Kar���k sat�rlar �zerinde �al��ma

    �u ana kadar, neredeyse b�t�n �rnekler b�t�n girdi dosyalar� sat�rlar� �zerinde i�lem yapmaktad�r. Ama, el kitab� sayfas�nda da yer ald��� gibi, sadece birka� girdi sat�r� �zerinde i�lem yapabilmek m�mk�nd�r. Birtanesi, sat�rlar�n kar��la�abilece�i farkl� durumlarda komutlar gurubuna �nc�l�k etmelidir. Uydurma durumu olduk�a esnek olabilir, basit kurall� bir ifadeden baz� alanlar�n kapasitesini ��renip, �zel yerel operat�rlerle durumlar�n� gurupland�rarak, onlar� de�i�tirebilirsiniz.

    Programlama dili olarak awk

    Di�er proglamlama dillerinde oldu�u gibi, awk b�t�n gerekli ak�c� kontrol yap�lar�n� yerine getirir, operat�rleri olabildi�ince iyi ayarlar ve say�larla ve s�zc�k dizileriyle u�ra�aran fonksiyonlar� �nceden tasarlar. S�z dizisi C'ye benzer.

    Ve, function anahtar s�zc��� ile kullan�c�n�n belirli fonksiyonlar� kullanabilmesi ve bir girdi dosya sat�r�n� �al��t�r�yormu� gibi birle�ik buyruklar� yazabilmesi elbette m�mk�nd�r. �l��lm�� ortak de�erlerden farkl� olarak, awk'�n dizilerin boyutlar�n� belirleyebilme gibi bir �zelli�i de vard�r.

    ��erdi�i k�t�phaneler

    Di�er b�t�n proglamlama dillerinde oldu�u gibi, olduk�a yayg�n fonksiyonlar vard�r ve bir d�zg� par�as�n� kesip yap��t�rmak rahats�zl�k vermeye ba�lar. K�t�phanelerin ��kmas�n�n nedeni budur. awk'�n GNU versiyonu ile, awk program� i�erisinde i�ermek m�mk�nd�r. Ancak bu olabilecek �eylere d��ardan bir bak�� ve bu makalenin konusu d���nda bir �eydir.

    Sonu�lar

    Kesinlikle, awk benzer ama�lar i�in tasarlanm�� di�er ara�lar kadar g��l� olmayabilir. Ancak olduk�a k�sa zamanlarda gereksinimlerimize tam olarak cevap veren k���k programlar yazabilmesi gibi b�y�k bir avantaja sahiptir.

    AWK kurulma ama�lar� i�in olduk�a uygundur: Veriyi sat�r sat�r okuyun ve sat�rlardaki s�z dizilerine ve  kal�plara kadar devam edin.

    /etc/password gibi dosyalar yeniden bi�imlendirme ve AWK ile �al��t�rma i�in idealdir. AWK bu gibi g�revler i�in paha bi�ilmezdir.

    Tabi AWK yaln�z de�ildir. Perl g��l� bir rakiptir fakat yine de birka� AWK hilesi ��renmeye de�er.

    Daha fazla bilgi i�in

    Olduk�a temel ve iyi belgelendirilmemi� komutlar, ama �evrenize bak�nd���n�zda bir �eyler bulabilirsiniz. Genellikle, bu komutu i�eren unix hakk�ndaki b�t�n kitaplar, ama onlardan sadece baz�lar� kullan��l� bilgilerin detaylar�n� verir. Yapabilece�imiz en iyi �ey, elimize ge�irdi�imiz herhangi bir kitab�n sayfalar�n� kar��t�rmak, ��nk� i�inize yarayacak bilgiyi nerede bulaca��n�z� asla bilemezsiniz.

    Bu sanal y�renin bak�m� LinuxFocus yaz�m gurubu taraf�ndan yap�lmaktad�r 
    � Javier Palacios Bermejo  
    LinuxFocus 1999
    �eviri bilgileri: 
    es -> -- Javier Palacios Bermejo
    es -> en Javier Palacios Bermejo,Ruben Sotillo, Manuel Rodriguez
     
    1999-09-14, generated by lfparser version 0.6