Kalıp Tarama Ve İşleme Dili awk İle Linux'ta gawk Programlama (Bölüm I)
Okan Özeren okan.ozeren () students.comu.edu.tr
A. Murat Eren meren () comu.edu.tr
awk, adını tasarımcıları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.
29/08/2003 Adana, v.0.1b
İÇİNDEKİLER
- AWK VE GAWK'NİN TARİHİ
- TANIMLAMA
- GİRİŞ
- awk Kullanarak Neler
Yapabiliriz
- GEREKLİ YAZILIMLAR VE DESTEK
- BAŞLANGIÇ
- awk Programın Çalıştırılması
- Tek Satırlık awk
Programları
- Girdi Dosyası Olmadan awk İle
Çalışma
- awk'de Uzun Programlar
- Çalıştırılabilir
Programlar
- awk'de Açıklama
- Kabukta Tırnak (' veya ")
Kuralları
- İşlenecek Verinin Formatı
- Basit Örnekler
- İki Kural İle Çalışma Örneği
- Daha Karmaşık Bir Örnek
- Temel Olarak
- awk İfadelerinin Ayrı Satırlarda
Yazılması
- awk'daki Diğer
Özellikler
- awk Ne Zaman Kullanılır
- 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 :
Destek bağlantısı :
Proje bağlantısı :
Bilgi :
| Arayüzler |
: |
komut satırı |
| Programlar |
: |
igawk |
| Kaynak diller |
: |
C |
| Anlatılmış programlar |
: |
Diffutils, Grep, Patch |
Bilgi girişi :
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.
|
İlgili Benzer Yazılar:
Arama önerileri:
linux,
programlama,
awk,
gawk,
shell programlama,
bash,
csh,
sh,
unix,
Kaynak gösterecekler için referans:
"Awk Programlama I",
Okan Özeren
A. Murat Eren,
http://www.KlavyeMonitor.com/awk1.html
|