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:
sortdavranışı sistem locale’ine bağlıdır. Tutarsız sonuçlar alıyorsanızLC_ALL=C sortkullanın. Bu özellikle CI/CD pipeline’larında önemli. - Büyük dosyaları yönlendirmeyle kaydetme:
sort dosya.txt > dosya.txtdosyayı siler. Her zaman-okullanın veya geçici dosyayla çalışın. - -n olmadan sayı sıralama: Sayısal veriyi her zaman
-nile sıralayın. - Alan numaralarını 0’dan saymak:
sortalanları 1’den başlatır, 0’dan değil. - -k ile alan sonu belirtmemek:
-k2yazmak yerine-k2,2yazın.-k2yazmak “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.
