![]() 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ı.
|
( $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:
|