Bir sunucuda çalışırken karşınıza çıkan verinin büyük çoğunluğu aslında düzenli bir yapıya sahiptir. Erişim logları, ps çıktısı, CSV dosyaları, /etc/passwd içeriği, hatta df ya da netstat çıktısı bile aslında satırlara ve sütunlara ayrılmış metinlerdir. İşte tam bu noktada awk, Linux dünyasının en sessiz ama en güçlü araçlarından biri olarak devreye girer. grep size hangi satırların eşleştiğini söyler, sed metni düzenler; awk ise satırı sütunlarına ayırıp her bir alanı ayrı ayrı işlemenizi, koşullar kurmanızı ve sayısal hesaplar yapmanızı sağlar.
Bu rehberde awk'ı sıfırdan, sistem yöneticisi gözüyle ele alacağız. Alan mantığını, alan ayırıcı seçimini, koşullu blokları, BEGIN/END yapısını ve toplam/ortalama gibi hesaplamaları gerçek örneklerle göreceğiz. Sonunda bir erişim logundan en çok istek atan IP adreslerini saymayı ya da bir sütunun toplamını almayı rahatça yapabilecek seviyeye geleceksiniz. Temel kabuk komutlarına hâlâ ısınıyorsanız önce Linux temel komutları rehberimize göz atmanız, buradaki örnekleri daha rahat takip etmenizi sağlar.
awk Nedir ve Ne Zaman İşe Yarar#
awk, adını yazarlarının (Aho, Weinberger, Kernighan) baş harflerinden alan, metin işleme için tasarlanmış küçük bir programlama dilidir. Neredeyse tüm Linux dağıtımlarında hazır kurulu gelir; ayrıca bir şey yüklemenize gerek yoktur. Çalışma mantığı basittir: bir girdiyi satır satır okur, her satırı otomatik olarak alanlara böler ve sizin verdiğiniz kurala göre bir işlem yapar.
En temel kalıp şudur:
awk 'kosul { eylem }' dosya.txt
Burada kosul doğruysa { eylem } çalışır. Koşulu boş bırakırsanız her satır işlenir; eylemi boş bırakırsanız eşleşen satır olduğu gibi yazdırılır. awk'ı en çok şu durumlarda kullanırsınız:
- Bir dosyadan yalnızca belirli sütunları çekmek (örneğin sadece 3. ve 5. sütun).
- Sayısal bir sütunu toplamak, ortalamasını almak ya da saymak.
- Bir koşula uyan satırları seçmek (örneğin yanıt süresi 1 saniyeden fazla olan istekler).
- Log dosyalarından özet çıkarmak, en sık tekrar eden değerleri bulmak.
grep ve sed ile arasındaki farkı şöyle özetleyebiliriz:
| Araç | Ana işi | Sütun kavramı | Hesaplama |
|---|---|---|---|
| grep | Satır eşleştirme/filtreleme | Yok | Yok |
| sed | Metin düzenleme/değiştirme | Sınırlı | Yok |
| awk | Alan bazlı işleme ve raporlama | Var ($1, $2...) | Var (toplam, sayaç) |
Yani üç aracın da yeri ayrıdır; birçok komut satırı zincirinde bunları birlikte kullanırsınız.
Alan Mantığı: $1, $2 ve $NF#
awk'ın kalbi alan (field) kavramıdır. awk her satırı okuduğunda, onu varsayılan olarak boşluk ve tab karakterlerine göre parçalara böler. Bu parçalara alan denir ve $1, $2, $3 şeklinde numaralandırılır. $0 ise satırın tamamını temsil eder.
Basit bir örnekle başlayalım. Elimizde şöyle bir dosya olsun:
cat kullanicilar.txt
ahmet admin aktif
mehmet editor pasif
ayse admin aktif
Sadece kullanıcı adlarını (ilk sütun) almak isterseniz:
awk '{ print $1 }' kullanicilar.txt
Çıktı:
ahmet
mehmet
ayse
Birden fazla alanı birlikte yazdırabilirsiniz. Aralarına virgül koyarsanız awk bunları varsayılan ayırıcı (boşluk) ile birleştirir:
awk '{ print $1, $3 }' kullanicilar.txt
Alanların arasına kendi metninizi de ekleyebilirsiniz:
awk '{ print $1 " kullanicisi " $3 }' kullanicilar.txt
Çok işe yarayan bir değişken de NF'dir; bu, o satırdaki toplam alan sayısını tutar. $NF yazdığınızda "son alan"a ulaşırsınız; bu, sütun sayısının satırdan satıra değiştiği durumlarda çok kullanışlıdır:
awk '{ print $NF }' kullanicilar.txt # her satirin son alani (aktif/pasif)
Benzer şekilde $(NF-1) sondan bir önceki alanı verir. Satır numarasına ihtiyaç duyarsanız NR değişkeni o ana kadar okunan satır sayısını tutar:
awk '{ print NR ": " $1 }' kullanicilar.txt
Bu iki değişkeni, NR (satır numarası) ve NF (alan sayısı), aklınızın bir köşesinde tutun; awk betiklerinin yarısı bu ikisinin etrafında döner.
-F ile Alan Ayırıcıyı Değiştirmek#
Varsayılan alan ayırıcı boşluktur, ama gerçek hayatta veri her zaman boşlukla ayrılmaz. CSV dosyaları virgülle, /etc/passwd iki nokta üst üste ile, bazı loglar tab ile ayrılır. Bu durumda -F seçeneği ile ayırıcıyı siz belirlersiniz.
Klasik örnek /etc/passwd dosyasıdır. Bu dosyada alanlar iki nokta ile ayrılır ve ilk alan kullanıcı adı, yedinci alan ise kabuk (shell) bilgisidir:
awk -F':' '{ print $1, $7 }' /etc/passwd
Bir CSV dosyasında satış tutarlarını okumak isteyelim. Dosyamız şöyle olsun:
cat satislar.csv
tarih,urun,adet,tutar
2026-07-01,hosting,3,450
2026-07-01,domain,5,300
2026-07-02,hosting,2,300
Sadece ürün ve tutar sütunlarını almak için:
awk -F',' '{ print $2, $4 }' satislar.csv
Ayırıcı olarak birden fazla karakteri veya bir düzenli ifadeyi de verebilirsiniz. Örneğin hem virgül hem noktalı virgülle ayrılmış bir dosyada:
awk -F'[,;]' '{ print $1 }' karisik.txt
Çıktıdaki alanları farklı bir ayırıcıyla yazmak isterseniz OFS (Output Field Separator) değişkenini kullanırsınız. Aşağıdaki örnek virgülle ayrılmış girdiyi tab ile ayrılmış çıktıya çevirir:
awk -F',' 'BEGIN { OFS="\t" } { print $2, $4 }' satislar.csv
Alanları elle yazmak yerine $1=$1 gibi bir atama yaparsanız awk satırı OFS ile yeniden birleştirir; bu, tüm sütunları tek seferde başka bir ayırıcıya dönüştürmenin pratik bir yoludur. Bu tarz dosyaları düzenlemeniz gerektiğinde nano ve vim metin düzenleyici rehberimiz de işinize yarayacaktır.
Koşullu Bloklar ile Satır Filtreleme#
awk'ı sadece sütun seçmek için kullanmak, gücünün küçük bir kısmını kullanmaktır. Asıl güç, koşullar kurup yalnızca ilgilendiğiniz satırlarda işlem yapabilmektir. Koşul, süslü parantezden önce yazılır ve doğru olduğunda blok çalışır.
Aktif kullanıcıları listeleyelim (üçüncü alanı aktif olan satırlar):
awk '$3 == "aktif" { print $1 }' kullanicilar.txt
Sayısal karşılaştırma da yapabilirsiniz. Satış dosyamızda tutarı 300'den büyük olan satırları bulalım:
awk -F',' '$4 > 300 { print $2, $4 }' satislar.csv
Metin içinde arama yapmak için düzenli ifade eşleştirme operatörü ~ kullanılır. Bir logda POST isteklerini seçmek için:
awk '$6 ~ /POST/ { print $0 }' erisim.log
Eşleşmeyen satırlar için !~ kullanırsınız. Koşulları && (ve) ile || (veya) mantıksal operatörleriyle birleştirebilirsiniz:
awk -F',' '$2 == "hosting" && $4 >= 300 { print $0 }' satislar.csv
awk'ta if/else yapısı da vardır ve daha karmaşık kararlar için blok içinde kullanılır:
awk -F',' '{
if ($4 >= 400)
print $2 " yuksek satis"
else
print $2 " normal satis"
}' satislar.csv
Aşağıdaki tablo en sık kullanılan karşılaştırma ve eşleştirme operatörlerini özetler:
| Operatör | Anlamı | Örnek |
|---|---|---|
== | Eşit | $3 == "aktif" |
!= | Eşit değil | $3 != "pasif" |
> < >= <= | Sayısal karşılaştırma | $4 > 300 |
~ | Düzenli ifadeye uyar | $1 ~ /^ah/ |
!~ | Düzenli ifadeye uymaz | $6 !~ /GET/ |
Bu operatörleri birbirine bağladığınızda, tek satırlık bir komutla oldukça hassas filtreler kurabilirsiniz.
BEGIN ve END Blokları#
awk'ın satır satır çalıştığını söylemiştik, ama bazen bütün satırlardan önce ya da sonra bir işlem yapmak istersiniz. İşte BEGIN ve END blokları tam olarak bunun içindir.
BEGIN bloğu, ilk satır okunmadan önce bir kez çalışır. Genellikle başlık yazdırmak, ayırıcı ayarlamak ya da bir değişkeni başlangıç değeriyle tanımlamak için kullanılır. END bloğu ise tüm satırlar bittikten sonra bir kez çalışır; özet, toplam veya rapor yazdırmak için idealdir.
awk -F',' '
BEGIN { print "Urun\tTutar"; print "-----\t-----" }
{ print $2 "\t" $4 }
END { print "Rapor tamamlandi." }
' satislar.csv
Burada BEGIN bloğu bir başlık, ana blok her satırı, END bloğu ise kapanış mesajını yazdırır. BEGIN içinde ayırıcı da tanımlayabileceğinizi unutmayın; -F',' yerine BEGIN { FS="," } yazmak aynı işi görür:
awk 'BEGIN { FS=","; OFS=" -> " } { print $2, $4 }' satislar.csv
Bu üçlü yapı (BEGIN, ana blok, END), awk'ı basit bir sütun seçiciden gerçek bir rapor üreticisine dönüştüren şeydir. Bir sonraki bölümde göreceğimiz toplam ve ortalama hesaplarının tümü bu iskelet üzerine kurulur.
Toplam, Sayaç ve Ortalama Hesaplama#
awk'ın gerçek anlamda parladığı yer sayısal hesaplamalardır. Değişken tanımlamanıza gerek yoktur; bir değişkeni kullandığınız an awk onu otomatik olarak sıfır (ya da boş metin) kabul eder. Bu, toplam almayı çok kolaylaştırır.
Satış dosyamızdaki tutar sütununun (4. alan) toplamını alalım. Başlık satırını atlamak için NR > 1 koşulunu ekliyoruz:
awk -F',' 'NR > 1 { toplam += $4 } END { print "Toplam:", toplam }' satislar.csv
Burada toplam += $4 ifadesi her satırda dördüncü alanı biriktirir, END bloğu ise sonucu yazdırır. Aynı mantıkla ortalama da hesaplayabilirsiniz. Bunun için hem toplamı hem satır sayısını tutmamız gerekir:
awk -F',' '
NR > 1 { toplam += $4; adet++ }
END { if (adet > 0) print "Ortalama:", toplam / adet }
' satislar.csv
adet++ her veri satırında sayacı bir artırır; END bloğunda sıfıra bölme hatasından kaçınmak için adet > 0 kontrolünü koyduk. Bu küçük kontrol, boş dosyalarda betiğinizin çökmesini engeller.
awk'ın belki de en güçlü özelliği ilişkisel dizilerdir (associative arrays). Bir sütundaki her değerin kaç kez geçtiğini saymak için bir diziyi anahtar olarak kullanırsınız. Örneğin hangi üründen kaç satır olduğunu sayalım:
awk -F',' 'NR > 1 { sayac[$2]++ } END { for (u in sayac) print u, sayac[u] }' satislar.csv
Çıktı:
hosting 2
domain 1
Burada sayac[$2]++ ifadesi, ürün adını dizinin anahtarı yapar ve her görüşte değeri artırır. END bloğundaki for (u in sayac) döngüsü tüm anahtarları gezer. Bu kalıp, log analizinin de temelini oluşturur; bir sonraki bölümde tam olarak bunu uygulayacağız. Bu tür özet raporlar üreten betikleri düzenli olarak çalıştırmanız gerekiyorsa, sunucu yönetimi hizmetimiz kapsamında bunları otomatikleştirmenize yardımcı olabiliriz.
Erişim Logundan Pratik Log Analizi#
Şimdi öğrendiklerimizi gerçek bir işe uygulayalım. Web sunucularının erişim logları, awk için biçilmiş kaftandır. Tipik bir Nginx access log satırı şöyle görünür:
203.0.113.45 - - [10/Jul/2026:14:22:01 +0300] "GET /wiki HTTP/1.1" 200 5123 "-" "Mozilla/5.0"
Bu satırda alanlar boşlukla ayrıldığından, IP adresi $1, HTTP durum kodu $9, gönderilen bayt sayısı ise $10 alanındadır. En sık kullanılan analizlerden biri, en çok istek atan IP adreslerini bulmaktır. Bu, örneğin bir botun ya da olası bir saldırının kaynağını tespit etmenize yarar:
awk '{ sayac[$1]++ } END { for (ip in sayac) print sayac[ip], ip }' access.log | sort -rn | head
Burada awk her IP'yi sayar, sort -rn sonuçları büyükten küçüğe sıralar, head ise ilk on tanesini gösterir. Bu üçlü zincir, log analizinin en klasik kalıbıdır.
Sadece hatalı istekleri (durum kodu 400 ve üzeri) saymak isterseniz koşul ekleyebilirsiniz:
awk '$9 >= 400 { hata[$9]++ } END { for (k in hata) print k, hata[k] }' access.log
Toplam gönderilen trafiği (bant genişliği) hesaplamak için onuncu alanı toplayabilirsiniz. Sonucu megabayta çevirerek okunabilir hale getirelim:
awk '{ toplam += $10 } END { printf "Toplam: %.2f MB\n", toplam / 1024 / 1024 }' access.log
Belirli bir sayfaya (örneğin /giris) gelen istek sayısını saymak için de eşleştirmeyi kullanabilirsiniz:
awk '$7 == "/giris" { adet++ } END { print "Giris istekleri:", adet }' access.log
Bu tür analizler, ani trafik artışlarını, saldırı denemelerini ya da hatalı yönlendirmeleri erken yakalamanızı sağlar. Yoğun trafik veya kötü niyetli isteklerle mücadele ediyorsanız, uygulama katmanında WAF ve ağ katmanında DDoS koruma çözümlerimiz awk ile yaptığınız tespitlerin üzerine kalıcı bir savunma ekler. Bu analizlere kaynak olacak logların düzenli tutulması için de sağlam bir yedekleme altyapısını ihmal etmeyin.
awk'ı Diğer Araçlarla Birleştirmek#
awk'ın tek başına güçlü olduğu doğru, ama asıl verimi başka komutlarla boru hattı (pipe) içinde kullanıldığında ortaya çıkar. Standart girdiden okuyabildiği için, herhangi bir komutun çıktısını doğrudan awk'a besleyebilirsiniz.
Örneğin ps çıktısından en çok bellek kullanan süreçleri listelemek için:
ps aux | awk 'NR > 1 { print $4 "% " $11 }' | sort -rn | head
Disk kullanımını gösteren df çıktısından yalnızca doluluk oranı yüzde 80'i geçen bölümleri süzmek çok kullanışlıdır; disk dolduğunda sunucu servislerinizin durmasını önlemek için bunu bir uyarı betiğine bağlayabilirsiniz:
df -h | awk 'NR > 1 && int($5) > 80 { print $6 " bolumu %" $5 " dolu" }'
Ağ bağlantılarını sayıp hangi durumda kaç bağlantı olduğunu görmek için:
ss -tan | awk 'NR > 1 { durum[$1]++ } END { for (d in durum) print d, durum[d] }'
Gördüğünüz gibi kalıp hep aynı: bir komut veri üretir, awk onu alanlara ayırıp işler, gerekiyorsa sort ve head ile son rütuş yapılır. Bu esneklik sayesinde awk, günlük sunucu yönetiminde neredeyse her gün elinizin altında olması gereken bir araçtır. Kendi sunucunuzda bu komutları denemek istiyorsanız, tam yetkili bir ortam için VDS sunucularımıza ya da esnek sanal sunucu seçeneklerimize göz atabilir; paylaşımlı bir başlangıç için hosting paketlerimizi inceleyebilirsiniz.
Sıkça Sorulan Sorular#
awk ile grep arasındaki fark nedir?#
İkisi de metin işler ama farklı amaçlara hizmet eder. grep bir desene uyan satırları bulup gösterir; satırın içindeki sütunlarla ilgilenmez ve hesap yapamaz. awk ise her satırı alanlara böler, belirli sütunları seçebilir, koşullar kurabilir ve toplam, ortalama, sayaç gibi hesaplamalar yapabilir. Kısaca sadece satır bulmak istiyorsanız grep, sütunlarla çalışıp bir şeyler hesaplamak istiyorsanız awk daha doğru seçimdir. Pratikte ikisini boru hattında birlikte de kullanırsınız.
awk'ta belirli bir sütunu nasıl seçerim?#
Alanlar $1, $2, $3 şeklinde numaralandırılır ve $0 tüm satırı temsil eder. İstediğiniz sütunu awk '{ print $2 }' biçiminde yazdırabilirsiniz. Eğer veri boşluk yerine virgül, iki nokta gibi başka bir karakterle ayrılıyorsa -F seçeneği ile ayırıcıyı belirtmeniz gerekir; örneğin CSV için awk -F',' '{ print $2 }' kullanırsınız. Son sütuna ulaşmak için ise $NF yazabilirsiniz, bu sütun sayısı değişse bile daima son alanı verir.
awk sadece sayısal veriyle mi çalışır?#
Hayır, awk hem metin hem sayı ile çalışır. Metin karşılaştırması için == ve ~ gibi operatörleri, sayısal karşılaştırma ve hesaplama için +, >, += gibi operatörleri kullanabilirsiniz. awk, bir alanın sayı mı metin mi olduğunu bağlama göre kendisi anlar; toplama yaptığınızda alanı sayı gibi, birleştirme yaptığınızda metin gibi değerlendirir. Bu esneklik sayesinde hem log satırlarındaki metinleri filtreleyip hem de aynı satırdaki sayısal değerleri toplayabilirsiniz.
awk betiğini bir dosyaya kaydedip çalıştırabilir miyim?#
Evet. Uzun ve tekrar eden betiklerinizi bir dosyaya yazıp awk -f betik.awk veri.txt şeklinde çağırabilirsiniz. Bu yöntem, birden fazla blok içeren ve düzenli çalıştırdığınız raporlar için tırnak içindeki tek satırlık kullanımdan çok daha okunabilirdir. Betik dosyasında BEGIN, ana blok ve END yapılarını satırlara yayarak yorum satırları da (# ile) ekleyebilir, böylece ekip arkadaşlarınızın da anlayacağı düzenli bir betik oluşturabilirsiniz.
gawk, mawk ve nawk arasındaki fark nedir?#
Bunlar awk'ın farklı gerçeklemeleridir. gawk, GNU projesinin sürümüdür ve en zengin özellik setine sahiptir; çoğu Linux dağıtımında varsayılan awk aslında gawk'a bağlıdır. mawk daha hızlı ama daha sade bir sürümdür ve bazı hafif sistemlerde tercih edilir. nawk ise özgün awk'ın yeni sürümüdür, daha çok BSD sistemlerinde karşınıza çıkar. Bu rehberdeki örneklerin tamamı standart özellikleri kullandığı için her üç sürümde de sorunsuz çalışır; ileri düzey gawk eklentilerine ihtiyaç duyduğunuzda hangi sürümü kullandığınızı awk --version ile kontrol edebilirsiniz.
Türkçe karakter içeren dosyalarda awk sorun çıkarır mı?#
Genellikle çıkarmaz, çünkü awk baytları olduğu gibi işler ve UTF-8 kodlamalı dosyalarla uyumlu çalışır. Ancak büyük/küçük harf dönüşümü ya da karakter uzunluğu gibi işlemlerde sistemin dil ayarı (locale) devreye girer. Türkçe'ye özgü ı, İ, ş, ğ gibi karakterlerde beklenmedik sonuçlar alırsanız, komuttan önce LC_ALL=tr_TR.UTF-8 gibi bir ayar yaparak ya da tersine LC_ALL=C ile sadece bayt bazlı çalışmaya zorlayarak sorunu çözebilirsiniz. Alan seçme ve toplama gibi temel işlemlerde bu ayrıntı sizi çoğu zaman etkilemez.
Kapanış#
awk, ilk bakışta gizemli görünen ama mantığını kavradığınızda her gün elinizin altında tutacağınız bir araçtır. Alan mantığını ($1, $NF), alan ayırıcı seçimini (-F), koşullu blokları, BEGIN/END yapısını ve toplam/sayaç hesaplarını öğrendiğinizde, karmaşık log dosyalarından saniyeler içinde anlamlı raporlar çıkarabilirsiniz. En güzel tarafı, bu bilgilerin tümünü grep, sed, sort gibi araçlarla birleştirerek her sunucuda kurulu olan standart komutlarla halledebilmenizdir; ekstra bir kurulum ya da bağımlılık gerektirmez.
Bu tür komut satırı becerileri, sunucunuza hâkim olmanın temel taşıdır ve size hem performans hem de güvenlik konusunda erken uyarı sağlar. Siz sunucunuzun içinde analiz yaparken, altyapının sağlam ve hızlı olması bizim işimiz. Kendi kök erişimli ortamınızda bu araçları özgürce kullanmak için sanal ve VDS sunucu seçeneklerimizi, günlük yönetim yükünü bize devretmek için sunucu yönetimi hizmetimizi, WordPress tabanlı projeleriniz için ise WordPress hosting paketlerimizi inceleyebilirsiniz. Clou.TR olarak altyapıyı ve uzman desteği tek çatı altında sunuyoruz; performanslı ve güvenli bir sunucu deneyimi için doğru adrestesiniz.