00 Ne için kullanılır?
GB'lık log dosyasını cat ile açmak terminali kilitler. head ve tail sadece ihtiyacın olan kısmı verir.
İkisinin de olmadığı durumlar nadirdir: büyük bir dosyanın biçimini anlamak için head, son hataları görmek için tail, canlı uygulama çıktısını izlemek için tail -f.
# Hızlı önizleme
head -5 /etc/passwd
tail -5 /var/log/syslog
# Canlı takip
tail -f /var/log/nginx/error.log
# Dosyanın ortasını kes: 51-60. satırlar
head -60 büyük.txt | tail -10
Hem head hem tail, bayrak verilmezse 10 satır gösterir. Bu tek akılda tutulması gereken kural.
01 head: ilk N satır ve byte
head en basit araçlardan biri — fakat byte modu ve çoklu dosya desteği sık unutulur.
# İlk 10 satır (varsayılan)
head dosya.txt
# İlk N satır
head -n 20 dosya.txt
head -20 dosya.txt # kısa form
# İlk N byte
head -c 512 binary.bin # 512 byte
head -c 1K dosya.txt # 1024 byte
head -c 1M buyuk.log # 1 MB
# Çoklu dosya: başlık ekler
head -5 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
...
==> /etc/group <==
root:x:0:
...
# Başlık olmadan çoklu dosya
head -q -5 *.log
# Hep başlık göster (tek dosyada da)
head -v -5 dosya.txt
-N02 head: negatif sayı — son N hariç hepsi
GNU head'in güçlü ama az bilinen özelliği: -n -N (negatif), son N satır hariç tüm dosyayı verir.
# Son 1 satır hariç hepsini göster (tail başlığını at)
head -n -1 dosya.txt
# Son 3 satır hariç hepsini göster
head -n -3 dosya.txt
# Kullanım: CSV'nin son (toplam) satırını hariç tut
head -n -1 rapor.csv | awk -F',' '{sum += $3} END {print sum}'
# Son N byte hariç hepsi
head -c -1024 dosya.bin # son 1024 byte hariç
# Satır sayısını önce öğren, sonra hesapla (alternatif)
wc -l dosya.txt
1500 dosya.txt
head -n 1497 dosya.txt # son 3 hariç (1500-3=1497)
Negatif -n GNU coreutils özelliğidir. macOS'taki BSD head desteklemez. macOS'ta brew install coreutils → ghead ile kullanılabilir.
03 tail: son N satır ve +N konumu
tail'in en önemli ama sık atlanan özelliği: +N ile N. satırdan başlayarak sonuna kadar okuyabilirsiniz.
# Son 10 satır (varsayılan)
tail dosya.txt
# Son N satır
tail -n 30 /var/log/syslog
tail -30 /var/log/syslog # kısa form
# Son N byte
tail -c 512 dosya.bin
# +N: N. satırdan itibaren sonuna kadar (CSV başlığını atla)
tail -n +2 veri.csv # 1. satırı (başlık) atla
tail -n +11 dosya.txt # 11. satırdan başla (ilk 10 atla)
# +N ile head birlikte: belirli satır aralığı
tail -n +51 dosya.txt | head -10 # 51-60. satırlar
# Çoklu dosya
tail -5 /var/log/*.log
# Quiet mod (başlık olmadan)
tail -q -5 *.log
+N ile N. satırdan itibaren sonuna kadar+N ile N. byte'tan itibarentail -n +2 dosya.csv CSV başlığını (1. satırı) atlayarak veri satırlarını verir. Pipe'la birleşince işleme scripti için hazır: tail -n +2 data.csv | awk -F, '{...}'
04 tail -f: canlı log takibi
tail -f dosyaya yazılan yeni satırları gerçek zamanlı gösterir. Uygulama geliştirme ve sistem izlemenin vazgeçilmezi.
# Canlı log takibi (Ctrl+C ile dur)
tail -f /var/log/nginx/access.log
# Son 50 satırı göster, sonra yeni gelenleri takip et
tail -n 50 -f /var/log/syslog
# grep ile filtrele: sadece ERROR satırları canlı izle
tail -f app.log | grep --line-buffered 'ERROR'
# Birden fazla dosyayı aynı anda takip et
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# Belirli PID çıkınca dur
tail -f --pid=$$ app.log # bu kabuk kapanınca dur
tail -f --pid=1234 app.log # PID 1234 ölünce dur
# -s: kontrol aralığı (saniye, varsayılan 1.0)
tail -f -s 0.1 app.log # 100ms aralık, daha duyarlı
-f'yi durdurtail -f app.log | grep 'ERROR' bazen satırları tamponlar — çıktı geç geliyorsa grep --line-buffered ekleyin. Benzer şekilde awk için awk 'BEGIN{OFMT="%s\n"} {fflush()}' kullanılabilir.
05 tail -F: log rotasyonunu takip et
-f inode'u takip eder; log rotate olduğunda eski dosyayı izlemeye devam eder. -F ise dosya adını takip eder ve yeniden açılan dosyayla devam eder.
# -F: adı takip et (logrotate/copytruncate güvenli)
tail -F /var/log/nginx/access.log
# -F = --follow=name --retry
tail --follow=name --retry /var/log/app.log
# -f ile -F farkı:
# -f → inode takip: logrotate sonrası eski dosyayı okur
# -F → ad takip: yeni access.log açılınca ona geçer
| Seçenek | Ne takip eder | Log rotate sonrası | Dosya silinirse |
|---|---|---|---|
-f | inode | Eski dosyayı okumaya devam | Hata vermeden bekler |
-F | Dosya adı | Yeni dosyayı açar | Dosya dönene kadar yeniden dener |
Sistemde logrotate varsa (çoğu Linux sunucusunda vardır) -F kullanın. Geliştirme ortamında sabit dosyaları izlerken -f yeterlidir.
06 Çoklu dosya ve kombinasyonlar
Birden fazla dosya takibi, head + tail ile dilim alma ve araçlarla birleştirme.
# Çoklu dosya canlı takip (başlık gösterir)
tail -F /var/log/nginx/*.log /var/log/app.log
# multitail varsa (renkli, bölünmüş ekran)
multitail /var/log/nginx/access.log /var/log/nginx/error.log
# journalctl ile (systemd logları)
journalctl -u nginx -f
journalctl -f # tüm sistem logları
# head + tail: dosyadan satır aralığı seç
sed -n '51,60p' dosya.txt # sed ile (daha temiz)
head -n 60 dosya.txt | tail -n 10 # 51-60. satırlar
tail -n +51 dosya.txt | head -n 10 # daha verimli (tüm dosya okunmaz)
# İlk satır (başlık), sonra 100 rastgele örnek
head -1 veri.csv
tail -n +2 veri.csv | shuf | head -100
# watch ile periyodik tail (grafik terminaller için)
watch -n 2 'tail -20 /var/log/syslog'
tail -n +51 | head -10, head -60 | tail -10'dan daha verimlidir: ikinci versiyon dosyanın ilk 60 satırını tampon belleğe alır; birinci ise 50. satıra kadar atlar ve 10 satır okur. Dosya büyüdükçe fark önemli olur.
07 Pratik vakalar
Günlük kullanımda sık karşılaşılan senaryolar.
# ERROR içeren satırları renklendirerek takip et
tail -F /var/log/app/error.log \
| grep --line-buffered --color=always -E 'ERROR|WARN|INFO'
# Başlığı al, veriyi filtrele, birleştir
head -1 kullanicilar.csv > sonuc.csv
tail -n +2 kullanicilar.csv | grep 'aktif' >> sonuc.csv
# Deploy tarihleri /var/log/deploy.log'da
grep 'DEPLOY' /var/log/deploy.log | tail -10
# Pod logunu ilk 100 satır (crash loop debug)
kubectl logs mypod | head -100
# Dosya boyutu değiştikçe son satırları tekrar göster
tail -f /var/log/syslog &
sleep 30
kill %1
# Üretilen satır hızını ölç (saniyede kaç satır?)
tail -f app.log | pv -l -r > /dev/null
Hatırlanacaklar
- Varsayılan 10 satır —
head dosyavetail dosyaeşdeğer head -n -3: son 3 satır hariç hepsi (GNU'ya özgü)tail -n +2: 2. satırdan sona — CSV başlığını atlamak için klasiktail -f: inode takip;-F: ad takip (logrotate için doğrusu)tail -n +51 | head -10dizin aralığı içinhead -60 | tail -10'dan hızlıgrep --line-buffered: pipe'ta gerçek zamanlı çıktı için gerekli
Devam: cat, less — dosya okuma ve sayfalama · sort, uniq — sıralama ve tekilleştirme