fold ve fmt Komutları ile Uzun Metin Satırlarını Biçimlendirme ve Sarmalama
Metin işleme söz konusu olduğunda aklımıza hemen grep, awk, sed üçlüsü geliyor. Haklı da, bu araçlar gerçekten güçlü. Ama bir de bu araçların gölgesinde kalan, çoğu sysadmin’in varlığından haberdar olduğu halde yeterince kullanmadığı iki küçük ama işlevsel komut var: fold ve fmt. Uzun metin satırlarını belirli bir genişlikte kırmak, e-posta içeriklerini formatlamak, log çıktılarını düzenlemek gibi durumlarda bu iki araç hayat kurtarıyor. Ben de yıllarca bunları görmezden geldim, ta ki bir otomasyonda 200 karakter uzunluğunda satırlar üretmeye başlayana kadar.
fold Komutuna Giriş
fold komutu, isminden de anlaşılacağı gibi metni “katlıyor”, yani belirttiğiniz sütun genişliğinde satırlara bölüyor. Kullanımı son derece basit ama ince ayar noktaları var.
Temel sözdizimi şu şekilde:
fold [SEÇENEKLER] [DOSYA]
En temel kullanımda sadece bir dosya adı ya da pipe ile gelen çıktıyı veriyorsunuz:
echo "Bu çok uzun bir metin satırıdır ve terminal ekranına sığmıyor olabilir, fold komutu bunu düzenleyecek." | fold
Varsayılan olarak fold, 80 karakter sınırında satırı böler. Ama bu değeri -w seçeneğiyle değiştirebilirsiniz.
Temel Seçenekler
-w N: Satır genişliğini N karakter olarak belirler. Varsayılan 80’dir.
-s: Sözcük sınırlarını dikkate alarak kırar. Bu seçenek olmadan fold, kelimenin ortasından bile kırabilir.
-b: Karakter sayımını byte cinsinden yapar. Çok baytlı karakterler (Türkçe karakterler dahil) içeren dosyalarda önemli.
Şimdi bu seçenekleri pratikte görelim:
# 40 karakterde sar
echo "Sistem yöneticisi olmak sabır, dikkat ve sürekli öğrenme gerektirir." | fold -w 40
# Kelime sınırlarını koru
echo "Sistem yöneticisi olmak sabır, dikkat ve sürekli öğrenme gerektirir." | fold -w 40 -s
İkinci komutun çıktısı çok daha okunaklı olacak çünkü kelimelerin ortasından kesmeyecek. Bunu bir kez görmeden anlamak zor oluyor, bu yüzden şu örneği çalıştırmanızı öneririm.
Gerçek Dünya Senaryosu: Log Dosyası Okuma
Bir gün bir uygulama geliştirici ekibi benden şikayet geldi: Ürettikleri JSON logları tek satırda yazıldığı için terminal’de okumak imkansız hale gelmişti. jq ile formatlamayı önerdim ama bazı durumlarda jq kurulu olmayan sistemlerde hızlıca bir şeyler yapmak gerekiyor. İşte burada fold devreye giriyor:
# Uzun log satırlarını 120 karakterde sar ve daha okunabilir hale getir
tail -f /var/log/uygulama/app.log | fold -w 120 -s
# Bir dosyadaki tüm uzun satırları bul ve sarılmış versiyonunu kaydet
cat uzun_log.txt | fold -w 80 -s > okunabilir_log.txt
Bu basit çözüm, geliştirici ekibine hızlıca yardımcı oldu. Tabii kalıcı çözüm için loglama kütüphanelerini güncelledik ama o an için fold tam da ihtiyacımız olan şeydi.
fmt Komutunun Gücü
fmt komutu fold‘dan çok daha akıllıca davranıyor. Sadece satırları kesmekle kalmıyor, metni gerçek anlamda yeniden biçimlendiriyor. Paragrafları tanıyor, girintileri koruyor ve mümkün olduğunca düzgün bir çıktı üretiyor.
fmt [SEÇENEKLER] [DOSYA]
Temel seçenekler şunlar:
-w N: Hedef satır genişliği. Varsayılan 75 karakterdir.
-s: Sadece uzun satırları böler, kısa satırları birleştirmez.
-u: Tek tip boşluk kullanımı sağlar. Cümle sonu çift boşlukları, kelime arası fazla boşlukları düzeltir.
-p ÖNEK: Yalnızca belirtilen önek ile başlayan satırları formatlar. Bu özellikle kod yorumları için müthiş.
-t: Etiket modunda çalışır, ilk satırdaki girintiyi korur.
-c: Taç modu, ilk iki satırın girintisini korur.
Şimdi fmt‘nin gerçek gücünü görelim:
# Temel kullanım
cat dagınik_metin.txt | fmt -w 72
# Çift boşlukları ve fazla boşlukları düzelt
cat metin.txt | fmt -u -w 72
# Sadece uzun satırları böl, kısaları dokunma
cat metin.txt | fmt -s -w 80
fmt ile Kod Yorumlarını Formatlamak
fmt‘nin -p seçeneği benim en sevdiğim özellik. Bir bash scripti ya da Python kodu içindeki yorum satırlarını düzenlemek istediğinizde bu seçenek inanılmaz işe yarıyor:
# Python dosyasındaki # ile başlayan yorum satırlarını formatla
fmt -p '#' -w 72 script.py
# Shell scriptlerindeki yorum bloklarını düzenle
fmt -p '# ' -w 80 deploy.sh
Mesela şöyle bir durumla karşılaştım: Ekip arkadaşım bir bash scripti yazmış, ama yorum satırları tam bir karmaşa içindeydi. Kimi 150 karakter, kimi 20 karakter. Şu tek satırla düzelttim:
fmt -p '# ' -w 80 eski_script.sh > temiz_script.sh
Tabii bu otomatik bir süreç, gözden geçirmek her zaman şart. Ama büyük dosyalarda başlangıç noktası olarak mükemmel.
fold ve fmt Karşılaştırması: Hangisi Ne Zaman?
Bu iki komut birbirine benzese de kullanım alanları farklı. Bunu yıllarca kafama yatıramadım açıkçası, ama şu şekilde düşününce netleşiyor:
fold kullanın eğer:
- Ham veri işliyorsanız ve format önemli değilse
- Kesinlikle belirtilen karakter genişliğinde kesmek istiyorsanız
- Base64 çıktısı gibi boşluk içermeyen verileri bölmeniz gerekiyorsa
- Hız önemliyse ve büyük dosyalar işliyorsanız
fmt kullanın eğer:
- İnsan tarafından okunacak metin üzerinde çalışıyorsanız
- Paragraf yapısını korumak istiyorsanız
- Kod yorumlarını düzenliyorsanız
- Mevcut girintilerin korunması gerekiyorsa
Pratik Senaryo: E-posta ve Bildirim Şablonları
Otomasyon geliştirirken sık karşılaştığım bir durum: Bash scriptlerinden e-posta göndermek. Sendmail ya da mail komutuyla gönderilen e-postalar genellikle çok uzun satırlar içeriyor ve bazı e-posta istemcileri bunu düzgün gösteremiyor. RFC 2822 standardı bir satırın 998 karakterden uzun olmamasını öneriyor, ideal olarak 72-78 karakter öneriliyor.
#!/bin/bash
# Sistem durum raporu gönder
HOSTNAME=$(hostname)
TARIH=$(date '+%Y-%m-%d %H:%M:%S')
DISK_KULLANIM=$(df -h / | awk 'NR==2{print $5}')
BELLEK=$(free -h | awk 'NR==2{print $3"/"$2}')
MESAJ="Sistem Adı: $HOSTNAME
Tarih: $TARIH
Disk Kullanımı: $DISK_KULLANIM
Bellek Kullanımı: $BELLEK
Bu otomatik sistem raporu her saat başı gönderilmektedir. Eğer disk kullanımı yüzde seksenin üzerine çıkarsa lütfen gerekli temizlik işlemlerini gerçekleştiriniz."
echo "$MESAJ" | fmt -w 72 | mail -s "Sistem Raporu: $HOSTNAME" [email protected]
Bu şekilde e-posta içeriği temiz ve standart bir formatta gidiyor.
fold ile Base64 ve Sertifika İşlemleri
fold komutunun özellikle parladığı alan base64 ve sertifika işlemleri. Örneğin bir PEM sertifikasını programatik olarak oluşturuyorsanız ya da base64 ile encode edilmiş veriyi belirli bir formata sokmanız gerekiyorsa:
# Base64 çıktısını 64 karakterde sar (MIME standardı)
openssl rand -base64 100 | fold -w 64
# Bir dosyanın base64 versiyonunu PEM formatında sarmala
base64 gizli_dosya.bin | fold -w 64
# Sertifika içeriğini standart formata getir
cat sertifika.crt | base64 | fold -w 64
MIME e-postalarında base64 bloklarının 76 karakterde sarılması standart. Bu tür işlemlerde fold vazgeçilmez oluyor.
Çoklu Dosya İşleme ve Otomasyon
Gerçek sysadmin işleri genellikle tek dosyayla sınırlı kalmıyor. Yüzlerce konfigürasyon dosyasını, log dosyasını ya da raporu işlemek gerekebiliyor:
# Bir dizindeki tüm .txt dosyalarını formatla
for dosya in /var/raporlar/*.txt; do
fmt -w 80 "$dosya" > "/var/raporlar/formatli/$(basename "$dosya")"
echo "$dosya işlendi"
done
# find ile belirli boyutun üzerindeki satır içeren dosyaları bul ve formatla
find /etc -name "*.conf" -type f | while read dosya; do
if grep -q '.{100}' "$dosya"; then
echo "Uzun satır bulundu: $dosya"
fmt -w 79 "$dosya" > "${dosya}.formatli"
fi
done
sed ile Birlikte Kullanım
fold ve fmt tek başlarına güçlü, ama diğer araçlarla birleşince daha da işlevsel hale geliyor. Özellikle sed ile kombinasyon çok işime yarıyor:
# Belirli bir pattern sonrasındaki satırları formatla
grep -A 5 "ERROR" /var/log/app.log | fmt -w 100 -s
# sed ile satırları düzenleyip fmt ile formatla
sed 's/t/ /g' kaynak.txt | fmt -w 80
# Birden fazla araçla pipeline
cat /var/log/syslog | grep "$(date '+%b %d')" |
awk '{print $1,$2,$3,$5,$NF}' |
fmt -w 100 -s |
tail -50
Türkçe Karakter Sorunu ve Çözümü
Türkçe karakterler (ğ, ü, ş, ı, ö, ç, Ğ, Ü, Ş, İ, Ö, Ç) UTF-8 kodlamasında birden fazla byte yer kaplıyor. Bu durum fold komutunda karakter sayımını karıştırabilir.
# Sorunlu kullanım: byte sayısı karakter sayısıyla uyuşmuyor
echo "Türkçe karakterler: ğüşıöç" | fold -w 20
# Doğru kullanım: locale ayarını kontrol et
locale
export LANG=tr_TR.UTF-8
echo "Türkçe karakterler: ğüşıöç" | fold -w 20
# Byte bazlı kırmak istiyorsanız -b kullanın
echo "Türkçe karakterler: ğüşıöç" | fold -b -w 40
Özellikle cron job içinde ya da farklı locale ayarlarında çalışan scriptlerde bu sorunu yaşayabilirsiniz. Script başına şu satırı eklemek güvenli bir alışkanlık:
#!/bin/bash
export LANG=tr_TR.UTF-8
export LC_ALL=tr_TR.UTF-8
İnteraktif Kullanım Örnekleri
Terminal oturumlarında anlık metin düzenleme ihtiyaçları için de kullanışlı:
# Panodaki metni formatla (xclip veya xsel gerekli)
xclip -o | fmt -w 72 | xclip -i
# Heredoc ile uzun metin formatla
fmt -w 60 << 'EOF'
Bu çok uzun bir metin parçasıdır. Birden fazla cümle içeriyor ve her cümle bir paragrafın parçası. fmt komutu bu metni otomatik olarak yeniden düzenleyecek ve belirttiğimiz genişliğe göre satırlara bölecek.
EOF
# Bir komutun çıktısını insan okunabilir formata dönüştür
man ls | col -b | fmt -w 80 | head -50
Servis Dokümantasyonu Hazırlamak
Bir başka pratik kullanım alanı: Runbook ve dokümantasyon hazırlarken. Markdown dosyaları yazarken satır uzunluklarını belirli bir sınırda tutmak, hem git diff’leri daha okunabilir yapıyor hem de bazı eski editörlerde düzgün görünüm sağlıyor.
# Markdown dosyasındaki uzun satırları bul
awk 'length > 100 {print NR": "length" karakter: "$0}' README.md
# Normal paragraf metinlerini formatla ama kod bloklarına dokunma
# Bu biraz daha sofistike bir yaklaşım gerektirir
awk '/^```/{inside=!inside} !inside{print | "fmt -w 80"} inside{print}'
README.md > README_formatli.md
Bu son örnek biraz karmaşık görünüyor, biliyorum. Ama kısaca şunu yapıyor: Kod blokları (“ ile çevrili kısımlar) arasındaki satırlara dokunmuyor, dışarıdaki metinleri fmt` ile formatlıyor.
Sonuç
fold ve fmt komutları belki de Linux araç kutusunun en az görünür ama bir o kadar pratik parçaları. Bu iki araçla ne zaman karşılaşırsanız karşılaşın, temel farkı aklınızda tutun: fold mekanik olarak keser, fmt anlayarak düzenler.
Günlük sysadmin işlerinde en çok şu senaryolarda işe yarıyorlar: e-posta otomasyonlarında satır uzunluklarını standartlaştırmak, log çıktılarını okunabilir hale getirmek, bash scriptlerindeki yorum bloklarını temizlemek ve base64 çıktılarını belirli bir formata sokmak. Bunların dışında da kullanım alanları mevcut, ama en sık bu dört senaryo karşıma çıkıyor.
Son bir tavsiye: Bu komutları şimdi açık bir terminalde deneyin. Man sayfalarını okumak bir şey, elleri kirletmek başka bir şey. man fold ve man fmt komutlarını çalıştırın, üzerinde biraz oynayın. Bir dahaki sefere 200 karakterlik log satırlarıyla boğuştuğunuzda aklınıza gelecekler.
