← Bash tools
TEKNİK REHBER BASH TOOLS METİN İŞLEME 2026

sort ve uniq
sıralama ve tekilleştirme

Unix'te veri sıralama ve tekrar eden satırları yönetme. sort satırları sıralar; uniq ardışık tekrarları kaldırır — ikisi birlikte veri analizi ve log işleme için temel araç çiftidir.

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.

bash
# 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
1
sort — satırları alfabetik/sayısal sıraya diz
2
uniq -c — ardışık aynıları say ve başına yaz
3
sort -rn — sayıya göre büyükten küçüğe sırala
4
head -20 — ilk 20'yi göster

01 sort: temel kullanım

sort varsayılan olarak alfabetik sıralama yapar. Sayılar için -n, boyutlar için -h gerekir.

bash
# 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
-n
Sayısal sıralama — "10" "9"dan büyük (varsayılan alfabetik'te "10" < "9")
-r
Ters sırala (reverse)
-f
Büyük/küçük harf fark etmez (fold case)
-h
İnsan-okunur boyutları anla: K, M, G, T (du/ls -h çıktısı için)
-M
Ay adlarına göre sırala: Jan < Feb < ... < Dec
-V
Sürüm/doğal sıralama — sayı bloklarını numerik değerlendirir
-g
Genel sayısal — float ve bilimsel gösterim (1.5e3) anlar
YAYGON TUZAK

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.

bash
# /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
-k POS1[,POS2]
Sıralama anahtarı. POS: alan[.karakter][flags]. Örn: -k2,2n = 2. alan sayısal
-t SEP
Alan ayırıcı karakter. Varsayılan boşluk/tab. Virgül için -t,
ALAN NUMARASI

-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.

bash
# 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
-u
Sırala ve benzersiz satırları tut — sort | uniq kısayolu
--stable
Kararlı sıralama — eşit anahtar değerli satırların orijinal sırası bozulmaz
-R
Rasgele karıştır (her çalıştırmada farklı sonuç)
-z
NUL karakteriyle ayrılmış girdi/çıktı (-print0 ile birlikte)
--parallel=N
N iş parçacığı ile paralel sıralama
-S BOYUT
Bellek tamponu boyutu — örn: 2G, 500M
-c
Girdi sıralı mı kontrol et — sıralama yapmaz, hatalı satırı bildirir

04 uniq: sayma ve filtreleme

uniq ardışık aynı satırları işler: sayabilir, sadece tekrarları ya da sadece benzersizleri gösterebilir.

bash
# 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
-c
Her satırın başına tekrar sayısını yaz
-d
Yalnızca tekrar eden satırları göster (en az 2 kez geçenler)
-u
Yalnızca benzersiz satırları göster (tam olarak 1 kez geçenler)
-D
Tekrar eden tüm satırları göster (her kopyayı ayrı yazdırır)
KRİTİK

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.

bash
# 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
-i
Büyük/küçük harf duyarsız karşılaştırma — sort -f ile birlikte kullanın
-f N
İlk N alanı (boşlukla ayrılmış) karşılaştırmada atla
-s N
İlk N karakteri karşılaştırmada atla
-w N
Karşılaştırmayı sadece ilk N karakterle sınırla
-z
NUL ayrımlı girdi/çıktı (boşluklu satır adları için)

06 İ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ı.

bash
# 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 KOMUTU

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.

bash — En çok hata üreten endpoint'ler
# 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
bash — CSV'de yinelenen kayıtları bul
# 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
bash — İki sunucunun paket listesi farkı
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
bash — Disk kullanımı büyükten küçüğe
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

  • sort varsayılan alfabetik — sayılar için -n, boyutlar için -h
  • uniq her 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ır
  • comm -12: kesişim; -23: fark — her ikisi de önce sort istiyor
  • sort -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ü