00 Neden ikisi birlikte?
sort ve uniq birbirini tamamlayan araçlar — uniq'in doğru çalışması için girişin sıralı olması şart.
uniq yalnızca ardışık tekrarları algılar. Rastgele sıralı bir dosyada aynı satır birden fazla yerde bulunabilir ama uniq onları farklı sanır. Bu yüzden neredeyse her zaman önce sort, sonra uniq gelir.
# Temel idiom: sırala → tekilleştir → say → sırala → kırp
sort access.log | uniq -c | sort -rn | head -20
# Hangi IP'ler en çok istek attı?
awk '{print $1}' access.log | sort | uniq -c | sort -rn
01 sort: temel kullanım
sort varsayılan olarak alfabetik sıralama yapar. Sayılar için -n, boyutlar için -h gerekir.
# Varsayılan: alfabetik (lexicographic)
sort isimler.txt
# Sayısal sıralama (10 > 9 doğru anlaşılır)
sort -n sayilar.txt
# Ters sıralama
sort -r isimler.txt
sort -rn sayilar.txt # büyükten küçüğe sayısal
# Büyük/küçük harf duyarsız
sort -f isimler.txt
# İnsan-okunur boyut sıralaması (du/ls -h çıktısı için)
du -sh /var/log/* | sort -h
# Ay adına göre sırala (Jan, Feb, Mar...)
sort -M tarihler.txt
# Doğal sıralama: file10, file2'den sonra gelir
sort -V dosyalar.txt
sort -n olmadan sayısal veri sıralarsanız "10" alfabetik olarak "2"den önce gelir çünkü ilk karakter "1" < "2". Sayısal veriler için her zaman -n ekleyin.
02 sort: sütun bazlı sıralama
-k bayrağı hangi alanın (sütunun) sıralamaya esas alınacağını belirtir. -t ile alan ayırıcıyı değiştirebilirsiniz.
# /etc/passwd: : ayraçlı, 3. alan (UID) sayısal sıralama
sort -t':' -k3 -n /etc/passwd
# Önce 1. alan alfabetik, eşitlerde 2. alan sayısal
sort -k1,1 -k2,2n dosya.txt
# -k başlangıç,bitiş — virgülsüz ise satır sonuna kadar!
sort -k2 dosya.txt # 2. alandan satır sonuna (dikkat)
sort -k2,2 dosya.txt # sadece 2. alan (istenen budur)
# CSV: virgül ayraçlı, 3. alan sayısal ters
sort -t',' -k3,3rn data.csv
# Tab ayraçlı (TSV)
sort -t $'\t' -k2,2 data.tsv
# Sütun içinde karakter aralığına göre: alan.karakter
sort -k1.3,1.5 dosya.txt # 1. alanın 3-5. karakterleri
alan[.karakter][flags]. Örn: -k2,2n = 2. alan sayısal-t,-k2,2 ile -k2 aynı değil: -k2 2. alandan satır sonuna kadar tüm metni anahtar olarak alır; -k2,2 sadece 2. alanı alır. Kesin davranış için her zaman başlangıç ve bitiş belirtin.
03 sort: benzersiz ve özel modlar
sort -u sıralama + tekilleştirme işini tek adımda yapar. Büyük dosyalar için paralel ve bellek seçenekleri de var.
# Sırala ve tekrarları at (sort | uniq kısayolu)
sort -u dosya.txt
# Kararlı sıralama — eşit satırların orijinal sırası korunur
sort --stable -k1,1 dosya.txt
# Rasgele karıştır (shuffle)
sort -R liste.txt
# NUL ayrımlı girdi/çıktı (boşluklu dosya adları güvenli)
find . -name '*.log' -print0 | sort -z
# Paralel sıralama (büyük dosyalar için)
sort --parallel=4 -n buyuk.txt
# Bellek sınırı belirt
sort -S 2G -n buyuk.txt
# Girdi sıralı mı kontrol et (sıralamadan)
sort -c -n dosya.txt
# Çıkış kodu 0 = sıralı, 1 = sıralı değil
sort | uniq kısayolu-print0 ile birlikte)2G, 500M04 uniq: sayma ve filtreleme
uniq ardışık aynı satırları işler: sayabilir, sadece tekrarları ya da sadece benzersizleri gösterebilir.
# Her satırın kaç kez geçtiğini başına yaz
sort dosya.txt | uniq -c
3 apple
1 banana
2 cherry
# Sadece tekrar eden satırları göster (en az 2 kez)
sort dosya.txt | uniq -d
# Sadece bir kez geçen satırları göster (benzersizler)
sort dosya.txt | uniq -u
# Tekrar edenlerin tüm kopyalarını göster
sort dosya.txt | uniq -D
# Hem -c hem -d: sadece tekrar edenlerin sayısı
sort dosya.txt | uniq -cd
# Kaç tane benzersiz satır var?
sort dosya.txt | uniq | wc -l
uniq yalnızca ardışık tekrarları görür. Sıralanmamış girişte çalışmaz. Her zaman önce sort çalıştırın: sort dosya.txt | uniq -c
05 uniq: gelişmiş seçenekler
Büyük/küçük harf duyarsızlık, alan atlama ve karakter atlama ile karşılaştırmayı ince ayar yapabilirsiniz.
# Büyük/küçük harf duyarsız karşılaştır
sort -f dosya.txt | uniq -i
# İlk N alanı atla (boşlukla ayrılmış)
# Örnek: zaman damgasını (2 alan) atla, mesajı karşılaştır
sort -k3 syslog.txt | uniq -f2
# İlk N karakteri atla
sort dosya.txt | uniq -s4
# Sadece ilk N karaktere bak (geri kalanı yoksay)
sort dosya.txt | uniq -w8
# NUL ayrımlı girdi/çıktı (find -print0 ile)
find . -name '*.log' -print0 | sort -z | uniq -z
sort -f ile birlikte kullanın06 İkisi birlikte: güçlü kombinasyonlar
En sık kullanılan örüntüler: en çok N şeyi bul, iki listenin farkı, kelime sıklığı sayımı.
# En çok geçen 10 IP adresi (nginx log)
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# İki dosyadaki ortak satırlar (∩ kesişim)
comm -12 <(sort a.txt) <(sort b.txt)
# a.txt'de olup b.txt'de olmayan (a − b farkı)
comm -23 <(sort a.txt) <(sort b.txt)
# Kelime sıklığı sayacı
tr -cs 'A-Za-z' '\n' < metin.txt | tr 'A-Z' 'a-z' | \
sort | uniq -c | sort -rn | head -20
# Kaç tane benzersiz HTTP durum kodu var?
awk '{print $9}' access.log | sort -n | uniq -c
# Hata mesajlarını zaman damgasız tekilleştir
grep 'ERROR' app.log | sed 's/^[0-9T:Z.-]* //' | sort | uniq -c | sort -rn
comm iki sıralı dosyayı karşılaştırır. Her sütunun bastırılmasını -1/-2/-3 ile kontrol edersiniz: -12 = her ikisinde de olanlar (kesişim); -23 = yalnızca 1. dosyada olanlar (fark).
07 Pratik vakalar
Gerçek dünya senaryoları: log analizi, CSV işleme, deduplication, veri kalitesi.
# Nginx access.log'dan 5xx hataları analiz et
awk '$9 >= 500 {print $9, $7}' access.log \
| sort | uniq -c | sort -rn | head -15
42 500 /api/v2/users
18 503 /api/v1/reports
7 500 /api/v2/upload
# E-posta sütununa göre (2. alan) yinelenen kayıtlar
sort -t',' -k2,2 users.csv | uniq -D -f1
# Kaç yinelenen kayıt var?
sort -t',' -k2,2 users.csv | uniq -d -f1 | wc -l
ssh serverA 'dpkg -l | awk '"'"'{print $2}'"'"'' | sort > a.txt
ssh serverB 'dpkg -l | awk '"'"'{print $2}'"'"'' | sort > b.txt
# A'da var, B'de yok
comm -23 a.txt b.txt
# B'de var, A'da yok
comm -13 a.txt b.txt
du -sh /var/log/* 2>/dev/null | sort -rh | head -10
1.2G /var/log/journal
234M /var/log/syslog
45M /var/log/kern.log
Hatırlanacaklar
sortvarsayılan alfabetik — sayılar için-n, boyutlar için-huniqher zaman önce sıralı girdi gerektirir- Top-N sayacı:
sort | uniq -c | sort -rn | head -N -k2,2n: 2. alanı sayısal sırala;-k2(virgülsüz) 2'den sona kadar alırcomm -12: kesişim;-23: fark — her ikisi de öncesortistiyorsort -u=sort | uniq— tek adımda tekilleştir
Devam: cut, paste, column — alan seçimi · tr, wc — karakter dönüşümü ve sayma · grep, sed, awk — metin işleme üçlüsü