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: |
Ö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:
|
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.
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: arnold@gnu.ai.mit.edu ile bug-gnu-utils@prep.ai.mit.edu 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.
BEGIN { printf "LaTeX preample" printf "\\begin{tabular}{|c|c|...|c|}" } |
{ printf $1" & " printf $2" & " . . . printf $n" \\\\ " printf "\\hline" } |
END { print "\\end{document}" } |
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ı.
====> 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.) |
( $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. |
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). |
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.
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.
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.
Bu
sanal yörenin bakımı LinuxFocus yazım gurubu tarafından yapılmaktadır
© Javier Palacios Bermejo LinuxFocus 1999 |
Çeviri bilgileri:
|