Sistem yöneticiliğinde en sık ihtiyaç duyduğun şeylerden biri, büyük bir log dosyasına bakıp “en son ne oldu?” ya da “bu dosya nasıl başlıyor?” sorusuna hızlıca cevap bulmaktır. İşte tam bu noktada head ve tail komutları devreye girer. Basit görünen ama doğru kullanıldığında inanılmaz güçlü olan bu iki komut, terminalde geçirdiğin zamanı ciddi ölçüde azaltır. Bu yazıda her iki komutu da derinlemesine ele alacağız, gerçek hayattan senaryolarla pekiştireceğiz.
head Komutu: Dosyanın Başını Okumak
head komutu, adından da anlaşılacağı gibi bir dosyanın başından itibaren belirli sayıda satır ya da byte okur. Herhangi bir parametre vermezsen varsayılan olarak ilk 10 satırı getirir.
Temel Kullanım
head /var/log/syslog
Bu kadar. Hiçbir ek parametre gerekmez. Çıktı olarak /var/log/syslog dosyasının ilk 10 satırını görürsün. Peki ya daha fazlasına ihtiyaç duyarsan?
head Parametreleri
- -n [sayı]: Belirtilen satır sayısı kadar baştan okur
- -c [byte]: Satır yerine byte cinsinden okur
- -q: Birden fazla dosya işlenirken dosya adı başlığını bastırmaz
- -v: Her zaman dosya adı başlığını gösterir
# İlk 20 satırı getir
head -n 20 /etc/nginx/nginx.conf
# İlk 500 byte'ı getir
head -c 500 /var/log/auth.log
# Birden fazla dosyanın ilk 5 satırını getir
head -n 5 /etc/hosts /etc/hostname /etc/resolv.conf
Eksi (-) ile Kullanım: Az Bilinen Ama Güçlü Özellik
head -n parametresine negatif bir değer verirsen, dosyanın son N satırı hariç tamamını getirir. Bu özelliği pek çok sysadmin bilmez.
# Son 3 satır hariç tüm dosyayı getir
head -n -3 /var/log/syslog
Bu, özellikle log dosyalarının sonundaki eksik ya da yarım kalmış kayıtları işlem dışında bırakmak istediğinde işe yarar. Örneğin bir script yazıyorsun ve log dosyasının en son satırı henüz tamamlanmış bir işlemi göstermiyorsa, bu yöntemi kullanarak o satırı atlayabilirsin.
tail Komutu: Dosyanın Sonunu Okumak
tail komutu, head‘in tam tersi yönde çalışır ve bir dosyanın sonundan itibaren okur. Yine varsayılan olarak son 10 satırı getirir. Ama tail‘i gerçekten güçlü kılan şey, -f parametresidir. Bununla dosyayı canlı takip edebilirsin.
Temel Kullanım
tail /var/log/nginx/error.log
tail Parametreleri
- -n [sayı]: Belirtilen satır sayısı kadar sondan okur
- -c [byte]: Byte cinsinden sondan okur
- -f: Dosyayı canlı izler, yeni satırlar eklenince ekrana basar
- -F:
-fgibi çalışır ama dosya silinip yeniden oluşturulsa bile takibi sürdürür - +[sayı]: Belirtilen satır numarasından itibaren dosyanın sonuna kadar okur
- -q: Çoklu dosya işleminde başlıkları bastırır
- –pid=[PID]: Belirtilen process öldüğünde otomatik çıkar
# Son 50 satırı getir
tail -n 50 /var/log/apache2/access.log
# 100. satırdan itibaren oku
tail -n +100 /var/log/syslog
# Canlı log takibi
tail -f /var/log/nginx/access.log
tail -f ile Gerçek Zamanlı Log Takibi
Sysadmin olarak en çok kullanacağın parametre kesinlikle -f‘dir. Bir servis yeniden başlatıyorsun, bir deployment yapıyorsun ya da bir kullanıcı “şu an hata alıyorum” diye seni arıyor. Hepsinde tail -f seni kurtarır.
# Nginx access log'unu canlı izle
tail -f /var/log/nginx/access.log
# Birden fazla log dosyasını aynı anda izle
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# systemd servis loglarını canlı izle (journalctl ile birlikte)
journalctl -u nginx -f
-f ile -F arasındaki farka dikkat etmek gerekir. Logrotate gibi araçlar log dosyasını döndürdüğünde (rotate), eski dosyayı siler ve yenisini oluşturur. Bu durumda -f eski dosyayı izlemeye devam eder ve yeni log’ları göremezsin. -F ise dosya ismi değişse ya da dosya silinip yeniden oluşturulsa bile takibi bırakmaz.
# Logrotate sonrası bile çalışmaya devam eder
tail -F /var/log/syslog
Gerçek Dünya Senaryoları
Senaryo 1: Production Sunucusunda Hata Ayıklama
Gece 2’de telefon çalıyor. “Site çöktü” diyor karşıdaki ses. SSH ile bağlanıyorsun ve ilk yapman gereken şey log dosyalarına bakmak.
# Son 100 satırı getir, hata var mı bak
tail -n 100 /var/log/nginx/error.log
# Hata varsa grep ile filtrele
tail -n 500 /var/log/nginx/error.log | grep -i "error|crit|emerg"
# Canlı izlemeye geç
tail -F /var/log/nginx/error.log
Bu üç komut seni çoğu gece vakası krizinden kurtarır.
Senaryo 2: CSV veya Büyük Veri Dosyalarını Kontrol Etmek
Veritabanı ekibi sana 2 GB’lık bir CSV dosyası attı. “Bunu import edeceksin” dedi. Dosyayı açmaya çalışmak mantıksız. Önce başlığını ve birkaç satırını görmek istiyorsun.
# Dosyanın yapısını anlamak için başlık satırını gör
head -n 1 musteri_verileri.csv
# İlk 5 veri satırını incele
head -n 6 musteri_verileri.csv
# Son birkaç satırın düzgün bitip bitmediğini kontrol et
tail -n 5 musteri_verileri.csv
Bu yaklaşım özellikle veri import işlemlerinden önce dosyanın formatını doğrulamak için çok değerlidir. Başlık satırı beklenenden farklıysa ya da son satırlarda eksik veri varsa, import öncesinde tespit edersin.
Senaryo 3: Log Dosyasından Belirli Zaman Aralığını Çekmek
Diyelim ki bir sorunun sabah 09:00 ile 10:00 arasında yaşandığını biliyorsun. Access log’dan o saatleri çekmek istiyorsun.
# Önce dosyanın başını ve yapısını anla
head -n 3 /var/log/apache2/access.log
# grep ile zaman filtresi uygula, sonucu tail ile kontrol et
grep "14/Jan/2025:09" /var/log/apache2/access.log | head -n 20
# Kaç satır bulundu?
grep "14/Jan/2025:09" /var/log/apache2/access.log | wc -l
Senaryo 4: Script İçinde head ve tail Kullanımı
Otomatik raporlama scriptleri yazarken head ve tail sıkça devreye girer.
#!/bin/bash
LOG_FILE="/var/log/uygulama/app.log"
RAPOR_FILE="/tmp/gunluk_rapor.txt"
echo "=== Günlük Log Raporu ===" > $RAPOR_FILE
echo "Tarih: $(date)" >> $RAPOR_FILE
echo "" >> $RAPOR_FILE
echo "--- Son 20 Hata ---" >> $RAPOR_FILE
grep "ERROR" $LOG_FILE | tail -n 20 >> $RAPOR_FILE
echo "" >> $RAPOR_FILE
echo "--- Log Dosyasının Son 5 Satırı ---" >> $RAPOR_FILE
tail -n 5 $LOG_FILE >> $RAPOR_FILE
# Raporu mail ile gönder
mail -s "Günlük Log Raporu" [email protected] < $RAPOR_FILE
Senaryo 5: Büyük Log Dosyasında Satır Aralığı Okumak
Bir log dosyasının 1000. ile 1050. satırları arasını okumak istiyorsun. head ve tail‘i birlikte kullanarak bunu yapabilirsin.
# 1000. ile 1050. satırlar arasını oku
# Önce head ile ilk 1050 satırı al, sonra tail ile son 50'yi al
head -n 1050 /var/log/syslog | tail -n 50
# Alternatif olarak sed de kullanılabilir ama bu yöntem daha sezgisel
sed -n '1000,1050p' /var/log/syslog
Bu teknik özellikle hata ayıklama sırasında “şu satır numarasının etrafında ne var?” sorusunu cevaplamak için kullanışlıdır.
grep, awk ve sed ile Birlikte Kullanım
head ve tail tek başlarına güçlüdür ama metin işleme araçlarıyla birleşince gerçek potansiyellerini ortaya çıkarırlar.
grep ile Kombinasyon
# Son 1000 satırda "timeout" kelimesini ara
tail -n 1000 /var/log/app.log | grep -i "timeout"
# İlk 500 satırda belirli bir IP adresini bul
head -n 500 /var/log/nginx/access.log | grep "192.168.1.100"
# Hata satırlarını bul ve son 20 tanesini göster
grep "CRITICAL" /var/log/app.log | tail -n 20
awk ile Kombinasyon
# Access log'un son 200 satırında HTTP 500 hatalarını say
tail -n 200 /var/log/nginx/access.log | awk '$9 == "500" {count++} END {print "500 hata sayisi:", count}'
# İlk 100 satırdan sadece IP adresi ve istek yolunu al
head -n 100 /var/log/nginx/access.log | awk '{print $1, $7}'
Zincirleme Pipeline Örnekleri
Gerçek sistemlerde tek bir komut nadiren yeterlidir. Pipelining’in gücünü kullanarak karmaşık sorguları tek satırda çözebilirsin.
# Son 1 saatin loglarında en çok hata üreten 5 IP'yi bul
tail -n 10000 /var/log/nginx/access.log |
grep " 5[0-9][0-9] " |
awk '{print $1}' |
sort | uniq -c |
sort -rn |
head -n 5
Bu komut zinciri şunları yapar: Son 10.000 satırı alır, 5xx hata kodlarını filtreler, IP adreslerini çıkarır, sayar, sıralar ve en kötü 5 IP’yi gösterir. Production’da DDoS veya brute force tespiti için birebir.
watch ile Periyodik İzleme
tail -f canlı izleme için harika ama bazen periyodik anlık görüntü almak daha mantıklı olabilir.
# Her 2 saniyede bir son 10 satırı göster
watch -n 2 'tail -n 10 /var/log/nginx/access.log'
# Her 5 saniyede bir hata sayısını göster
watch -n 5 'tail -n 1000 /var/log/app.log | grep -c "ERROR"'
Byte Cinsinden Okuma: -c Parametresi
Metin dosyalarıyla çalışırken genellikle satır sayısı daha anlamlıdır. Ama binary dosyalar veya çok uzun satırlı dosyalarda -c parametresi işe yarar.
# Dosyanın ilk 1KB'ını oku
head -c 1024 /var/log/syslog
# Dosyanın son 512 byte'ını oku
tail -c 512 binary_dosya.bin
# Dosyanın boyutuna göre son %10'unu oku (yaklaşık)
BOYUT=$(stat -c%s dosya.log)
tail -c $((BOYUT / 10)) dosya.log
Performans Notu: Büyük Dosyalarda head vs tail
Burada dikkat etmen gereken önemli bir nokta var. head her zaman hızlıdır çünkü dosyanın başından okur ve hemen durur. Ama tail büyük dosyalarda daha fazla iş yapmak zorundadır; dosyanın sonuna gitmek için önce dosya boyutunu bilmesi gerekir.
Modern sistemlerde tail bunu akıllıca yapar. Önce dosya boyutunu öğrenir, sonra sona yakın konuma atlar. Bu sayede 10 GB’lık bir log dosyasında bile tail -n 10 anlık sonuç verir.
Ancak tail -f durumu biraz farklıdır. Aktif olarak yazılan büyük bir dosyada, -f seçeneği poll/inotify mekanizmasını kullanır ve oldukça verimlidir. Yine de çok sayıda tail -f process’i aynı anda çalıştırmak sistem üzerinde gereksiz yük oluşturabilir.
# Kaç tane tail -f çalışıyor?
ps aux | grep "tail -f" | grep -v grep
# Gereksiz tail processleri var mı?
lsof | grep tail | wc -l
Pratik İpuçları ve Kısayollar
Günlük iş akışını hızlandırmak için birkaç alias tanımlayabilirsin.
# ~/.bashrc veya ~/.bash_aliases dosyasına ekle
# Nginx loglarını hızlı izle
alias nginxlog='tail -F /var/log/nginx/access.log'
alias nginxerr='tail -F /var/log/nginx/error.log'
# Sistem logunu izle
alias syslog='tail -F /var/log/syslog'
# Son 50 satırı renkli göster (multitail gerektirir)
alias tlog='tail -n 50 -F'
Bu alias’ları tanımladıktan sonra nginxlog yazman yeterli olur.
multitail ile Çoklu Dosya İzleme
Standart tail -f birden fazla dosyayı art arda gösterir. multitail aracı ise bunları yan yana bölmeler halinde sunar.
# multitail kurulumu
apt install multitail # Debian/Ubuntu
yum install multitail # CentOS/RHEL
# İki log dosyasını yan yana izle
multitail /var/log/nginx/access.log /var/log/nginx/error.log
# Renk şeması ile
multitail -cS nginx /var/log/nginx/access.log
Yaygın Hatalar ve Çözümleri
Hata 1: “tail: cannot open ‘/var/log/auth.log’ for reading: Permission denied”
Bu hata yetki sorununu gösterir. sudo kullanman ya da ilgili log grubuna eklenmem gerekir.
sudo tail -n 50 /var/log/auth.log
# veya
sudo usermod -aG adm kullanici_adi
Hata 2: tail -f çalışıyor ama yeni satırlar gelmiyor
Logrotate dosyayı döndürmüş olabilir. -F kullan.
# -f yerine -F kullan
tail -F /var/log/uygulama.log
Hata 3: Büyük head -n değeri ile dosya sonuna ulaşıldı
head -n 99999 dosya.txt komutunda dosyada 99999 satırdan az varsa, sadece var olan satırları döndürür. Hata vermez, bu normal bir davranıştır.
Sonuç
head ve tail, Linux terminal araç kutusunun belki de en çok kullanılan ama en az belgelenmiş komutlarından ikisidir. Günde onlarca kez kullandığın halde tüm parametrelerini bilmiyor olabilirsin. Bu yazıda gördüğün gibi, -n, -f, -F, -c ve +n gibi parametrelerle bu iki komut son derece esnek hale geliyor.
Özellikle tail -F‘yi bir kez alışkanlık haline getirirsen, log analizi için başka araçlara olan bağımlılığın belirgin şekilde azalır. head -n -N ile “son N satır hariç tümünü al” özelliği de az bilinen ama pratikte çok işe yarayan bir detay.
Bu komutları grep, awk ve sed ile birleştirdiğinde elimde gerçek bir komut satırı süper gücü elde edersin. Bir sonraki gece krizinde, büyük CSV import’u öncesinde ya da production log analizinde bu araçlara güvenebilirsin. Terminal seni hiç yalnız bırakmaz, yeter ki doğru komutları biliyor olasın.