awk ve sed

GNU/Linux üzerinde awk ve sed ikilisi, standart girdi/çıktı işlemlerinde sıkça kullanılan, metin değişikliğine yarayan programlardır.

Her ne kadar her ikisi için de kompleks programlar yazılabiliyor olsa da, bu bölümde ana hatlarıyla nasıl kullanıldıklarını ve en sık işinize yarayacak yönlerini inceleyeceğiz.

awk

awk çoğunlukla tablarla ayrılmış verilerin belirli sütununu almakta veya sırasını değiştirmekte kullanılır. Örneğin ls -l çıktısını ayıklamak için aşağıdaki yöntem kullanılabilir.

 

eaydin@dixon ~/calisma $ ls -l *.txt -rw-r--r-- 1 eaydin eaydin 33 Nov 28 14:56 test2.txt -rw-r--r-- 1 eaydin eaydin 55 Nov 28 13:49 test3.txt -rw-r--r-- 1 eaydin eaydin 69 Nov 28 13:49 test4.txt -rw-r--r-- 1 eaydin eaydin 33 Nov 28 15:01 test.txt -rw-r--r-- 1 eaydin eaydin 33 Nov 28 15:00 yedek-test2.txt -rw-r--r-- 1 eaydin eaydin 40 Nov 28 15:00 yedek-test.txt eaydin@dixon ~/calisma $ ls -l *.txt | awk '{print "Dosya Adı: "$9" Boyut: "$5" kB"}' Dosya Adı: test2.txt Boyut: 33 kB Dosya Adı: test3.txt Boyut: 55 kB Dosya Adı: test4.txt Boyut: 69 kB Dosya Adı: test.txt Boyut: 33 kB Dosya Adı: yedek-test2.txt Boyut: 33 kB Dosya Adı: yedek-test.txt Boyut: 40 kB

 

Ayracı boşluk karakteri haricinde bir karakter olarak tanımlamak için -F argümanı kullanılır.

eaydin@dixon ~/calisma $ tail -n 5 /etc/passwd saned:x:113:123::/home/saned:/bin/false speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh eaydin:x:1000:1000:Emre,,,:/home/eaydin:/bin/bash nvidia-persistenced:x:115:124:NVIDIA Persistence Daemon,,,:/:/sbin/nologin sshd:x:116:65534::/var/run/sshd:/usr/sbin/nologin eaydin@dixon ~/calisma $ tail -n 5 /etc/passwd | awk -F":" '{print "Kullanıcı: "$1}' Kullanıcı: saned Kullanıcı: speech-dispatcher Kullanıcı: eaydin Kullanıcı: nvidia-persistenced Kullanıcı: sshd

 

Sitem üzerinde tanımlanmış değişkenleri alıp işleyebiliriz de.

eaydin@dixon ~/calisma $ X=10 eaydin@dixon ~/calisma $ echo $X 10 eaydin@dixon ~/calisma $ tail -n 5 /etc/passwd | \ awk -F":" -v val=$X '{print val " Kullanıcı: "$1}' 10 Kullanıcı: saned 10 Kullanıcı: speech-dispatcher 10 Kullanıcı: eaydin 10 Kullanıcı: nvidia-persistenced 10 Kullanıcı: sshd eaydin@dixon ~/calisma $ tail -n 5 /etc/passwd | \ awk -F":" -v val=$X '{print val+1 " Kullanıcı: "$1;val=val+1}' 11 Kullanıcı: saned 12 Kullanıcı: speech-dispatcher 13 Kullanıcı: eaydin 14 Kullanıcı: nvidia-persistenced 15 Kullanıcı: sshd

 

Dosya içeriğindeki satırları etrafında tırnakla gösterebilmek için, şöyle teknikler kullanılabilir.

 

Aşağıdaki örnek, dosyayı okuyup ilk karaktere bakıyor, ilk karaker P ise bütün satırı yazdırıyor, değilse sadece ilk karakteri yazdırıyor.

 

sed

sed dosyalar veya standart girdi üzerinde değişiklik yapmaya yarayan bir araçtır. Regular expression desteklediği gibi basit işlemler için de sıklıkla kullanılır. Örneğin yukarıda kullandığımız liste dosyasında içinde PHP geçen satırı # ile açıklama satırı haline getirmek isteseydik

 

Yukarıdaki komutun yaptığı işlem basittir. liste dosyası içinde PHP ifadesini saradı, s ile değişiklik yapılacağı bildirildi, ^ ile satırın başına # karakterinin ekleneceği ifade edildi.

Eğer bu satırı silmek isteseydik;

 

Eğer başında P geçen bütün satırları silmek isteseydik;

 

Çoğunlukla sed kullanımında s komutunu başta görürsünüz. Örneğin satırlarımızda h harflerini bulsak ve bu harften önce ve sonra < ile > işaretleri koymak istesek;

 

Öte yandan, sadece h harflerinin değil, içinde h harfi geçen satırın tamamını etiketlemek isteseydik,

 

Gördüğünüz gibi bu örneklerde, bulduğumuz satırı ifade eden karakter & ile gösteriliyor.

 

Yaygın Sed Kullanımları

Boş Satırları Silme

Dosyamıza boş satırlar ekleyelim.

 

Bu satırları silmek için aşağıdaki yöntem kullanılabilir,

 

Satır Öncesi Boşlukları Silme

 

Satır Sonrası Boşlukları Silme

 

Birden Fazla Boşluğu Tek Boşluk ile Değiştirme

 

Açıklama Satırı Ekleme

İçinde o veya r harfi geçen satırları # ile açıklama satırı haline getirelim.

 

Açıklama Satırlarını Kaldırma

Dosyanızda açıklama satırları çok çeşitli hallerde olabilir, aşağıdaki örneği inceleyelim.

 

Burada hem başında boşluk olan satırlar var, hem birden fazla # ile başlayan satırlar var, hem de #den sonra boşluk içeren satırlar var. Tamamını uncomment edebilmek için aşağıdaki yöntem kullanılabilir.

 

İçinde sadece 2 geçen satırların açıklamasını kaldırmak istersek,

 

Satır Numaralandırma

sed = dosyaismi kullanımı, her satırı tek tek yazdırıp, öncesine satır numarasını yazdırır. Örneğin;

 

Öyleyse sed ile bu satırlarda \n karakterlerini \t ile değiştirip tablarla satırlarımızı gösterebiliriz.