19
Konuya ait anahtar kelimeler : AWK - Bölüm 1 Bu dersimizde önceki dersimizde işlediğimiz "sed" komutuna benzer bir komut olan "awk" programlama dilini işleyeceğiz. "Awk" bir veri düzenleme editörüdür. "Awk" hakkında daha geniş bilgiye "man awk" komutu ile ulaşabilirsiniz. "Awk" komutu verileri sütunlara ayırarak kullanmamızı sağlamaktadır. Unix/Linux sistem değişkenleri: Daha sonra üzerinde ayrıca duracağımız sistem değişkenlerini kısaca açıklayalım. Unix/Linux sistemlerde bazı sabit, önceden ayarlanmış değişkenler bulunmaktadır. Mesela: $1: İlk değişken. $2: İkinci değişken. $n: N. değişken. anlamlarına gelmektedir. Awk kullanımı : awk komutlar dosya_adi şeklinde olmaktadır. Daha önceden gördüğümüz "grep" ve "sed" komutları verileri satır satır işleme alıyorken, "awk" verileri önce satır daha sonra sütunlara ayırarak işleme almaktadır. Konunun esas mantığı kısaca budur. Şimdi örnek çalışma dosyamızı beraberce hazırlayalım. "script" çalışma klasörü içerisine girelim ve "awkex" adında bir dosya oluşturalım. Dosya içeriğini aşağıdaki şekilde düzenleyelim ve kaydedelim.
[alax@alax ~]$ cdd [alax@alax script]$ > awkex [alax@alax script]$ nano awkex İsim Soyisim Yaş Cinsiyet Ahmet Budak 25 E Asuman Budak 24 K Ali Cangöz 13 E Aslı Cangöz 11 K [alax@alax script]$
Yukarıdaki örnek dosyamızda bulunan; "İsim" ve altındakiler -> $1 "Soyisim" ve altındakiler -> $2 "Yaş" ve altındakiler -> $3 "Cinsiyet" ve altındakiler -> $4 şeklinde değişkenlere atanmaktadır. Mesela $1 değişkenini ekrana yazdırdığımız zaman ekrana; İsim Ahmet Asuman Ali Aslı yazacaktır. Bu sütunun hepsi "$1" değişkenin değeridir. Dolayısıyla "$3" değişkenin değeri "Yaş"ın olduğu sütundur. Şimdi ilk örneğimizi yapalım. Öncelikle "awkex" dosyamız içerisindeki birinci sütunu($1) ekrana yazdıralım. Yazdırma işlemi, awk '{print $N..}' dosya_adi şeklinde olmaktadır.
[alax@alax script]$ awk '{print $1}' awkex İsim Ahmet Asuman Ali Aslı [alax@alax script]$ awk '{print $4}' awkex # Dördüncü sütunu yazdıralım. Cinsiyet E K E K [alax@alax script]$
Gördüğünüz gibi çok basit. Şimdi başka bir örnek yapalım. Mesela dosya içerisindeki verileri "cat" komutu ile çekelim ve her satır çekme işleminde "awk" kullanarak kişileri isimleri ve soyisimleri ile beraber yazdıralım. "cat" komutu veri çekerken satır satır çeker ve ekrana yazdırır. Dolayısıyla ilk çektiği satırdaki "$1 $2 $3 $4 ..$n" değişkenlerini istediğimiz gibi kullanıp daha sonra istediğimiz formatta ekrana yazdırabiliriz. Örneğimize geçelim. Örneğimizde isimlerin olduğu değişkenin "$1", soyisimlerin olduğu değişkeninin ise "$2" değişkeni olduğunu biliyoruz.
[alax@alax script]$ cat awkex | awk '{print $1 $2}' İsimSoyisim AhmetBudak AsumanBudak AliCangöz AslıCangöz [alax@alax script]$
Evet istediğimiz verileri çektik ve ekranda yazdırdık. Fakat gördüğünüz gibi İsim ve Soyisimlerin arasında hiç boşluk yok. "print" komutu "yazdır-göster" anlamına gelmektedir. Değişkenlerin yazılması sırasında sadece değişken adları işleme alınır, yani değişkenler arasındaki mesafe işleme alınmaz. Siz $1 ve $2 arasına istediğiniz kadar boşluk koyun yine aynı sonucu alırsınız. Eğer değişkenler ile istediğiniz bir kelime yada kelime grubunu da yazdırmak istiyorsanız o zaman çift tırnak " kullanarak, nerede olmasını istiyorsanız oraya eklemeniz gerekiyor. Mesela örneğimizde İsim ile Soyisim arasında boşluk olmasını istiyorsak o zaman iki değişken arasına çift tırnaklar arasında boşluk atmamız gerekmektedir. Şimdi örneğimizi tekrardan yapalım.
[alax@alax script]$ cat awkex | awk '{print $1" " $2}' İsim Soyisim Ahmet Budak Asuman Budak Ali Cangöz Aslı Cangöz [alax@alax script]$
Tabi bazı isimlerin kısa olmasından dolayı tam olarak eşit mesafede yazılmayabilir, bunun şu anda pek bir önemi yok. Not: Awk kullanımında değişkenler çift tırnak arasına YAZILMaZ. Yazıldığı takdirde normal bir kelime gibi algılanıp yazdırılırlar. Shell komut satırına bazen çok uzun komutlar yazabiliyoruz ve bu görüntüde ne yazdığımızı dahi zor anlıyoruz. Bunun çözümü ise alt satırdan devam et anlamına gelen ters eğik çizgidir "\". Ters eğik çizgi ekledikten sonra komutlarımızı yazmaya devam edebiliriz, her ters eğik çizgiden sonra ENTER ile alt satıra geçerek komutlarımızı tamamlarız. Şimdi yukarıdaki örneğimizi bu şekilde kullanalım.
[alax@alax script]$ cat awkex | \ awk '{print $1" " $2}' İsim Soyisim Ahmet Budak Asuman Budak Ali Cangöz Aslı Cangöz [alax@alax script]$
Şimdi "script" klasörü içerisinde bulunan dosyaları; -listeleyelim, listeleme işini "-h" parametresi ile daha güzel okunabilir şekilde yapalım, -her dosya adını boyutu ile daha güzel anlaşılır şekilde yazdıralım. Hangi değişkenin hangi sütuna sahip olduğuna dikkat ediniz. Aşağıdaki dosya içeriğine bakacak olursanız dokuz(9) adet değişken sütunu bulunmaktadır. İlk değişken sütunu($1) ""-rw-r--r-- 1" olan kısımlar ve son değişken sütunu($9) dosya adları olan "a_dosya.txt" kısımdır. Dosya boyutları değişken sütunu ise "$5" değişkeninde olacaktır.
[alax@alax script]$ ls -ldh * -rw-r--r-- 1 alax alax 1.4K Nov 14 16:16 a_dosya.txt -rw-r--r-- 1 alax alax 160 Nov 15 23:05 awkex -rw-r--r-- 1 alax alax 1.4K Nov 14 16:33 _dosya.txt -rwxr--r-- 1 alax alax 49 Oct 25 01:51 script1.sh -rwxr--r-- 1 alax alax 512 Oct 25 14:50 script2.sh -rwxr--r-- 1 alax alax 13 Oct 25 14:51 script3.sh -rwxr--r-- 1 alax alax 2.0K Nov 13 15:57 script4.sh -rw-r--r-- 1 alax alax 138 Nov 14 15:06 sedex -rw-r--r-- 1 alax alax 268 Nov 14 16:08 sed.txt -rw-r--r-- 1 alax alax 195 Nov 14 16:14 selam.txt [alax@alax script]$ ls -ldh * | \ awk '{print $9 " adlı dosyanın boyutu: "$5" ."}' a_dosya.txt adlı dosyanın boyutu: 1.4K . awkex adlı dosyanın boyutu: 160 . _dosya.txt adlı dosyanın boyutu: 1.4K . script1.sh adlı dosyanın boyutu: 49 . script2.sh adlı dosyanın boyutu: 512 . script3.sh adlı dosyanın boyutu: 13 . script4.sh adlı dosyanın boyutu: 2.0K . sedex adlı dosyanın boyutu: 138 . sed.txt adlı dosyanın boyutu: 268 . selam.txt adlı dosyanın boyutu: 195 . [alax@alax script]$
Bir sonraki dersimizde "awk" kullanımına devam edeceğiz. Lütfen bu derste öğrendiklerinizi kendi kendinize örnekler yaparak pekiştirmeye çalışınız.