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.
Ayracı boşluk karakteri haricinde bir karakter olarak tanımlamak için -F argümanı kullanılır.
Sitem üzerinde tanımlanmış değişkenleri alıp işleyebiliriz de.
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.
awk Dahili Değişkenler ve Bloklar:
awk ayrıca birçok dahili değişkene sahiptir:
NR: O an işlenen kaydın (genellikle satırın) numarası.
NF: O an işlenen kayıttaki alan (field) sayısı.
$0: Tüm satırın içeriği.
Ayrıca özel BEGIN ve END blokları bulunur:
BEGIN { ... }: awk herhangi bir girdi satırını okumadan önce çalıştırılır. Başlık yazdırmak veya değişkenleri başlatmak için kullanılır.
END { ... }: awk tüm girdi satırlarını okuduktan sonra çalıştırılır. Toplamları yazdırmak veya özet bilgi vermek için kullanılır.
Örnek:
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.
Global Değişiklik (g flagi):
Varsayılan olarak, sed'in s komutu bir satırda bulduğu ilk eşleşmeyi değiştirir. Eğer satırdaki tüm eşleşmeleri değiştirmek istiyorsanız, komutun sonuna g (global) bayrağını eklemelisiniz:
Yerinde Düzenleme (-i seçeneği):
sed normalde sonucu standart çıktıya yazar, orijinal dosyayı değiştirmez. Değişiklikleri doğrudan orijinal dosyaya uygulamak için -i seçeneği kullanılır.
DİKKAT:-i seçeneği tehlikeli olabilir, çünkü orijinal dosyanın üzerine yazar. Yanlış bir komutla dosyanızı bozabilirsiniz. Kullanmadan önce komutunuzu test etmeniz veya bir yedek oluşturmanız şiddetle tavsiye edilir.
Bazı sed sürümleri, -i ile birlikte bir uzantı belirterek otomatik yedekleme yapmanıza olanak tanır:
Eğer yedek istemiyorsanız (ve dikkatliyseniz) sadece -i kullanabilirsiniz:
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 karakterlerini ile değiştirip tablarla satırlarımızı gösterebiliriz.
Not: Basit satır numaralandırma için genellikle nl veya cat -n komutları daha pratik olabilir:
eaydin@dixon ~/calisma $ cat liste
PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ awk '{print q $0 q}' q="'" liste
'PHP'
'Python'
'Ruby'
'Go'
'Perl'
eaydin@dixon ~/calisma $ awk '{print q $0 q}' q='"' liste
"PHP"
"Python"
"Ruby"
"Go"
"Perl"
eaydin@dixon ~/calisma $ awk '{ if(substr($0,0,1)=="P") {print $0} \
else { print substr($0,0,1)}}' liste
PHP
Python
R
G
Perl
# Dosyadaki her satırın numarasını ve alan sayısını yazdır, sonunda toplam satır sayısını belirt
awk '{ print "Satır No:", NR, "Alan Sayısı:", NF, $0 } END { print "Toplam Satır:", NR }' liste
eaydin@dixon ~/calisma $ sed '/PHP/s/^/#/' liste
#PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed '/PHP/d' liste
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed '/^P/d' liste
Ruby
Go
eaydin@dixon ~/calisma $ sed 's/[hH]/<&>/' liste
P<H>P
Pyt<h>on
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed 's/.*[hH].*/<&>/' liste
<PHP>
<Python>
Ruby
Go
Perl
# 'liste' dosyasındaki tüm 'P' harflerini 'X' ile değiştir
sed 's/P/X/g' liste
# Değişiklikleri doğrudan 'liste' dosyasına uygula, orijinalini 'liste.bak' olarak yedekle
sed -i.bak 's/PHP/Hypertext Preprocessor/' liste
# Değişiklikleri doğrudan 'liste' dosyasına uygula (YEDEK YOK!)
# sed -i 's/PHP/Hypertext Preprocessor/' liste
eaydin@dixon ~/calisma $ cat liste
PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed '/^\s*$/d' liste
PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ cat liste
PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed 's/^[ ]*//' liste
PHP
Python
Ruby
Go
Perl
eaydin@dixon ~/calisma $ sed 's/[ ]*$//' liste
eaydin@dixon ~/calisma $ cat liste
PHP
Python
Ruby .
Go Kolay Öğrenilir
Perl
eaydin@dixon ~/calisma $ sed 's/ */ /g' liste
PHP
Python
Ruby .
Go Kolay Öğrenilir
Perl
eaydin@dixon ~/calisma $ sed -e '/[o|r]/s/^#*/#/' liste
PHP
#Python
Ruby
#Go
#Perl