Linux komut satırında yapılandırılmış metinleri, log dosyalarını veya CSV/tablo formatındaki çıktıları analiz etmek istediğimizde en yetenekli araç Linux awk komutu olur. Adını geliştiricileri Alfred Aho, Peter Weinberger ve Brian Kernighan’ın baş harflerinden alan awk, basit bir komuttan çok tam teşekküllü bir metin işleme ve raporlama programlama dilidir.
Bu rehberde, awk komutunun sütun mantığını, filtreleme kurallarını ve sistem yönetiminde hayat kurtaran pratik kullanım örneklerini ele alıyoruz.
awk Komutunun Temel Çalışma Mantığı
awk, girdi akışını satır satır okur ve her bir satırı varsayılan olarak boşluk veya sekme (tab) karakterlerine göre sütunlara (alanlara – fields) ayırır.
Temel sözdizimi:
awk 'koşul { eylem }' dosya_adi
Eğer herhangi bir koşul belirtilmezse, süslü parantez { } içindeki eylem tüm satırlara uygulanır.
Temel Alan (Sütun) Değişkenleri:
$0: Satırın tamamını temsil eder.$1,$2,$3…: Sırasıyla 1., 2. ve 3. sütunları temsil eder.$NF: Satırdaki en son sütunu temsil eder (Number of Fields).NR: O an işlenen satır numarasını tutar (Number of Records).NF: O anki satırda kaç adet sütun olduğunu belirtir.
Basit Sütun Yazdırma Örnekleri
Örneğin, ls -l çıktısından yalnızca dosya izinlerini ve dosya adını yazdırmak için 1. ve 9. sütunları seçebiliriz:
ls -l | awk '{print $1, $9}'
Dosyadaki her satırın kaç kelimeden oluştuğunu ve son kelimesini yazdırmak için:
awk '{print "Kelime Sayısı:", NF, "| Son Kelime:", $NF}' metin.txt
Özel Alan Ayırıcı Belirlemek (-F Parametresi)
Verileriniz boşlukla değil de iki nokta (:), virgül (,) veya noktalı virgül (;) ile ayrılmışsa, -F seçeneğiyle ayırıcıyı belirtebilirsiniz.
En klasik örnek /etc/passwd dosyasındaki kullanıcı adlarını (1. sütun) ve varsayılan kabuklarını (7. sütun) listelemektir:
awk -F: '{print $1, "->", $7}' /etc/passwd
CSV dosyaları üzerinde çalışırken:
awk -F, '{print $1, $3}' musteriler.csv
Koşullu Filtreleme ve Aritmetik İşlemler
awk, sütunlar üzerinde mantıksal ve sayısal karşılaştırmalar yapmanıza olanak tanır.
1. Sayısal Karşılaştırma
Örneğin, disk kullanım tablosunda (df -h) doluluk oranı %80’in üzerinde olan disk bölümlerini tespit etmek:
df -h | awk 'NR>1 && int($5) > 80 {print $1, "Kritik Doluluk:", $5}'
2. Metinsel Eşleşme (Regex Filtreleme)
Belirli bir sütunda bir deseni aramak için ~ (eşleşir) veya !~ (eşleşmez) kullanılır:
# Sadece bash kabuğu kullanan sistem kullanıcılarını listele
awk -F: '$7 ~ /bash/ {print $1, $7}' /etc/passwd
BEGIN ve END Blokları ile Raporlama
BEGIN { }: Herhangi bir satır okunmadan önce yalnızca bir kez çalışır. Genellikle başlık yazdırmak veya sayaçları başlatmak için kullanılır.END { }: Dosyadaki tüm satırlar işlendikten sonra en sonda bir kez çalışır. Toplam, ortalama hesaplama veya kapanış özeti için idealdir.
Aşağıdaki örnek, bir log dosyasındaki toplam veri boyutunu toplar ve en sonda raporlar:
awk '
BEGIN { print "--- BOYUT RAPORU BASLADI ---"; toplam = 0 }
{ toplam += $5 }
END { print "Islem Goren Toplam Boyut (Byte):", toplam; print "--- RAPOR TAMAMLANDI ---" }
' transfer.log
Pratik Sistem Yönetimi Senaryoları
1. En Çok Bellek Tüketen Süreçleri Listelemek
ps çıktısından en çok bellek kullanan ilk 5 süreci formatlı yazdırmak:
ps aux --sort=-%mem | awk 'NR<=6 {printf "%-10s %-8s %-6s %s\n", $1, $2, $4, $11}'
2. Web Sunucusu (Nginx/Apache) Loglarında Hata Kodlarını Saymak
HTTP 500 veya 404 dönen istekleri ayıklamak:
awk '$9 == "404" {print $7}' access.log | sort | uniq -c | sort -nr | head -10
Diğer Terminal Komutları ile Birlikte Kullanım
awk, önceki bölümlerimizde incelediğimiz find komutu ve sed komutu ile harika bir üçlü oluşturur. find ile dosyaları keşfeder, grep veya sed ile metinleri ayıklar ve awk ile nihai raporunuzu şekillendirebilirsiniz.
Detaylı dahili fonksiyonlar ve gelişmiş script yazımı için resmi GNU Awk (Gawk) Kullanım Kılavuzu sayfasına göz atabilirsiniz.