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 DevOps Bootcamp 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, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp 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 }' fileKalı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 —
BEGINveEND
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 }' fileBilmeniz 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
awkprogramlarını çalıştırmak
Sözdizimi:
awk 'BEGIN { setup } pattern { action }' fileFS 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=$1ile bir kaydı yeniden oluşturduğunuzda veyaprint $1, $2kullandığı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çıkififadelerine 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,ORSdeğ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 DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp 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. DevOps Bootcamp 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.
DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, 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 DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DevOps Bootcamp 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
- awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar
- Desenler, Aralıklar ve BEGIN/END Blokları
- awk Dizileri ve Gruplamayla Toplama
- awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma