Arama ve süzme
- grep ile satırları süz, awk ile sütunları seç. Çıktıyı boru işaretiyle sort ve uniq komutlarına aktar. Büyük bir kayıt dosyasından kısa bir özet çıkar.
- Aynı süzme kalıbını JSON kayıtlarına ve Nginx erişim kaydına da taşır, biçim değişse de özeti birkaç dakikada çıkarırsın.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Bir sunucuda bir şey ters gittiğinde cevap neredeyse her zaman bir metin kaydının içindedir. Ama o kayıt yüz binlerce satır olabilir ve gözle okunmaz.
Linux bu iş için küçük, keskin araçlar verir: her biri tek bir işi çok iyi yapar. Bu derste satır süzmeyi, sütun çekmeyi ve bu araçları boruyla zincirlemeyi öğrenirsin. Sonunda ham bir SSH kaydından en çok saldıran IP adresini tek satırlık bir komutla çıkarırsın.
Her araç tek iş
Bir SSH sunucusunun auth.log dosyası tek günde yüz bin satırı geçebilir. Bunu baştan sona okuyamazsın, okumaya da gerek yok. Unix felsefesi şudur: her araç tek bir işi yapar ve araçları birbirine bağlarsın.
grep satır seçer, awk sütun çeker, sort sıralar, uniq sayar, wc sayı verir. Bunları boruyla zincirlediğinde ham kayıt birkaç satırlık okunur bir özete dönüşür. Önce tek tek araçları, sonra onları bağlamayı göreceksin.
Metin işleyen temel araçları bir arada tut. grep desene uyan satırları seçer. awk satırı alanlara böler ve istediğin sütunu basar. sed metni akış hâlinde değiştirir.
cut sabit konumdan alan keser. sort satırları sıralar. uniq komşu tekrarları birleştirir.
wc satır, kelime ve karakter sayar. tr karakterleri çevirir ya da siler. Bu sekiz aracı tanıyan, çoğu kayıt işini tek satırda çözer ve araya geçici dosya yazmaz.
grep en çok kullanacağın araçtır. En sade biçimi iki parçadır: grep "Failed password" /var/log/auth.log. Bayraklar davranışı değiştirir. -i büyük küçük harf farkını yok sayar.
-n eşleşen satırın numarasını başa yazar. -c satırları basmaz, yalnız eşleşen satır sayısını verir.
-v tersini yapar ve eşleşmeyen satırları getirir. -r bir dizini alt dizinleriyle birlikte tarar. -o ise yalnız eşleşen parçayı basar, bütün satırı değil.
İki araç daha işini kolaylaştırır. sed metni akış hâlinde değiştirir; sed 's/eski/yeni/g' bir girdideki her eski kelimeyi yeni ile değiştirir ve sonucu basar. Dosyayı yerinde değiştirmek yerine çıktıyı akıttığı için denemesi güvenlidir. tr ise tek tek karakterleri çevirir ya da siler: tr 'a-z' 'A-Z' küçük harfleri büyüğe çevirir, tr -d ' ' bütün boşlukları atar.
Önceki derste gördüğün /proc/PID/cmdline hilesinde görünmez ayırıcıyı boşluğa çeviren de tr'dir. Biçimi bozuk bir kaydı zincire sokmadan önce bu iki araçla düzeltirsin.
Etkinlik 1 / 6
auth.log içinde kaç başarısız giriş satırı olduğunu, satırları ekrana dökmeden öğrenmek istiyorsun. Hangi komutu yazarsın?
Boru ve alanlar
Boru, dikey çizgi karakteridir ve soldaki komutun çıktısını sağdaki komutun girdisine bağlar. Böylece ara dosya yazmadan komutları arka arkaya dizersin.
grep "Failed password" auth.log | wc -l önce başarısız giriş satırlarını seçer, sonra wc -l onları sayar. Sonuç grep -c ile aynıdır, ama boru her araçla çalışır; aynı mantıkla sayma yerine sıralama ya da alan çekme de ekleyebilirsin. Boru, küçük araçları büyük bir ayıklama hattına çeviren tutkaldır.
awk her satırı boşluklardan bölerek alanlara ayırır ve art arda gelen boşlukları tek ayırıcı sayar. $1 ilk alanı, $NF son alanı verir. Şu satırı düşün: Sep 19 03:14:09 srv1 sshd[2310]: Failed password for root from 203.0.113.44 port 40122 ssh2.
Soldan saydığında IP adresi 11 numaralı alanda durur. awk '{print $11}' yalnız o alanı basar ve geri kalan gürültüyü atar. Böylece binlerce uzun satır, yalnız IP adreslerinden oluşan sade bir listeye iner.
sort satırları sıralar: -n sayısal sıralar, -r sırayı ters çevirir, -u tekrarları atar. uniq art arda gelen aynı satırları teke indirir ve -c bayrağı her satırın kaç kez geçtiğini önüne yazar.
Kritik nokta şudur: uniq yalnız komşu satırlara bakar. Aynı IP dosyanın başında ve sonunda duruyorsa iki ayrı grup sayılır ve sayım yanlış çıkar. Bu yüzden uniq'ten önce her zaman sort gelir; önce benzerleri yan yana getirir, sonra sayarsın.
$ grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -5
412 203.0.113.44
37 198.51.100.7
9 192.0.2.19
3 203.0.113.88
1 192.0.2.55Zinciri soldan sağa oku: grep yalnız başarısız girişleri bırakır, awk IP alanını çeker. İlk sort aynı IP'leri yan yana getirir, uniq -c onları sayar. sort -rn sayıya göre büyükten küçüğe dizer, head -5 ilk beşi gösterir. Çıktının en üstündeki 412 denemelik IP, saldırının asıl kaynağıdır.
Saymanın birkaç yolu olduğunu da unutma. wc -l tek bir toplam verir ve kaç başarısız giriş var sorusunu yanıtlar. uniq -c ise her değerin ayrı ayrı kaç kez geçtiğini söyler. Bir kuralı hep aklında tut: süzmeyi başa koy; sonraki adımlar yüz bin satır yerine birkaç bin satırla çalışır ve zincir hızlanır.
Etkinlik 2 / 6
auth.log içindeki başarısız girişleri IP'ye göre sayan ve en çok deneyeni öne alan zinciri kur.
Parçalara tıklayarak komutu soldan sağa kur.
Alan numarası ve düzenli ifade
Alan numarasını ezberleme, her log biçiminde yeniden say. Sistemde olmayan bir kullanıcı denenince satır değişir: Failed password for invalid user oracle from 198.51.100.7 port 51002 ssh2. Araya invalid user iki kelime girer ve IP 13 numaralı alana kayar.
Bazı yeni sistemlerde zaman damgası 2026-09-19T03:14:09+03:00 gibi tek parça yazılır ve alan sayısı yine değişir. Zinciri kurmadan önce bir örnek satır al, alanları parmağınla say, sonra numarayı yaz.
Etkinlik 3 / 6
Satır şu: Sep 19 03:15:02 srv1 sshd[2320]: Failed password for invalid user oracle from 198.51.100.7 port 51002 ssh2. IP adresini basan komut awk '{print $____}' olur.
grep düz metinle yetinmez, desen de alır. Düzenli ifade, metindeki kalıpları tarif eden küçük bir dildir. Birkaç işaret çoğu işi görür: ^ satır başını, $ satır sonunu eşler. [0-9] tek bir rakamı, nokta herhangi bir karakteri karşılar.
Yıldız kendinden önceki parçanın sıfır ya da daha çok tekrarını alır. grep -E ile genişletilmiş biçime geçersin; orada + bir ya da daha çok tekrar, soru işareti isteğe bağlı, dik çizgi ise veya anlamına gelir.
Düzenli ifade yalnız satır seçmez, parça da çıkarır. grep -oE yazarsan grep genişletilmiş deseni kullanır ve yalnız eşleşen parçayı basar. Bir kayıttan bütün IP adreslerini çekmek için grep -oE '([0-9]+\.){3}[0-9]+' auth.log yazarsın: desen, nokta ile ayrılmış dört sayı grubunu arar.
Çıktıyı doğrudan sort ve uniq -c zincirine bağlarsan, alan numarasını hiç saymadan en çok görünen adresi bulursun. awk alanı konumdan çeker, grep -oE ise kalıbı metnin neresinde olursa olsun yakalar; biçimi değişken kayıtlarda bu yöntem daha dayanıklıdır.
Derinleş:awk'ta koşul ve toplam
awk yalnız alan çekmez, küçük bir programlama dilidir. Her satır için bir koşul ve bir eylem yazarsın: awk '$9==404{print $7}' access.log yalnız dokuzuncu alanı 404 olan satırları seçer ve yedinci alanı basar. Değişken de tutar: awk '{toplam+=$10} END{print toplam}' access.log her satırdaki onuncu alanı, yani yanıt boyutunu toplar ve dosya bitince toplamı yazar.
BEGIN ve END blokları işten önce ve sonra bir kez çalışır. Bir alanı sayarken grep ve wc yerine tek bir awk çoğu zaman yeter ve daha hızlıdır. Alan ayırıcısını -F ile değiştirirsin: awk -F: '{print $1}' /etc/passwd iki nokta ile ayrılmış ilk alanı, yani kullanıcı adını basar.
Etkinlik 4 / 6
Aşağıdaki kayıt satırlarından yalnız başarısız parola girişlerini eşleyen bir desen yaz.
Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.
Çıktıyı yönetmek ve biçimler
Sonucu kaybetmemek için çıktıyı dosyaya yönlendir. Tek büyüktür işareti dosyayı sıfırlar ve baştan yazar. Çift işaret sona ekler, eski içeriği korur.
Hata mesajları ayrı bir akıştan, yani stderr'den gelir; komut > sonuc.txt 2>&1 yazarsan çıktıyı ve hatayı aynı dosyada toplarsın. Yalnız hatayı atmak istersen 2>/dev/null yazarsın. tee ise çıktıyı hem ekrana basar hem dosyaya yazar: uzun bir zincirin sonucunu görürken bir yandan kaydetmek için komut | tee rapor.txt kullanırsın.
Kayıtlar büyüyünce döndürülür: dünün kaydı auth.log.1 olur, daha eskisi auth.log.2.gz gibi sıkıştırılır. zgrep sıkıştırılmış dosyayı açmadan içinde arar, zcat ise içeriğini ekrana döker. grep birden çok dosyayı tararken her satırın başına dosya adını ekler ve ilk alan auth.log:Sep olur; bu ek alan sayımını bozar, -h bayrağı onu kaldırır. Bir olayın kaç gün sürdüğünü görmek için döndürülmüş dosyaları da taramayı unutma.
Bütün kayıtlar düz metin değildir. Modern uygulamalar olayları çoğu zaman JSON satırları hâlinde yazar ve bu biçimde awk zorlanır. jq, JSON için yazılmış bir süzgeçtir.
jq -r 'select(.status >= 400) | .path' app.log yazarsan, durum kodu 400 ve üstü olan kayıtları seçer ve yalnız istenen yolu basar. -r bayrağı sonucu tırnaksız düz metin verir, böylece çıktıyı sort ve uniq ile aynı zincire bağlarsın.
$ jq -r 'select(.status >= 400) | .path' app.log | sort | uniq -c | sort -rn | head -3
68 /yonetim/giris
41 /api/kullanici/ara
12 /.envEtkinlik 5 / 6
İşleci yaptığı işle eşleştir.
Savunma: aynı kalıp web kaydında
Aynı süzme kalıbı web sunucusunda da işler, yalnız alan numaraları değişir. Nginx erişim kaydının bir satırı şöyledir: 198.51.100.23 - - [19/Sep/2026:10:02:11 +0300] "GET /wp-login.php HTTP/1.1" 404 162. Burada istemci IP'si birinci, istenen yol yedinci, durum kodu dokuzuncu alanda durur.
Otomatik tarama araçları var olmayan sayfaları arka arkaya yoklar ve çok sayıda 404 alır. 404 yollarını sayarsan, kimin neyi aradığını bir bakışta görürsün.
Bu kalıp tehdit avının bel kemiğidir. Aynı zinciri bir gün sonra, bir hafta sonra, farklı bir sunucuda yeniden çalıştırırsın; yalnız desen ve alan numarası değişir. Mantık hep aynı kalır: süz, çek, sırala, say, en çoğu öne al.
Bir komutu ezberlemek yerine bu beş adımı içselleştir. O zaman karşına çıkan her yeni kayıt biçimini, hiç görmemiş olsan bile birkaç dakikada okunur bir özete çevirirsin.
Etkinlik 6 / 6
Nginx erişim kaydında en çok 404 alan yolları bulmak için adımları sırala.
Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.
- 1sort -rn ile en çok sayılanı öne al
- 2uniq -c ile her yolu say
- 3sort ile aynı yolları yan yana getir
- 4grep ile 404 dönen satırları süz
- 5awk ile yol alanını ($7) çek
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.