0Pricing
Linux Command Line & Bash Scripting Mastery · Ders

Desenler, Aralıklar ve BEGIN/END Blokları

Koşullu desenlerle kayıtları filtreleyin; BEGIN ve END bloklarını kullanarak başlıklar ve toplamlar oluşturun.

Desenler, Aralıklar ve BEGIN/END Blokları, CoddyKit'te ücretsiz bir Linux Command Line & Bash Scripting Mastery dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Linux Command Line & Bash Scripting Mastery öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.

awk Kalıpları Nedir?

awk içinde kalıp, belirli bir girdi satırı için bir eylem bloğunun çalıştırılıp çalıştırılmayacağını denetleyen koşuldur. Genel biçim şöyledir:

awk 'pattern { action }' file

Kalıp geçerli kayıtla eşleşirse eylem çalışır. Eylem belirtilmezse awk varsayılan olarak satırın tamamını yazdırır. Kalıplar şunlar olabilir:

  • Düzenli ifadeler — /regex/
  • İlişkisel ifadeler — $3 > 100
  • Bileşik ifadeler — $1 == "ERROR" && $4 > 500
  • Aralık kalıpları — /start/,/end/
  • Özel kalıplar — BEGIN ve END

Kalıpları anlamak, awk'ı yalnızca sütun yazdıran bir araç olmaktan çıkarıp güçlü bir veri süzgeci olarak kullanmanın kapısını açar.

Satırları Süzmek için Düzenli İfade Kalıpları

En yaygın kalıp türü, eğik çizgiler arasına alınan bir düzenli ifadedir. awk her satırı düzenli ifadeye göre sınar ve eylemi yalnızca eşleşen satırlarda çalıştırır.

Aşağıda, yalnızca ERROR sözcüğünü içeren satırları göstermek için /var/log/syslog biçimindeki bir dosyayı süzüyoruz:

#!/usr/bin/env bash
# Simulate a log file and filter ERROR lines
log=$(cat <<'EOF'
2026-06-11 08:01:22 INFO  service started
2026-06-11 08:02:05 ERROR disk quota exceeded on /dev/sda1
2026-06-11 08:02:44 WARN  memory usage at 80%
2026-06-11 08:03:10 ERROR connection timeout to 10.0.0.5
2026-06-11 08:03:55 INFO  backup completed
EOF
)

echo "=== ERROR lines only ==="
echo "$log" | awk '/ERROR/ { print NR": "$0 }'

Olumsuzlanmış ve Bileşik Kalıplar

Bir düzenli ifade kalıbının başına ! ekleyerek kalıbı tersine çevirin; böylece kalıbı içermeyen satırlarla eşleşir. Ayrıntılı denetim için birden çok koşulu && (AND) veya || (OR) ile birleştirin.

  • !/DEBUG/ — DEBUG satırlarını atlar
  • $3 > 500 && $5 == "POST" — büyük POST istekleri
  • /WARN/ || /ERROR/ — iki önem derecesinden biri

Aşağıdaki örnek basitleştirilmiş bir erişim günlüğünü ayrıştırır ve yalnızca yanıt boyutu 1000 baytın üzerinde olan POST isteklerini yazdırır:

#!/usr/bin/env bash
access=$(cat <<'EOF'
10.0.0.1 GET  /api/ping     200  48
10.0.0.2 POST /api/upload   201  2048
10.0.0.3 GET  /api/users    200  512
10.0.0.4 POST /api/data     200  3500
10.0.0.5 POST /api/health   200  60
EOF
)

echo "Large POST requests (>1000 bytes):"
echo "$access" | awk '$2 == "POST" && $5 > 1000 { print $1, $3, "size="$5 }'

Aralık Kalıpları: /start/,/end/

Bir aralık kalıbı, /start/ ile eşleşen satırdan /end/ ile eşleşen satıra kadar (bu satırlar dâhil) bitişik bir kayıt bloğu seçer. Sözdizimi şöyledir:

awk '/start/,/end/ { action }' file

Bilmeniz gereken temel davranışlar:

  • Aralık, /start/ ile eşleşen ilk satırda etkinleşir ve ardından gelen /end/ ile eşleşen ilk satırdan sonra devre dışı kalır.
  • /end/ hiçbir zaman eşleşmezse aralık EOF'ye kadar etkin kalır.
  • Aynı dosyadaki birbiriyle örtüşmeyen birden çok aralık birbirinden bağımsız olarak işlenir.

Bu nedenle aralık kalıpları, yapılandırma dosyalarından işaretlenmiş bölümleri, ayraç başlıkları içeren günlüklerden kısımları veya çok bloklu raporları çıkarmak için idealdir.

Aralık Kalıplarıyla Bölümleri Çıkarma

Bir sunucu yapılandırmasında [section] başlıklarıyla sınırlandırılmış, adlandırılmış birden çok bölüm bulunduğunu düşünün. Yalnızca [database] içindeki satırları istiyoruz:

#!/usr/bin/env bash
config=$(cat <<'EOF'
[server]
host = 0.0.0.0
port = 8080

[database]
host = 127.0.0.1
port = 5432
name = appdb
user = admin

[cache]
host = 127.0.0.1
port = 6379
EOF
)

echo "=== [database] section ==="
echo "$config" | awk '/\[database\]/,/^\[/' \
  | awk 'NR > 1 && !/^\[/ && NF'

BEGIN Bloğu

BEGIN bloğu herhangi bir girdi okunmadan önce bir kez çalışır. Şunlar için idealdir:

  • Rapor başlığı yazdırmak
  • Değişkenleri ve sayaçları başlangıç değerlerine ayarlamak
  • Alan ayırıcısını (FS) veya diğer yerleşik değişkenleri ayarlamak
  • Girdi gerektirmeyen bağımsız awk programlarını çalıştırmak

Sözdizimi:

awk 'BEGIN { setup } pattern { action }' file

FS değerini BEGIN içinde ayarlamak, -F seçeneğine temiz bir alternatiftir; özellikle ayırıcı mantığının betiğin içinde bulunduğu çok kurallı programlar yazarken kullanışlıdır.

#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)

echo "$csv" | awk 'BEGIN {
  FS = ","
  printf "%-10s %-15s %10s\n", "Name", "Department", "Salary"
  print "--------------------------------------------"
}'

END Bloğu

END bloğu son kayıt işlendikten sonra bir kez çalışır. Şunlar için doğal yerdir:

  • İşleme sırasında biriktirilen toplamları, ortalamaları ve özetleri yazdırmak
  • Çıktı dosyalarını tamponlamak veya kapatmak
  • Biçimlendirilmiş raporlar için alt bilgi satırları yazdırmak

Ana kurallar sırasında ayarlanan değişkenler END içinde hâlâ kapsam dâhilindedir; çalışan toplamlar bu şekilde hesaplanır. Aşağıdaki örnek bir CSV'den maaş değerlerini toplar ve toplamı alt bilgi bölümünde yazdırır:

#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)

echo "$csv" | awk -F',' '
  { total += $3; count++ }
  END { printf "Employees: %d  Total payroll: $%d\n", count, total }
'

BEGIN, Kurallar ve END'yi Birleştirme

Asıl güç, üç bloğu da tek bir bağımsız awk programında birleştirdiğinizde ortaya çıkar: program bir başlık yazdırır, her kaydı işler ve bir özet yazdırır. Bu kalıp, kabuk tabanlı raporlama işlem hatlarının temelidir.

Aşağıda web isteklerini içeren bir CSV'yi okuyan, satır başına ayrıntıları ve son olarak 1 saniyeyi aşan isteklerin sayısını yazdıran eksiksiz bir rapor oluşturucu bulunmaktadır:

#!/usr/bin/env bash
data=$(cat <<'EOF'
/api/ping,0.03
/api/users,1.45
/api/login,0.88
/api/upload,2.10
/api/health,0.02
/api/report,1.73
EOF
)

echo "$data" | awk -F',' '
BEGIN {
  printf "%-20s %10s %s\n", "Endpoint", "Latency(s)", "Status"
  print "--------------------------------------"
}
{
  status = ($2 > 1.0) ? "SLOW" : "OK"
  if (status == "SLOW") slow++
  printf "%-20s %10s %s\n", $1, $2, status
}
END {
  print "--------------------------------------"
  printf "Slow requests: %d / %d\n", slow, NR
}
'

OFS ve ORS'yi Ayarlamak için BEGIN Kullanımı

Sıklıkla gözden kaçan iki çıktı değişkeni BEGIN içinde temiz bir şekilde ayarlanabilir:

  • OFS (Çıktı Alan Ayırıcısı) — $1=$1 ile bir kaydı yeniden oluşturduğunuzda veya print $1, $2 kullandığınızda alanların arasına eklenir
  • ORS (Çıktı Kayıt Ayırıcısı) — her print çağrısından sonra eklenir (varsayılan değer \n)

OFS="," ayarı, dize birleştirmesi yapmadan tek geçişte bir TSV'yi CSV olarak yeniden biçimlendirmenizi sağlar. ORS değerini "\n---\n" olarak değiştirmek, kayıtların arasına otomatik olarak ayraçlar ekler.

#!/usr/bin/env bash
# Convert whitespace-delimited data to CSV with a header
data=$(cat <<'EOF'
alice   engineering  95000
bob     marketing    72000
carol   engineering  105000
EOF
)

echo "$data" | awk 'BEGIN { OFS=","; print "name,dept,salary" }
{ $1=$1; print }'

Uygulamalı Aralık Kalıbı: Günlüklerde Olay Pencereleri

Aralık kalıpları operasyonel günlük analizinde çok etkilidir. Yaygın bir görev, INCIDENT START ve INCIDENT END gibi işaretçi iletilerle tanımlanan bir olayın başlangıcı ile bitişi arasındaki tüm günlük satırlarını çıkarmaktır.

Aşağıdaki örnekte awk yalnızca olay penceresinin içindeki satırları çıkarır ve bu pencere içindeki ERROR olaylarını sayar; böylece bir aralık kalıbını bir biriktirici ve bir END özetiyle birleştirir:

#!/usr/bin/env bash
log=$(cat <<'EOF'
08:00:01 INFO  Normal operation
08:01:00 INFO  INCIDENT START: disk pressure detected
08:01:05 ERROR write failed on /dev/sda1
08:01:09 ERROR inode table corruption
08:01:14 WARN  remounting read-only
08:01:22 INFO  INCIDENT END: disk replaced
08:02:00 INFO  Normal operation resumed
EOF
)

echo "$log" | awk '
/INCIDENT START/,/INCIDENT END/ {
  print
  if (/ERROR/) errors++
}
END { print "Errors during incident:", errors+0 }
'

Aralıktaki Ayraç Satırlarını Atlama

Varsayılan olarak aralık kalıpları, /start/ ve /end/ ile eşleşen satırların kendisini de içerir. Bu ayraç satırlarını atlayıp yalnızca aradaki içeriği korumak için eylemi bir olumsuzlamayla veya bir bayrak değişkeniyle koşula bağlayın:

  • Olumsuzlama yaklaşımı: /start/,/end/ { if (!/start/ && !/end/) print }
  • Bayrak yaklaşımı: /start/ üzerinde bir değişkeni elle 1'e, /end/ üzerinde 0'a ayarlamak

Ayraç metni gövde içeriğinde de görünebilecekse bayrak yaklaşımı daha güvenilirdir:

#!/usr/bin/env bash
doc=$(cat <<'EOF'
## preamble
some intro text
## BEGIN_REPORT
row1: alpha 100
row2: beta  200
row3: gamma 150
## END_REPORT
## appendix
EOF
)

echo "$doc" | awk '
/## BEGIN_REPORT/ { capture=1; next }
/## END_REPORT/   { capture=0 }
capture           { print }
'

Bilgi Yoklaması: BEGIN Bloğunun Davranışı

BEGIN ve END bloklarının awk içindeki girdi işleme süreciyle nasıl etkileştiğine ilişkin anlayışınızı sınayın.

Ders Özeti: Kalıplar, Aralıklar ve BEGIN/END

Bu derste awk programlarının en güçlü üç yapısal özelliğinde ustalaştınız:

  • Kalıplar — düzenli ifade (/ERROR/), ilişkisel ($3 > 1000), olumsuzlanmış (!/DEBUG/) ve bileşik (&&, ||) kalıplar, açık if ifadelerine gerek kalmadan hangi kayıtların bir eylemi tetikleyeceğini denetler.
  • Aralık kalıpları (/start/,/end/) — bitişik kayıt bloklarını seçer; günlüklerdeki olay pencerelerini, yapılandırma bölümlerini ve rapor kesitlerini çıkarmak için mükemmeldir. Ayraç satırlarının kendisini dışarıda bırakmanız gerektiğinde bir bayrak değişkeni (next + boolean) kullanın.
  • BEGIN bloğu — herhangi bir girdiden önce bir kez çalışır; FS, OFS, ORS değerlerini ayarlamak, sayaçları başlangıç değerlerine getirmek ve rapor başlıklarını yazdırmak için idealdir.
  • END bloğu — tüm girdilerden sonra bir kez çalışır; ana kurallarda biriktirilen değişkenleri kullanarak toplamları, ortalamaları ve alt bilgileri yazdırmak için doğru yerdir.

Bu özellikler birlikte, ham metni alıp yapılandırılmış ve insanlar tarafından okunabilir raporlar üreten, kendini açıklayan eksiksiz awk programları yazmanızı sağlar; üstelik geçici dosyalar veya harici araçlar olmadan, tek bir işlem hattı aşamasında.

Sıkça Sorulan Sorular

“Desenler, Aralıklar ve BEGIN/END Blokları” dersi ücretsiz mi?

Evet — “Desenler, Aralıklar ve BEGIN/END Blokları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Linux Command Line & Bash Scripting Mastery kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.

“Desenler, Aralıklar ve BEGIN/END Blokları” dersinde ne öğreneceğim?

Koşullu desenlerle kayıtları filtreleyin; BEGIN ve END bloklarını kullanarak başlıklar ve toplamlar oluşturun. Linux Command Line & Bash Scripting Mastery ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Linux Command Line & Bash Scripting Mastery öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Linux Command Line & Bash Scripting Mastery, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Desenler, Aralıklar ve BEGIN/END Blokları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Linux Command Line & Bash Scripting Mastery dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Linux Command Line & Bash Scripting Mastery dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar
  2. Desenler, Aralıklar ve BEGIN/END Blokları
  3. awk Dizileri ve Gruplamayla Toplama
  4. awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma
← Linux Command Line & Bash Scripting Mastery Sayfasına Dön