sort Komutu ile Dosya İçeriğini Sıralama Teknikleri

Sistem yöneticiliğinde veriyle çalışmanın en temel ihtiyaçlarından biri, ham çıktıyı anlamlı bir sıraya koymaktır. Log dosyalarını analiz ederken, kullanıcı listelerini düzenlerken ya da disk kullanım raporları hazırlarken sort komutunu kullanmadan geçemezsiniz. Bu kadar yaygın kullanılmasına rağmen çoğu sysadmin sort‘un sadece yüzeyini çizer, oysa bu araç çok daha derin yeteneklere sahip. Gelin bu komutu gerçek dünya senaryolarıyla birlikte, sıfırdan ustaca kullanmaya başlayana kadar inceleyelim.

sort Komutunun Temelleri

sort, adından da anlaşılacağı üzere bir dosyanın ya da standart girdinin satırlarını sıralar. En basit haliyle şöyle kullanılır:

sort dosya.txt

Bu komut dosya.txt içeriğini alfabetik olarak sıralayıp ekrana basar. Dosyada değişiklik yapmaz, çıktıyı sadece stdout‘a yazar. Eğer sonucu kaydetmek istiyorsanız ya yönlendirme kullanırsınız ya da -o parametresiyle doğrudan çıktı dosyası belirlersiniz:

sort dosya.txt -o sirali_dosya.txt
# ya da
sort dosya.txt > sirali_dosya.txt

Burada önemli bir uyarı: sort dosya.txt > dosya.txt yapmayın. Bu komut dosyayı sıralamadan önce shell, dosya.txt‘yi truncate eder ve boş dosyayı sıralamaya çalışırsınız. -o parametresi bu konuda daha güvenlidir çünkü sort önce işlemi hafızada tamamlar, sonra yazar.

Temel Parametreler

Günlük işlerde en sık kullanacağınız parametreleri şöyle sıralayabiliriz:

  • -r: Ters sıralama (reverse), Z’den A’ya veya büyükten küçüğe sıralar
  • -n: Sayısal sıralama, metinsel değil nümerik karşılaştırma yapar
  • -k: Alan anahtarı belirler, hangi sütuna göre sıralayacağınızı seçersiniz
  • -t: Alan ayırıcı karakter belirler, varsayılan boşluktur
  • -u: Tekrar eden satırları kaldırır (unique)
  • -f: Büyük/küçük harf duyarsız sıralama (ignore case)
  • -h: İnsan tarafından okunabilir sayıları sıralar (1K, 2M, 3G gibi)
  • -V: Sürüm numaralarını doğru şekilde sıralar (1.2, 1.10, 2.0 gibi)
  • -o: Çıktıyı belirtilen dosyaya yazar
  • -c: Dosyanın zaten sıralı olup olmadığını kontrol eder
  • -b: Satır başındaki boşlukları yok sayar
  • -M: Ay adlarına göre sıralar (JAN, FEB, MAR…)
  • -z: Satır sonu olarak newline yerine null karakter kullanır

Sayısal Sıralama: -n Parametresinin Önemi

En sık yapılan hatalardan biri sayısal verileri -n olmadan sıralamaktır. Farkı hemen göstereyim:

# Yanlış: Metinsel sıralama
echo -e "10n2n20n1n100" | sort
# Çıktı: 1, 10, 100, 2, 20

# Doğru: Sayısal sıralama
echo -e "10n2n20n1n100" | sort -n
# Çıktı: 1, 2, 10, 20, 100

Bu fark özellikle disk kullanımı, port numaraları veya süreç ID’leri gibi verilerde kritik öneme sahip. Metinsel sıralama “100”ü “2”den önce koyar çünkü karakter karşılaştırması yapar, ilk karakter “1” ile “2”yi karşılaştırdığında “1” küçük gelir.

Alan Bazlı Sıralama: -k Parametresi

-k parametresi sort‘un en güçlü özelliklerinden biridir. Çok sütunlu verilerde belirli bir sütuna göre sıralama yapmanızı sağlar.

# /etc/passwd dosyasını UID'ye (3. alan) göre sırala
sort -t: -k3 -n /etc/passwd

# Aynı dosyayı kullanıcı adına (1. alan) göre sırala
sort -t: -k1 /etc/passwd

-k parametresinin sözdizimi biraz daha karmaşıktır. -k BASLANGIC[,BITIS] formatında kullanılır. Örneğin -k2,4 ikinci alandan dördüncü alana kadar olan kısmı sıralama anahtarı olarak kullanır.

Gerçek hayat senaryosu: Diyelim ki bir erişim log’unuz var ve IP adresine göre sıralamak istiyorsunuz:

# access.log formatı: IP - - [tarih] "istek" status boyut
cat access.log | sort -k1,1 | head -20

# Durum koduna (5. alan) göre sıralayıp kaç tane hata olduğunu görmek
awk '{print $9}' access.log | sort | uniq -c | sort -rn

Çoklu Anahtar Sıralama

Birden fazla kritere göre sıralama yapmak istediğinizde birden fazla -k parametresi kullanabilirsiniz. Önce birincil anahtar uygulanır, eşit olan satırlara ikincil anahtar uygulanır.

# Önce departmana, sonra soyadına göre sırala
sort -t',' -k2,2 -k1,1 calisanlar.csv

# Önce durum koduna (sayısal), sonra IP'ye (alfanümerik) göre sırala
sort -k9,9n -k1,1 access.log

Bir örnekle daha pekiştirelim. Elimde şöyle bir dosya olsun:

cat sunucular.txt
# web01 production 16
# db01 production 32
# web02 staging 8
# db02 staging 16
# cache01 production 8

Bu dosyayı önce ortama (2. sütun), sonra RAM’e (3. sütun, büyükten küçüğe) göre sıralamak için:

sort -k2,2 -k3,3rn sunucular.txt
# Çıktı:
# db01 production 32
# web01 production 16
# cache01 production 8
# db02 staging 16
# web02 staging 8

İnsan Tarafından Okunabilir Boyutları Sıralama: -h

du, df veya ls -lh çıktılarını sıralarken sayısal sıralama işe yaramaz. Çünkü “1G” ve “512M” gibi değerler sayısal olarak karşılaştırılamaz. Bu noktada -h parametresi hayat kurtarır:

# Dizinleri boyutlarına göre büyükten küçüğe sırala
du -sh /var/* | sort -rh

# Örnek çıktı:
# 4.2G  /var/log
# 1.1G  /var/cache
# 856M  /var/lib
# 124M  /var/tmp

Bu komutu monitoring scriptlerinde ve haftalık raporlarda sıklıkla kullanıyorum. Hangi dizinin disk alanını tükettiğini saniyeler içinde görmek mümkün.

Gerçek Dünya Senaryoları

Log Analizi

Üretim ortamında çalışan bir web sunucusunda ani bir yavaşlama yaşandığını düşünelim. İlk adım genellikle log dosyalarına bakmaktır:

# En çok istek gönderen IP'leri bul
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# En yavaş istekleri bul (response time'a göre sırala)
awk '{print $NF, $0}' /var/log/nginx/access.log | sort -rn | head -10 | cut -d' ' -f2-

# 5xx hatalarını zaman sırasına göre listele
grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | sort -k4,4 | tail -50

Süreç Yönetimi

Sisteminizde hangi süreçlerin en çok kaynak tükettiğini bulmak:

# CPU kullanımına göre süreçleri sırala
ps aux | sort -k3 -rn | head -15

# Bellek kullanımına göre sürec sırala
ps aux | sort -k4 -rn | head -15

# Süreç adına göre alfabetik sırala
ps aux | sort -k11 | grep -v "^USER" | head -20

Cron Job ve Servis Yönetimi

Birden fazla sunucuda çalışan bir ortamda, her sunucudaki cron job’ların çakışıp çakışmadığını kontrol etmek:

# Cron job'ları çalışma saatine göre sırala
crontab -l | grep -v '^#' | sort -k2,2n -k1,1n

Dosya Sistemi Temizliği

Eski log dosyalarını temizlemeden önce nelerin olduğunu görmek:

# En büyük dosyaları bul ve sırala
find /var/log -type f -name "*.log" -exec ls -lh {} ; | sort -k5 -rh | head -20

# En eski dosyaları bul
find /tmp -type f -printf "%T+ %pn" | sort | head -20

# En yeni oluşturulan dosyaları bul
find /home -type f -printf "%T+ %pn" | sort -r | head -20

Unique Sıralama: -u Parametresi

-u parametresi sıralama yaparken tekrar eden satırları eler. sort | uniq kombinasyonuyla neredeyse aynı sonucu verir ama tek geçişte:

# Tekrar eden satırları kaldır
sort -u liste.txt

# Sadece belirli alana göre unique yap
# Örnek: IP listesinde her IP'yi bir kez göster
sort -t'.' -k1,4 -u ip_listesi.txt

Dikkat: sort -u ve sort | uniq ince bir farkla ayrılır. sort -u sıralama anahtarına göre unique yaparken, uniq tam satır eşleşmesi arar. Eğer -k ile alan belirtmişseniz bu fark önemli hale gelir.

Sürüm Numaralarını Sıralama: -V

Yazılım sürümlerini sıralarken hem -n hem de alfanümerik sıralama hatalı sonuç verir. -V parametresi bu problemi çözer:

# Yanlış: Alfanümerik sıralama
echo -e "1.10.0n1.9.0n2.0.0n1.2.0" | sort
# Çıktı: 1.10.0, 1.2.0, 1.9.0, 2.0.0 (yanlış)

# Doğru: Sürüm sıralaması
echo -e "1.10.0n1.9.0n2.0.0n1.2.0" | sort -V
# Çıktı: 1.2.0, 1.9.0, 1.10.0, 2.0.0 (doğru)

Bu özelliği özellikle kernel sürümlerini veya paket versiyonlarını listelerken kullanıyorum:

# Yüklü kernel sürümlerini doğru sırayla listele
ls /boot/vmlinuz-* | sort -V

# Bir paketin geçmiş sürümlerini sırala
apt list --installed 2>/dev/null | grep nginx | sort -V

Paralel Sıralama ve Performans

Büyük dosyalarla çalışırken sort oldukça bellek ve CPU yoğun olabilir. GNU sort bazı optimizasyon seçenekleri sunar:

  • –parallel=N: Kaç iş parçacığı kullanılacağını belirler
  • -S, –buffer-size: Kullanılacak bellek miktarını ayarlar
  • -T, –temporary-directory: Geçici dosyaların yazılacağı dizini belirler
# 4 çekirdek kullanarak büyük dosyayı sırala
sort --parallel=4 -S 2G /var/log/huge_access.log -o sorted_access.log

# Geçici dosyaları /tmp yerine başka bir yere yaz (SSD'de daha hızlı)
sort -T /fast_ssd/tmp büyük_dosya.txt -o sıralı.txt

Gerçek bir senaryoda 50GB’lık bir log dosyasını işlemek gerektiğinde bu parametreler ciddi fark yaratır. --parallel=4 -S 4G kombinasyonuyla işlem süresini dörtte birine indirebildiğim oldu.

Kontrol Modu: -c Parametresi

Bir dosyanın zaten sıralı olup olmadığını kontrol etmek için -c parametresini kullanabilirsiniz. Bu özellikle script’lerde ön kontrol yaparken işe yarar:

# Dosya sıralı mı kontrol et
sort -c dosya.txt
# Sıralıysa çıktı vermez, değilse hangi satırda bozulduğunu söyler
# "sort: dosya.txt:3: disorder: bozuk_satir"

# Script içinde kullanım
if sort -c /etc/hosts 2>/dev/null; then
    echo "Dosya zaten sıralı"
else
    echo "Dosya sıralı değil, sıralanıyor..."
    sort /etc/hosts -o /etc/hosts.sorted
fi

Pipeline’da sort Kullanımı

sort komutunun gerçek gücü, diğer komutlarla kombinasyon kurulduğunda ortaya çıkar. Birkaç güçlü pipeline örneği:

# Nginx error log'undaki hata türlerini frekansa göre sırala
grep "error" /var/log/nginx/error.log | 
  awk '{print $NF}' | 
  sort | 
  uniq -c | 
  sort -rn | 
  head -10

# Sisteme bağlı kullanıcıları son giriş zamanına göre sırala
last | grep -v "^$|reboot|wtmp" | sort -k5,8 | head -20

# En fazla açık dosyası olan süreçleri listele
lsof 2>/dev/null | 
  awk '{print $1, $2}' | 
  sort | 
  uniq -c | 
  sort -rn | 
  head -15

CSV ve Yapılandırılmış Veri Sıralama

CSV dosyalarıyla çalışırken -t ve -k kombinasyonu çok işe yarar:

# Örnek: sunucu_listesi.csv
# hostname,ip,ram,cpu,datacenter
# web01,192.168.1.10,16,4,DC1
# db01,192.168.1.20,64,8,DC2

# RAM'e göre büyükten küçüğe sırala (3. sütun)
sort -t',' -k3,3rn sunucu_listesi.csv

# Önce datacenter'a (5. sütun), sonra hostname'e (1. sütun) göre sırala
sort -t',' -k5,5 -k1,1 sunucu_listesi.csv

# Header satırını koruyarak sırala
(head -1 sunucu_listesi.csv && tail -n +2 sunucu_listesi.csv | sort -t',' -k3,3rn) > sorted_sunucular.csv

Bu son teknik özellikle dikkat edin: CSV dosyalarında header satırını olduğu yerde bırakarak geri kalanını sıralamak için bu (head; tail | sort) kalıbını kullanmak çok pratik. Bunu sık sık raporlama scriptlerimde kullanıyorum.

Null-Delimited Sıralama: -z Parametresi

Dosya adlarında boşluk veya özel karakter varsa -z parametresi hayat kurtarır. Bu parametre, satır sonu olarak n yerine null karakter () kullanır:

# Boşluklu dosya adlarını güvenle sırala
find /home -name "*.pdf" -print0 | sort -z | xargs -0 ls -lh

# Boşluklu isimleri tarih sırasına göre sırala
find /backup -type f -name "*.tar.gz" -printf "%T@ %p" | 
  sort -z -n | 
  cut -d' ' -f2- | 
  tr '' 'n'

Pratik Bir Senaryo: Sunucu Envanteri Güncelleme

Gerçek bir senaryo olarak düşünün: Elinizde birden fazla kaynaktan gelen, karmaşık bir sunucu listesi var. Bunları birleştirip temizlemek ve sıralı bir envanter oluşturmak istiyorsunuz:

#!/bin/bash
# Envanter temizleme ve sıralama scripti

ENVANTER_DIZIN="/opt/inventory"
CIKTI="/opt/inventory/temiz_envanter.csv"

# Tüm kaynaklardan veriyi birleştir
cat $ENVANTER_DIZIN/datacenter1.csv 
    $ENVANTER_DIZIN/datacenter2.csv 
    $ENVANTER_DIZIN/cloud.csv > /tmp/ham_envanter.csv

# Header'ı al
HEADER=$(head -1 /tmp/ham_envanter.csv)

# Header'sız verileri sırala: önce datacenter, sonra tip, sonra hostname
# Tekrar edenleri kaldır
TEMIZ=$(tail -n +2 /tmp/ham_envanter.csv | 
        sort -t',' -k5,5 -k3,3 -k1,1 -u)

# Sonucu yaz
echo "$HEADER" > $CIKTI
echo "$TEMIZ" >> $CIKTI

echo "Envanter güncellendi: $(wc -l < $CIKTI) sunucu kaydı"

Sık Yapılan Hatalar

Yıllar içinde hem kendimin hem de ekip arkadaşlarımın yaptığı bazı yaygın hataları paylaşayım:

  • Locale sorunu: sort davranışı sistem locale’ine bağlıdır. Tutarsız sonuçlar alıyorsanız LC_ALL=C sort kullanın. Bu özellikle CI/CD pipeline’larında önemli.
  • Büyük dosyaları yönlendirmeyle kaydetme: sort dosya.txt > dosya.txt dosyayı siler. Her zaman -o kullanın veya geçici dosyayla çalışın.
  • -n olmadan sayı sıralama: Sayısal veriyi her zaman -n ile sıralayın.
  • Alan numaralarını 0’dan saymak: sort alanları 1’den başlatır, 0’dan değil.
  • -k ile alan sonu belirtmemek: -k2 yazmak yerine -k2,2 yazın. -k2 yazmak “2. alandan satır sonuna kadar” anlamına gelir ve beklenmedik sonuçlar doğurabilir.

Sonuç

sort komutu, Linux sistem yönetiminin görünmez kahramanlarından biri. Tek başına kullanıldığında güçlü, pipeline içinde kullanıldığında ise gerçek anlamda bir veri işleme motoruna dönüşüyor. -n, -k, -t, -h, -V gibi parametreleri iyi kavradığınızda log analizi, envanter yönetimi ve sistem izleme işlerinizde ciddi zaman kazanıyorsunuz.

Günlük sysadmin rutininde en sık kullandığım kombinasyonlar şunlar: disk doluluk analizi için du -sh | sort -rh, log analizi için awk | sort | uniq -c | sort -rn ve çok sütunlu CSV işlemleri için sort -t',' -k2,2 -k1,1. Bu üç kalıbı ezberlemek bile sort‘tan çok daha fazla verim almanızı sağlar.

Son olarak, büyük dosyalarla çalışırken --parallel ve -S parametrelerini ihmal etmeyin. Modern sunucularda çok çekirdekli işlemcinin gücünden yararlanmak, saatler sürebilecek sıralama işlemlerini dakikalara indirgeyebilir.

Bir yanıt yazın

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