sort Komutu: Dosya Icerigini Siralama Teknikleri
Sistem yonetimi yaparken veriyle ugrasmanin kacinilamaz bir parcasi var: siralama. Log dosyalarina bakiyorsun, kullanici listelerini inceliyorsun, disk kullanim raporlarini analiz ediyorsun… Hepsinde bir sekilde “su veriyi sirali gorsem ne guzel olurdu” diye dusunuyorsun. Iste tam bu noktada sort komutu devreye giriyor.
sort, Unix/Linux dunyasinin en eski ve en kullanisli araci. Gorunuse bakinca basit geliyor ama altinda ciddi bir guc sakli. Bu yazida sort komutunu tum pratik detaylariyla ele alacagiz.
Temel Kullanim
En basit haliyle sort, bir dosyanin satirlarini alfabetik olarak siralar.
sort dosya.txt
Ama bekle, bu komutu calistirdiginda dosyayi degistirmiyor. Sonucu standart ciktiya gonderiyor. Degisikligi dosyaya kaydetmek istiyorsan iki secenek var:
# Yonlendirme ile kaydet
sort dosya.txt > siralimis_dosya.txt
# -o parametresiyle ayni dosyaya kaydet
sort -o dosya.txt dosya.txt
Ikinci yontemi tercih et. Cunku sort dosya.txt > dosya.txt yazarsan bash once dosyayi bosaltir, sonra sort calisir ve elimizde bos bir dosya kalir. Bu klasik bir tuzak.
Siralama Yontemleri
Ters Siralama (-r)
En cok kullanilan parametrelerden biri. Buyukten kucuge, Z’den A’ya dogru siralar.
sort -r dosya.txt
Log analizi yaparken genellikle en buyuk degerleri gormek istiyoruz. Mesela hangi IP adresi en cok istek atmis diye bakiyorsan ters siralama hayat kurtariyor.
Sayisal Siralama (-n)
Bu parametre olmadan sort oldukca yaniltici davranabilir. Mesela elinde su sayilar var:
10
9
100
2
20
sort komutu bunlari alfabetik siralar: 10, 100, 2, 20, 9. Yani tam bir felaket. -n parametresiyle sayisal siralama yapilir:
sort -n sayilar.txt
# Cikti: 2, 9, 10, 20, 100
Disk kullanim raporlarinda, port numaralarinda, her turlu sayisal veri icin mutlaka -n kullan.
Buyuk-Kucuk Harf Duyarsiz Siralama (-f)
sort -f kullanicilar.txt
Normalde sort, buyuk harfleri kucuk harflerden once siralar (ASCII sirasina gore). -f parametresiyle bu davranis iptal edilir.
Alan Bazli Siralama: Gercek Guc Buraya Gizli
Tek sutunlu dosyalar guzel ama gercek hayatta genellikle CSV, TSV ya da boslukla ayrilmis dosyalarla ugrasiyoruz. Iste burada -k parametresi sahneye cikiyor.
-k Parametresi ile Alan Secimi
Bir /etc/passwd dosyasi dusun. Kullanici ID’sine gore siralayelim:
# /etc/passwd dosyasini UID'ye gore sirala (3. alan)
sort -t: -k3 -n /etc/passwd
Burada:
-t:ayiricinin iki nokta oldugunu soyluyor-k3ucuncu alana gore sirala-nsayisal siralama yap
Daha karmasik bir ornek: Bir CSV dosyasinda once soyada, sonra ada gore siralamak istiyorsan:
sort -t, -k2,2 -k1,1 calisanlar.csv
-k2,2 ifadesi “2. alandan baslayip 2. alanda bit” anlamina geliyor. Sadece -k2 yazarsan satirin sonuna kadar devam eder, bu da istemedigimiz sonuclar uretir.
Pratik Senaryo: Log Analizi
Nginx access log’unu dusun. En cok istek yapan IP adreslerini bulmak istiyorsun:
# access.log'dan IP adreslerini al, say, sirala
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
Bu pipeline’i parcalayalim:
awk '{print $1}'– Ilk alani (IP) alsort– Siralayarak uniq’e hazirlauniq -c– Her IP’yi saysort -rn– Sayiya gore buyukten kucuge siralahead -20– Sadece ilk 20’yi goster
Bu komutu bir sysadmin olarak haftada en az birkas kere kullaniyorum.
Tekrarlari Kaldir (-u)
-u parametresi (unique) tekrar eden satirlari siler. uniq komutunun yaptigi isi sort icinde yapar:
sort -u liste.txt
Dikkat: -u sadece yan yana gelen tekrarlari silmez, tum tekrarlari temizler. Bu uniq‘ten farkli.
Buyuk Dosyalarla Calisma
Gigabyte boyutunda log dosyalariyla ugrasiyorsan sort’un bellegi nasil kullandigini bilmek onemli.
Paralel Siralama (–parallel)
Modern sistemlerde birden fazla CPU cekirdegi var. sort bunu kullanabilir:
sort --parallel=4 buyuk_dosya.txt > siralimis.txt
Gecici Dizin Belirleme (-T)
sort buyuk dosyalari sirerken gecici dosyalar olusturur. Varsayilan olarak /tmp kullanir. Eger /tmp doluysa sorun yasar. Farkli bir dizin belirle:
sort -T /var/tmp buyuk_dosya.txt > siralimis.txt
Bellek Siniri (-S)
sort’a ne kadar RAM kullanabileceгini soyluyebilirsin:
# 2 GB bellek kullan
sort -S 2G buyuk_dosya.txt > siralimis.txt
# Yuzde olarak da belirtebilirsin
sort -S 50% buyuk_dosya.txt > siralimis.txt
Gercek Dunya Senaryolari
Senaryo 1: Disk Kullanim Raporu
Hangi dizinler en cok yer kapiyor diye bakarken du ciktisini siralamak istiyorsun:
du -sh /var/* 2>/dev/null | sort -h | tail -20
Burada -h parametresi “human readable” siralama yapiyor. Yani 1K, 1M, 1G gibi degerleri dogru siralayabiliyor. GNU sort’a ozgu bu parametre cok isime yariyor.
Senaryo 2: Yedekleme Kontrol Listesi
Sunucudan aldıgın yedek listesinde hangi dosyalarin en son yedeklendигini bulmak istiyorsun:
# Tarih damgasi iceren satırlari tarihe gore sirala
ls -la /backup/ | sort -k6,8
Ya da daha temiz bir yontemle:
find /backup -name "*.tar.gz" -printf "%T@ %pn" | sort -n | tail -10 | cut -d' ' -f2-
Bu komut son 10 yedek dosyasini tarihe gore siralanmis gosterir.
Senaryo 3: Kullanici Aktivite Analizi
Sisteme en cok login olan kullanicilari bulmak:
last | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
Senaryo 4: Servis Port Listesi
Acik portlari numaraya gore siralanmis gormek:
ss -tlnp | awk 'NR>1 {print $4}' | awk -F: '{print $NF}' | sort -n | uniq
Senaryo 5: CSV Rapor Isleme
Diyelim ki bir monitoring aracinin csv ciktisini analiz ediyorsun. Sunucu adina gore grupla, sonra metrik degerine gore sirala:
# hostname,metric,value formatindaki CSV
sort -t, -k1,1 -k3,3rn monitoring_raporu.csv
Bu komut once sunucu adina gore (1. alan) alfabetik, sonra deger icin (3. alan) buyukten kucuge siralar.
Siralama Stabiliteligi (-s)
Bazen ayni alana sahip iki satirin orijinal sirasini korumak istiyorsun. -s (stable) parametresi bunu saglar:
sort -s -t, -k1,1 veri.csv
Ornegin once tarihe gore siraladigini bir CSV var, simdi buna kategoriye gore ek siralama eklemek istiyorsun ama tarih sirasini bozmadan. Stable sort tam bu isi yapar.
Siralama Kontrolu (-c ve -C)
Bir dosyanin zaten sirali olup olmadigini kontrol etmek icin:
# Sirali degil ise hata mesaji ver
sort -c dosya.txt
# Sadece cikis kodu don (sessiz mod)
sort -C dosya.txt
echo $? # 0 = sirali, 1 = sirali degil
Bu ozellik script’lerde cok kullanisli. Ornegin bir script’te “bu dosya sirali mi, degilse siralayalim” mantigi kurabilirsin:
#!/bin/bash
if ! sort -C /etc/hosts.allow 2>/dev/null; then
echo "Dosya sirali degil, siralaniyor..."
sort -o /etc/hosts.allow /etc/hosts.allow
echo "Tamamlandi."
fi
sort ve diger Komutlarla Kombinasyon
sort tek basina da guclü ama asil gucu diger komutlarla birlesince ortaya cikiyor.
sort + uniq kombinasyonu
# Tekrar eden satirlari say ve en cok tekrar edeni bul
sort access.log | uniq -c | sort -rn | head -5
sort + awk kombinasyonu
# Sadece belirli alanlari alip sirala
awk -F: '{print $1, $3}' /etc/passwd | sort -k2 -n
sort + join kombinasyonu
join komutu SQL’deki JOIN islemi gibi calisiyor ama dosyalarin sirali olmasi sart:
sort -k1 dosya1.txt > sorted1.txt
sort -k1 dosya2.txt > sorted2.txt
join sorted1.txt sorted2.txt
Sik Yapilan Hatalar
Sayi siralarken -n unutmak: En sik yapilan hata. “Neden 10 ile 9’dan kucuk cikiyor?” sorusunun cevabi her zaman -n eksikligi.
Alan araligini yanlis yazmak: -k3 ile -k3,3 farkli sey. Birincisi 3. alandan satir sonuna, ikincisi sadece 3. alan.
Ciktiyi ayni dosyaya yonlendirmek: sort dosya.txt > dosya.txt yapma, dosyayi kaybedersin. Her zaman -o kullan.
Ayirici belirtmeyi unutmak: CSV dosyalarinda -t, yazmadan siralama tamamen yanlis sonuc uretir.
Performans Ipuclari
- Cok buyuk dosyalarda once
grepile filtreleme yap, sonra sirala. Daha az veri, daha hizli sonuc. --parallelile CPU cekirdeklerini kullan.- SSD uzerinde calisiyorsan
-Tile gecici dosyalari SSD’ye yonlendir. - Pipeline’larda sort’u gecici dosya kullanmadan besleyebilirsin, bu da disk I/O’yu azaltir.
# Gecici dosya olmadan direkt pipeline
grep "ERROR" /var/log/syslog | sort -k1,2 | uniq -c | sort -rn
Sonuc
sort komutu, sistemini yonetirken gunluk is akisinin vazgecilmez bir parcasi. Tek basina bakinca “ne kadar basit bir arac” diyebilirsin ama -k, -t, -h, -n gibi parametrelerle birlesince ciddi bir veri isleme araci haline geliyor.
Bu yazida en cok isinize yarayacak noktalari ozetleyeyim:
- Sayisal veriler icin herzaman
-nkullan - Buyuk dosyalarda
-Sve--parallelile performans al - Alan bazli siralama icin
-tve-kikilisini ogren - Ayni dosyaya yazmak icin
-okullan, hicbir zaman>yonlendirmesi yapma sort | uniq -c | sort -rnpipeline’ini ezberle, sik sik lazim olacak
Bir sysadmin olarak log analizi, kullanici yonetimi, raporlama… her alanda sort ile butik cozumler uretebilirsin. Komutu tam anlayinca fark edeceksin ki zaten gunluk calisma alanin bircok problemi bu kucuk arayla cozulebiliyor.
Sorulariniz veya eklemek istedikleriniz varsa yorumlarda bulusuruz.