# Bash ile Dosyada Benzersiz Satır Sayısını Sayma
Bir log dosyasında kaç farklı IP adresi olduğunu, bir veritabanı yedeğinde kaç farklı tablo adı bulunduğunu veya bir metin dosyasında kaç farklı kelime kullanıldığını bilmeniz gerekiyor mu? Bu gibi durumlarda, dosyadaki benzersiz satır sayısını belirlemek büyük önem taşır. Bu makale, Bash komut satırı aracı kullanarak dosyalardaki benzersiz satır sayısını saymanın çeşitli yöntemlerini, adım adım açıklamaları ve performans optimizasyonlarını ele alacaktır. Farklı seviyelerdeki kullanıcılar için ayrıntılı bir rehber sunarak, bu görevi nasıl en etkili şekilde gerçekleştireceğinizi öğreneceksiniz.
Öğrenme Yol Haritası:
* Yeni Başlayan: sort ve uniq komutlarını kullanarak basit bir çözüm.
* Orta Seviye: Gerçek dünya senaryoları, büyük dosyalar için optimizasyon teknikleri ve awk kullanımı.
* İleri Seviye: Performans analizi, edge case’ler ve daha karmaşık senaryolar için çözümler.
Bash’te Benzersiz Satır Sayısını Saymanın Temel Yöntemi: sort ve uniq
Dosyadaki benzersiz satırları saymanın en temel yöntemi, sort ve uniq komutlarını birleştirmektir. sort komutu, dosyadaki satırları alfabetik sıraya göre sıralar, böylece aynı satırlar yan yana gelir. uniq komutu ise ardışık tekrar eden satırlardan sadece birini bırakır. -c seçeneği ise her benzersiz satırın kaç kez tekrar ettiğini gösterir. Son olarak wc -l komutu ile benzersiz satır sayısını elde ederiz.
Adım Adım Uygulama:
1. Örnek dosya oluşturma: Öncelikle, örnek bir dosya oluşturalım:
echo "elma" > meyveler.txt
echo "armut" >> meyveler.txt
echo "elma" >> meyveler.txt
echo "muz" >> meyveler.txt
echo "armut" >> meyveler.txt
2. sort ve uniq komutlarını kullanma: Şimdi, sort ve uniq komutlarını kullanarak benzersiz satırları sayalım:
sort meyveler.txt | uniq -c | wc -l
Bu komut, önce meyveler.txt dosyasını sıralar, sonra ardışık tekrar eden satırlardan birini tutar ve sayısını gösterir. Son olarak, wc -l komutu benzersiz satır sayısını (bu örnekte 3) ekrana yazdırır.
Yeni Başlayanlar İçin Basit Kod Örneği:
Yukarıdaki komut, yeni başlayanlar için benzersiz satır sayısını saymanın en basit ve anlaşılır yoludur. Bu komutu, herhangi bir dosya yoluna uygulayarak benzersiz satır sayısını kolayca bulabilirsiniz.
Büyük Dosyalar İçin Performans Optimizasyonu: awk kullanımı
Yukarıdaki yöntem küçük dosyalar için yeterli olsa da, çok büyük dosyalar için performans sorunlarına yol açabilir. Büyük dosyalarda daha hızlı sonuçlar elde etmek için awk kullanabiliriz. awk programlama dili, metin dosyalarını işlemek için oldukça verimlidir.
Nasıl Yapılır? awk ile Benzersiz Satır Sayısı Bulma:
Aşağıdaki awk komutu, her satırı bir dizi içinde saklar ve daha önce görülmemiş satırları sayar:
awk '!a[$0]++{count++} END {print count}' meyveler.txt
Bu komut, a adlı bir dizi kullanır. Her satır ($0) diziye anahtar olarak eklenir. Eğer satır daha önce diziye eklenmemişse (!a[$0]++), count değişkeni artırılır. END bloğu ise, tüm satırlar işlendikten sonra count değişkeninin değerini (benzersiz satır sayısını) yazdırır. Bu yöntem, sort ve uniq kombinasyonundan genellikle daha hızlıdır, özellikle büyük dosyalar için.
Gerçek Dünya Örneği: Log Dosyası Analizi
Bir web sunucusunun log dosyasında kaç farklı IP adresinin bulunduğunu belirlemek istediğimizi düşünelim. Log dosyası şu formatta olsun:
192.168.1.1 - - [10/Oct/2023:13:55:36 +0300] "GET /index.html HTTP/1.1" 200 1234
10.0.0.2 - - [10/Oct/2023:13:56:00 +0300] "POST /login HTTP/1.1" 200 5678
192.168.1.1 - - [10/Oct/2023:13:56:15 +0300] "GET /about.html HTTP/1.1" 200 9012
172.16.0.1 - - [10/Oct/2023:13:57:00 +0300] "GET /contact.html HTTP/1.1" 200 3456
10.0.0.2 - - [10/Oct/2023:13:57:30 +0300] "GET /index.html HTTP/1.1" 200 1234
IP adreslerini ayıklamak için awk kullanabiliriz:
awk '{print $1}' access.log | sort | uniq -c | wc -l
Bu komut, access.log dosyasından ilk sütunu (IP adresi) ayıklar, sıralar, benzersizleri bulur ve sayısını gösterir.
İleri Düzey Teknikler: Performans Analizi ve Edge Case’ler
Çok büyük dosyalarda performans kritik hale gelir. time komutu ile farklı yöntemlerin performansını karşılaştırabilirsiniz:
time sort access.log | uniq -c | wc -l
time awk '!a[$0]++{count++} END {print count}' access.log
Sonuçları karşılaştırarak hangi yöntemin daha hızlı olduğunu belirleyebilirsiniz. Ayrıca, dosyanın satır sonu karakterleri (Unix vs. Windows) gibi farklılıkları da göz önünde bulundurmanız gerekebilir. sed komutu ile satır sonu karakterlerini dönüştürebilirsiniz.
Karmaşık Senaryolar: Boş Satırlar ve Çoklu Boşluklar
Dosyanızda boş satırlar veya çoklu boşluklar varsa, bunlar benzersiz satır sayısını etkileyebilir. Örneğin, sed komutu ile boş satırları ve çoklu boşlukları temizleyebilirsiniz:
sed '/^$/d;s/[[:space:]]\+/ /g' access.log | awk '!a[$0]++{count++} END {print count}'
Bu komut, önce boş satırları siler (/^$/d), sonra çoklu boşlukları tek boşlukla değiştirir (s/[[:space:]]\+/ /g) ve son olarak awk ile benzersiz satır sayısını hesaplar.
Sonuç
Bash komut satırı aracı, dosyalardaki benzersiz satır sayısını saymak için güçlü ve esnek araçlar sunar. sort ve uniq komutları basit bir çözüm sunarken, awk büyük dosyalar için daha verimli bir yaklaşım sağlar. Performans optimizasyonu ve edge case’ler göz önünde bulundurularak, ihtiyaçlarınıza en uygun yöntemi seçebilirsiniz. Daha detaylı bilgi ve ileri seviye Bash teknikleri için [Fatih Soysal’ın web sitesini](https://fatihsoysal.com) ziyaret edebilirsiniz.
Sıkça Sorulan Sorular:
1. Çok büyük dosyalar için hangi yöntem daha uygundur? Genellikle awk yöntemi, özellikle bellek kullanımı açısından, sort ve uniq kombinasyonundan daha verimlidir.
2. Dosyamda farklı satır sonu karakterleri varsa ne yapmalıyım? sed komutu ile satır sonu karakterlerini standardize edebilirsiniz.
3. Benzersiz satırların listesini nasıl alabilirim? sort | uniq komutunu kullanarak benzersiz satırların listesini alabilirsiniz.
4. Performansı nasıl daha da iyileştirebilirim? Paralel işlem tekniklerini kullanarak veya daha özel bir araç kullanarak performansı artırabilirsiniz.
5. Dosya çok büyükse ve belleğim yetersizse ne yapmalıyım? Dosyayı daha küçük parçalara bölerek işlemek ve sonuçları birleştirmek gerekebilir.
Yazar: Fatih Soysal