# sed ile Belirli Kalıpla Başlayan Satırları Silme
Log dosyalarını temizlemek, metin dosyalarından gereksiz bilgileri ayıklamak veya büyük veri kümelerini işlemek gibi birçok durumda, belirli bir kalıpla başlayan satırları silme ihtiyacı duyabilirsiniz. sed (stream editor) komutu, bu işlemi hızlı ve verimli bir şekilde gerçekleştirmenize olanak tanır. Bu makalede, sed komutunu kullanarak belirli bir kalıpla başlayan satırları nasıl sileceğinizi adım adım öğreneceksiniz. Farklı karmaşıklık seviyelerindeki örnekler ve performans optimizasyonu ipuçları ile uzman seviyesine ulaşacaksınız.
Öğrenme Yol Haritası
Yeni Başlayan: Temel sed komutları ve basit bir örnek ile başlayacağız.
Orta Seviye: Gerçek dünya senaryolarından örnekler ve performans optimizasyonu ipuçları ele alacağız.
İleri Seviye: Karmaşık kalıplar, performans analizi ve özel durumlar (edge caseler) üzerinde duracağız.
sed ile Satır Silme: Temel Kavramlar
sed (stream editor), metin dosyalarını satır satır işleyen güçlü bir komut satırı aracıdır. Birçok metin işleme görevi için kullanılabilir, ancak bu makalede odak noktamız belirli bir kalıpla başlayan satırları silmek olacak. sed komutları genellikle şu formatta kullanılır:
sed 'komut' dosya_adi
komut kısmı, sed‘in yapmasını istediğiniz işlemi belirtir. Bizim durumumuzda, satır silme işlemi için d komutunu kullanacağız.
Nasıl Yapılır? Belirli Kalıpla Başlayan Satırları Silme (Yeni Başlayan)
En basit senaryoda, belirli bir kelimeyle başlayan tüm satırları silmek istiyoruz diyelim. Örneğin, “HATA:” ile başlayan tüm satırları bir log dosyasından silmek. Bunun için şu komutu kullanabiliriz:
sed '/^HATA:/d' log.txt
Bu komutta:
* /^HATA:/: Bu kısım, “HATA:” ile başlayan (^) satırları eşleştiren bir düzenli ifadedir.
* d: Bu, eşleşen satırları silme (delete) komutudur.
* log.txt: İşlem uygulanacak dosyadır.
Bu komut, log.txt dosyasındaki “HATA:” ile başlayan tüm satırları siler ve sonucu ekrana yazdırır. Dosyayı kalıcı olarak değiştirmek için -i (inplace) seçeneğini kullanmalısınız:
sed -i '/^HATA:/d' log.txt
Örnek: log.txt dosyası şu içeriğe sahip olsun:
Bilgi: Sistem başlatılıyor...
HATA: Bağlantı kurulamadı.
Uyarı: Düşük disk alanı.
HATA: Dosya bulunamadı.
Bilgi: Sistem çalışıyor.
Yukarıdaki sed komutu çalıştırıldığında, çıktı şu şekilde olacaktır:
Bilgi: Sistem başlatılıyor...
Uyarı: Düşük disk alanı.
Bilgi: Sistem çalışıyor.
Gerçek Dünya Örneği ve Optimizasyon İpuçları (Orta Seviye)
Şimdi daha gerçekçi bir senaryo ele alalım. Bir web sunucusunun log dosyasında, belirli bir IP adresinden gelen tüm istekleri silmek istediğimizi varsayalım. IP adresi “192.168.1.100” olsun. Komut şu şekilde olacaktır:
sed '/^192\.168\.1\.100/d' access.log
Burada nokta (.) özel karakteri, düzenli ifadelerde özel bir anlam taşır. Bu nedenle, noktayı \ ile kaçırmamız gerekir. Bu, sed‘in noktayı literal bir nokta olarak yorumlamasını sağlar.
Performans Optimizasyonu: Çok büyük dosyalar için sed‘in performansı önemli olabilir. Bu durumda, sed‘in -i seçeneği yerine -i bakcup seçeneğini kullanarak yedek dosya oluşturmanızı tavsiye ederim. Böylece, hatalı bir işlem durumunda orijinal dosyanızı geri yükleyebilirsiniz. Ayrıca, sed komutunu bir grep komutu ile birleştirerek öncelikle eşleşen satırları filtrelemek daha verimli olabilir. Örneğin:
grep -v '^192\.168\.1\.100' access.log > access_filtered.log
Bu komut, “192.168.1.100” ile başlamayan satırları access_filtered.log dosyasına yazar.
Karmaşık Kalıplar ve Özel Durumlar (İleri Seviye)
Daha karmaşık kalıplarla çalışırken, düzenli ifadelerin gücünden yararlanabilirsiniz. Örneğin, “HATA:” veya “UYARI:” ile başlayan tüm satırları silmek için şu komutu kullanabilirsiniz:
sed '/^\(HATA\|UYARI\):/d' log.txt
Bu komutta, \| operatörü “veya” anlamına gelir. \( ... \) ise gruplama işlemi için kullanılır.
Performans Analizi: sed komutunun performansını analiz etmek için time komutunu kullanabilirsiniz:
time sed '/^HATA:/d' log.txt
Bu, komutun çalışma süresini ve kaynak kullanımını gösterir. Büyük dosyalar için farklı yaklaşımların performansını karşılaştırarak en verimli yöntemi bulabilirsiniz. [Fatih Soysal’ın](https://fatihsoysal.com) blogunda performans optimizasyonu hakkında daha detaylı bilgi bulabilirsiniz.
Nasıl Yapılır? Çoklu Kalıpla Eşleşme ve Silme
Birden fazla kalıpla eşleşen satırları silmek için, düzenli ifadelerdeki | (veya) operatöründen yararlanabiliriz. Örneğin, “HATA:”, “UYARI:” veya “ÖNEMLİ:” ile başlayan satırları silmek için:
sed '/^\(HATA\|UYARI\|ÖNEMLİ\):/d' log.txt
Bu, parantezler içindeki her kalıpla başlayan satırları silecektir.
Nasıl Yapılır? Karmaşık Düzenli İfadeler ile Satır Silme
Daha karmaşık senaryolar için, daha gelişmiş düzenli ifadeler kullanabilirsiniz. Örneğin, “2023-10-26” tarihini içeren ve “HATA” kelimesiyle başlayan tüm satırları silmek için:
sed '/^HATA.*2023-10-26/d' log.txt
Bu komut, “HATA” ile başlayan ve herhangi bir karakter dizisi (.*) sonrasında “2023-10-26” tarihini içeren satırları silecektir.
Vaka Analizi: Gerçek Dünya Senaryoları
Senaryo 1: Bir web sunucusunun log dosyasında, belirli bir HTTP hata koduyla (örneğin, 404) sonuçlanan tüm istekleri silmek.
sed '/404 /d' access.log
Senaryo 2: Bir yazılımın log dosyasında, belirli bir fonksiyonun (fonksiyonAdi()) çağrısıyla ilgili tüm hata mesajlarını silmek.
sed '/fonksiyonAdi\(\).*\(HATA\|UYARI\)/d' log.txt
Senaryo 3: Bir konfigürasyon dosyasında, belirli bir parametreye (parameterName) ait tüm satırları silmek.
sed '/^parameterName=/d' config.txt
Sonuç
sed komutu, belirli kalıplarla başlayan satırları silmek için güçlü ve verimli bir araçtır. Bu makalede, temel kullanımdan ileri düzey tekniklere kadar geniş bir yelpazede örnekler ve ipuçları sunduk. Düzenli ifadelerin gücünden yararlanarak, karmaşık metin işleme görevlerini kolayca gerçekleştirebilirsiniz. Unutmayın ki, büyük dosyalar için performans optimizasyonu oldukça önemlidir ve sed komutunu grep gibi diğer komutlarla birleştirmek verimliliği artırabilir. Her zaman yedek dosya oluşturmayı ve komutları test ederek çalışmasını doğrulamayı unutmayın.
Sıkça Sorulan Sorular:
1. sed komutunu geri almak mümkün mü? Evet, sed -i bakcup seçeneğini kullanarak yedek dosya oluşturabilirsiniz.
2. Çok büyük dosyalar için alternatif yöntemler var mı? awk veya perl gibi daha güçlü metin işleme araçlarını kullanabilirsiniz.
3. Düzenli ifadeleri daha iyi öğrenmek için kaynak önerisi var mı? [Fatih Soysal’ın](https://fatihsoysal.com) blogunda düzenli ifadeler hakkında detaylı bilgi bulabilirsiniz.
4. sed komutunda hata alırsam ne yapmalıyım? Hata mesajını dikkatlice inceleyin ve sed komutunun doğru yazıldığından emin olun. Düzenli ifadenizi doğrulayın ve gerekirse kaçış karakterlerini (\) kullanın.
5. sed‘in tüm özelliklerini öğrenmek için nereden başlayabilirim? man sed komutunu kullanarak sed komutunun tüm özelliklerini inceleyebilirsiniz.
Yazar: Fatih Soysal