sort Komutu ile Dosya Icerigini Siralama Teknikleri

Linux sort komutu, metin dosyalarini ve komut ciktilerini hizlica siralamanizi saglar. Alfabetik, sayisal ve sutun bazli siralama secenekleriyle guclu bir arac olan sort komutunu bu yazida detaylica inceliyoruz. Gercek dunyadan orneklerle sort komutunun tum onemli parametrelerini ele aliyoruz.

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
  • -k3 ucuncu alana gore sirala
  • -n sayisal 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) al
  • sort – Siralayarak uniq’e hazirla
  • uniq -c – Her IP’yi say
  • sort -rn – Sayiya gore buyukten kucuge sirala
  • head -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 grep ile filtreleme yap, sonra sirala. Daha az veri, daha hizli sonuc.
  • --parallel ile CPU cekirdeklerini kullan.
  • SSD uzerinde calisiyorsan -T ile 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 -n kullan
  • Buyuk dosyalarda -S ve --parallel ile performans al
  • Alan bazli siralama icin -t ve -k ikilisini ogren
  • Ayni dosyaya yazmak icin -o kullan, hicbir zaman > yonlendirmesi yapma
  • sort | uniq -c | sort -rn pipeline’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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir