head Komutu: Linux’ta Dosyanın İlk Satırlarını Görüntüleme

Terminal ekranına baktığınızda bazen tek ihtiyacınız olan şey bir dosyanın ilk birkaç satırını hızlıca görmektir. Log dosyaları, konfigürasyon dosyaları, büyük veri setleri… Bunları cat ile açmak bazen terminali mahvedebilir. İşte tam bu noktada head komutu devreye girer. Basit görünüşünün arkasında oldukça yetenekli bir araç olan head, her sysadmin’in günlük iş akışının vazgeçilmez bir parçası olmalıdır.

head Komutu Nedir?

head komutu, bir dosyanın ya da standart girdinin başından itibaren belirli sayıda satır veya byte görüntülemenizi sağlar. Varsayılan olarak ilk 10 satırı gösterir. GNU coreutils paketinin bir parçasıdır ve neredeyse tüm Linux dağıtımlarında hazır olarak gelir.

Kullanım mantığı son derece basittir: dosyanın tamamını okumak yerine sadece ihtiyacınız olan kısmı alırsınız. Bu özellikle büyük dosyalarla çalışırken hem zaman hem de sistem kaynakları açısından büyük avantaj sağlar.

Temel Kullanım

En basit kullanımıyla head komutuna bir dosya adı vermeniz yeterlidir:

head /var/log/syslog

Bu komut /var/log/syslog dosyasının ilk 10 satırını ekrana basar. Herhangi bir parametre vermediğinizde bu varsayılan davranıştır.

Birden fazla dosyayı aynı anda incelemek de mümkündür:

head /etc/passwd /etc/group /etc/hosts

Bu kullanımda her dosyanın başında ==> dosya_adı <== şeklinde bir başlık göreceksiniz. Bu sayede hangi çıktının hangi dosyaya ait olduğunu karıştırmazsınız.

Parametreler ve Seçenekler

head komutunun parametreleri oldukça sade tutulmuştur:

  • -n [sayı]: Görüntülenecek satır sayısını belirtir. Varsayılan 10’dur.
  • -c [sayı]: Satır yerine byte cinsinden belirtilen miktarı gösterir.
  • -q: Birden fazla dosyada başlık satırlarını gizler (quiet modu).
  • -v: Tek dosyada bile başlık satırını gösterir (verbose modu).
  • -n -[sayı]: Eksi işaretiyle kullanıldığında dosyanın son N satırı hariç geri kalanını gösterir.
  • -c -[sayı]: Eksi işaretiyle kullanıldığında son N byte hariç geri kalanını gösterir.

Satır Sayısını Belirleme

Belirli sayıda satır görüntülemek için -n parametresini kullanırsınız:

head -n 20 /var/log/nginx/error.log

Bu komut Nginx hata logununun ilk 20 satırını gösterir. -n parametresini daha kısa şekilde de yazabilirsiniz:

head -20 /var/log/nginx/error.log

Her iki kullanım da aynı sonucu verir. Eski sistemlerde ikinci form daha yaygındı ancak POSIX standardına göre -n formu tercih edilir.

Tek bir satır almak istediğinizde de aynı mantık geçerlidir:

head -n 1 /etc/os-release

Bu komut işletim sistemi bilgisinin ilk satırını getirir. Betiklerde sistem bilgisi çekerken sık kullanılan bir kalıptır.

Byte Bazlı Okuma

Bazen satır sayısı değil, byte miktarı önemli olabilir. -c parametresi bu iş için biçilmiş kaftandır:

head -c 100 /var/log/syslog

Bu komut log dosyasının ilk 100 byte’ını gösterir. Binary dosyalarda ya da belirli boyutlarda dosya parçaları oluştururken kullanışlıdır.

Kilobyte cinsinden de belirtebilirsiniz:

head -c 1K /path/to/largefile.bin
head -c 1M /path/to/verylargefile.bin

K için 1024 byte, M için 1048576 byte kullanılır.

Eksi Notasyonu ile Gelişmiş Kullanım

head komutunun az bilinen ama son derece güçlü bir özelliği var: eksi notasyonu. -n -[sayı] şeklinde kullanıldığında dosyanın son N satırı hariç tüm içeriği gösterilir.

head -n -5 access.log

Bu komut access.log dosyasının son 5 satırı hariç tüm satırları gösterir. Yani eğer dosyanızda 100 satır varsa ilk 95 satırı alırsınız.

Bu özellik pipeline işlemlerinde çok işe yarar. Örneğin bir CSV dosyasının başlık satırını atlamak için tail -n +2 kullanılır, ama tersini yapmak yani footer kısmını atmak için head -n -1 veya -n -[sayı] notasyonu kullanılabilir.

Pipe ile Kullanım: Gerçek Güç Burada

head komutunun gerçek gücü pipe işlemleriyle ortaya çıkar. Tek başına kullanıldığında oldukça masum görünse de diğer komutlarla birleştiğinde güçlü bir araç haline gelir.

En büyük dosyaları bulma:

du -sh /var/log/* | sort -rh | head -n 10

Bu komut /var/log/ altındaki dosyaları boyutlarına göre büyükten küçüğe sıralar ve en büyük 10 tanesini listeler. Disk dolduğunda ilk başvuracağınız komutlardan biri olacak bu.

En çok kaynak tüketen processleri görme:

ps aux --sort=-%mem | head -n 11

Başlık satırı dahil 11 satır aldığımız için aslında en fazla bellek kullanan 10 process görünür. --sort=-%cpu ile CPU kullanımına göre de sıralayabilirsiniz.

Hata loglarının ilk kayıtlarını inceleme:

grep "ERROR" /var/log/application.log | head -n 20

Uygulama logundaki ERROR içeren satırların ilk 20 tanesini getirir. Bir sistem ilk ayağa kalktığında hangi hatalarla başladığını anlamak için idealdir.

Gerçek Dünya Senaryoları

Senaryo 1: Sunucu Başlangıç Sorunlarını Giderme

Sabah 08:00’de telefon çalıyor, uygulama sunucusu geceleri yeniden başlamış ve şu an düzgün çalışmıyor. İlk yapacağınız şeylerden biri:

head -n 50 /var/log/syslog

Sistem başlangıcından itibaren ilk 50 satırı inceleyerek boot sürecinde ne gibi mesajlar üretildiğini görürsünüz. Çoğu zaman sorun bu satırlarda kendini ele verir.

Daha hedefli bir arama için:

journalctl -b | head -n 100

Son boot’tan itibaren sistem loglarının ilk 100 satırını çeker.

Senaryo 2: Konfigürasyon Dosyası Doğrulama

Birkaç yüz satırlık bir Nginx konfigürasyon dosyasına değişiklik yaptınız. Dosyanın başında tanımladığınız global ayarları kontrol etmek istiyorsunuz:

head -n 30 /etc/nginx/nginx.conf

Ya da birkaç farklı sunucu konfigürasyonunu karşılaştırmak için:

head -n 5 /etc/nginx/sites-available/*

Bu komut sites-available altındaki tüm dosyaların ilk 5 satırını başlıklarıyla birlikte listeler. Hangi konfigürasyonda ne tanımlı, hızlıca anlarsınız.

Senaryo 3: Büyük CSV veya Log Dosyası Yapısını Anlama

Veri transferleri sırasında karşınıza gelen onlarca megabyte’lık CSV dosyalarında sütun yapısını anlamak gerekir:

head -n 5 /data/imports/sales_report_2024.csv

İlk 5 satır genellikle başlık satırı ve birkaç örnek kayıt içerir. Bu sayede dosyanın yapısını cat ile tüm dosyayı açmadan anlarsınız. 500 MB’lık bir CSV’yi cat ile açmaya kalkışmak hem terminali hem de moralinizi mahvedebilir.

Senaryo 4: Betik Geliştirme ve Otomasyon

Bir betik yazarken dosyanın ilk satırını metadata olarak kullanabilirsiniz. Örneğin bir yedekleme betiğinde:

#!/bin/bash

BACKUP_DIR="/backup/mysql"
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/*.sql.gz 2>/dev/null | head -n 1)

if [ -z "$LATEST_BACKUP" ]; then
    echo "Yedek dosyası bulunamadı!"
    exit 1
fi

echo "Son yedek dosyası: $LATEST_BACKUP"

Burada ls -t ile dosyaları tarihe göre sıralayıp head -n 1 ile en yeni olanı alıyoruz. Bu kalıp shell betiklerinde son derece yaygındır.

Senaryo 5: Sistem Performans İzleme

Anlık sistem durumunu hızlıca anlamak için:

cat /proc/meminfo | head -n 5

/proc/meminfo dosyasının tüm içeriği yerine ilk 5 satırda zaten toplam bellek, kullanılabilir bellek ve buffer bilgileri bulunur.

Benzer şekilde CPU bilgisi için:

cat /proc/cpuinfo | grep "model name" | head -n 1

Çok çekirdekli sistemlerde her çekirdek için aynı bilgi tekrarlanır, sadece ilk satır yeterlidir.

head ve tail Karşılaştırması

head ve tail komutları genellikle birlikte anılır, ikisi de birbirini tamamlar. head baştan gösterirken tail sondan gösterir. Ama gerçek güç bu ikisini birleştirdiğinizde ortaya çıkar.

Örneğin bir dosyanın tam ortasındaki satırları almak için:

head -n 100 büyükdosya.txt | tail -n 10

Bu komut dosyanın 91 ile 100. satırları arasındaki kısmı gösterir. Önce ilk 100 satırı alıyoruz, sonra bunların son 10 tanesini çekiyoruz.

Ya da tam tersine belirli bir aralık:

sed -n '50,60p' dosya.txt

Ama head ve tail kombinasyonu daha okunabilir ve anlaşılması daha kolaydır.

watch ile Kombinasyon

watch komutuyla birlikte head kullanarak belirli aralıklarla dosyanın başını izleyebilirsiniz:

watch -n 5 'head -n 20 /var/log/nginx/access.log'

Her 5 saniyede bir Nginx access log’unun ilk 20 satırını yeniler. Bu kullanım özellikle dosyanın başında tutulan istatistikleri veya özet bilgileri izlemek için faydalıdır. Tabii ki log izleme için genellikle tail -f tercih edilir ama bazen dosyanın başındaki özet bilgileri düzenli olarak güncelleniyorsa watch head kombinasyonu işe yarar.

find ile Kombinasyon

Sistemdeki belirli dosyaların içeriklerine hızlıca bakmak için find ile kombinasyon kurabilirsiniz:

find /etc -name "*.conf" -exec head -n 3 {} ;

Bu komut /etc altındaki tüm .conf dosyalarının ilk 3 satırını gösterir. Hangi konfigürasyon dosyasının ne içerdiğini toplu olarak görmek istediğinizde kullanışlıdır.

Daha düzenli bir çıktı için:

find /etc -name "*.conf" | while read f; do
    echo "=== $f ==="
    head -n 3 "$f"
    echo ""
done

Performans Notu: Neden head Kullanmalıyız?

Büyük dosyalarda cat dosya | head -n 10 ile head -n 10 dosya arasında önemli bir fark vardır. cat tüm dosyayı okuyarak pipe’a aktarır, head ise sadece ihtiyaç duyduğu kadarını okuyup durur. Bu nedenle büyük dosyalarda doğrudan head dosya kullanmak her zaman daha verimlidir.

Bunu test edebilirsiniz:

# Büyük bir test dosyası oluşturalım
seq 1 10000000 > büyükdosya.txt

# Doğrudan head kullanımı
time head -n 10 büyükdosya.txt

# cat + head kullanımı (daha yavaş)
time cat büyükdosya.txt | head -n 10

Özellikle birkaç gigabyte’lık log dosyalarında bu fark ciddi boyutlara ulaşabilir. Useless Use of Cat (UUOC) olarak bilinen bu anti-pattern’den kaçınmak hem profesyonelliğin hem de verimli sistem yönetiminin bir göstergesidir.

Bazı Pratik İpuçları

Alias tanımlama: Sık kullandığınız kombinasyonları alias olarak kaydedebilirsiniz:

alias h10='head -n 10'
alias h20='head -n 20'
alias topfiles='du -sh * | sort -rh | head -n 10'

.bashrc veya .zshrc dosyanıza ekleyerek kalıcı hale getirebilirsiniz.

Çıktıyı dosyaya kaydetme: head çıktısını başka bir dosyaya yönlendirebilirsiniz:

head -n 1000 büyüklog.txt > küçüklog.txt

Bu şekilde büyük bir log dosyasının ilk 1000 satırını başkasıyla paylaşmak ya da daha sonra analiz etmek için ayrı bir dosyaya alabilirsiniz.

Dosya encoding kontrolü: Bir dosyanın encoding’ini anlamak için ilk birkaç byte’a bakmak yeterli olabilir:

head -c 4 dosya.txt | xxd

BOM (Byte Order Mark) içeren dosyalarda bu yaklaşım encoding türünü belirlemenize yardımcı olur.

Alternatif Araçlar

head komutu çoğu durumda yeterlidir ama bazı alternatiflerin de farkında olmak iyi olur:

  • sed: sed -n '1,10p' dosya şeklinde kullanılabilir, ama head daha okunabilirdir.
  • awk: awk 'NR<=10' dosya ile aynı sonucu verir, daha fazla esneklik sunar.
  • perl: Büyük dosyalarda çok satırlı regex işlemleriyle birlikte tercih edilebilir.

Ancak salt “ilk N satırı göster” işlemi için head komutu en temiz ve en performanslı çözümdür.

Sonuç

head komutu, sadeliği ve etkinliğiyle bir sysadmin’in araç kutusunda her zaman ön sıralarda yer alması gereken bir komuttur. Günlük işlerinizde dosya yapısını anlamak, logları incelemek, betikler geliştirmek ve sistem durumunu izlemek için sürekli başvuracaksınız.

Özellikle vurgulamak istediğim nokta şu: büyük dosyalarla çalışırken cat yerine head kullanma alışkanlığı edinmek, hem sistem kaynaklarınızı korumanızı hem de çok daha hızlı sonuç almanızı sağlar. Birkaç gigabyte’lık bir log dosyasını cat ile açmak yerine head ile ilk satırlara bakmak, özellikle disk I/O’nun yoğun olduğu production sistemlerinde kritik bir fark yaratır.

Pipe işlemleriyle birleştirdiğinizde head komutu gerçek gücünü gösterir. sort, grep, du, ps ve diğer komutlarla kurduğunuz kombinasyonlar, terminal üzerinde oldukça güçlü sistem yönetim araçları oluşturmanıza olanak tanır. Temel komutları derinden öğrenmek, karmaşık betikler yazmaktan çok daha değerli bir beceridir.

Yorum yapın