awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar
CSV, TSV ve günlük satırlarını temiz sütunlara ayırmak için girdi ve çıktı alanı ayraçlarını denetleyin.
awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 1. 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'te Kayıtlar ve Alanlar Nedir?
awk, girdiyi satır satır okur. Her satıra kayıt, o satırdaki boşluklarla ayrılmış her parçaya ise alan denir.
$0— geçerli kaydın tamamı (satırın bütünü)$1— ilk alan$2— ikinci alan$NF— son alan (NF= alan sayısı)
Varsayılan olarak awk, alanları her türlü ardışık boşluk dizisine (boşluk veya sekme) göre ayırır. Bu özellik awk'i günlükleri ayrıştırma, komut çıktısını işleme ve boşluklarla ayrılmış veriler için hemen kullanışlı kılar.
#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'
# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'Girdi Alanı Ayırıcısı: FS
Yerleşik FS değişkeni (Alan Ayırıcısı), awk'e her kaydı alanlara nasıl ayıracağını bildirir. Varsayılan değeri tek bir boşluktur; bu değer boşluklara göre ayırma kipini etkinleştirir.
FS değerini iki şekilde ayarlayabilirsiniz:
- Komut satırında
-Fseçeneğiyle:awk -F':' - Bir
BEGINbloğunun içinde:BEGIN { FS = ":" }
Her iki yöntem de eşdeğerdir. Daha uzun betiklerde BEGIN bloğu tercih edilir; çünkü yapılandırmayı betiğin içinde tutarak betiği daha okunabilir ve taşınabilir kılar.
#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
| awk -F':' '{ print $1, "UID="$3, "shell="$7 }'BEGIN Bloğunda FS Ayarlama
Tek satırlık komuttan uzun betiklerde FS değerini bir BEGIN bloğuna yerleştirmek standart uygulamadır. BEGIN bloğu, awk herhangi bir girdi okumadan önce çalışır; böylece ayırıcı ilk kayıt için hazır olur.
Bu yöntem aynı zamanda birden çok değişkeni tek seferde ayarlamanıza, açıklamalar eklemenize ve mantığınızı bir betik dosyasında kendi içinde tutmanıza olanak tanır.
Gerçek dünyada sık karşılaşacağınız ayırıcılar:
- İki nokta
:—/etc/passwd,/etc/shadow - Sekme
\t— TSV dışa aktarımları, derleyici çıktısı - Virgül
,— CSV dosyaları (basit, tırnak içine alınmış alanlar yok) - Dikey çizgi
|— bazı günlük biçimleri, veritabanı dökümleri
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
| awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'awk ile CSV Dosyalarını Ayrıştırma
CSV (virgülle ayrılmış değerler), kabuk mühendisliğinde en yaygın veri biçimlerinden biridir. FS="," ayarı, awk'in virgülleri sınırlayıcı olarak ele almasını sağlar.
Önemli uyarı: awk'in yerleşik CSV işleme özelliği, virgül içeren tırnak içine alınmış alanları hesaba katmaz (ör. "Smith, John"). Tırnak içine alınmış virgüller içermeyen basit CSV'lerde bu yöntem kusursuz çalışır. Tırnak içine alınmış alanlara sahip RFC 4180 uyumlu CSV'ler için uygun bir CSV ayrıştırıcısı veya miller/csvkit kullanın.
Gerçek dünyadaki yaygın bir görev, belirli sütunları çıkarmak ve satırları değere göre filtrelemektir; FS ayarlandıktan sonra her ikisi de awk ile kolayca yapılabilir.
#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'
echo "$data" | awk -F',' '
NR == 1 { next } # skip header row
$3 > 50000 { print $1, "earns", $3 }
'Çok Karakterli ve Düzenli İfadeli Alan Ayırıcıları
awk'teki FS tek bir karakterle sınırlı değildir; bir düzenli ifade olabilir. Bu özellik, alanların değişken uzunluklu sınırlayıcılarla ayrıldığı gerçek dünya günlük biçimleri için oldukça güçlüdür.
Düzenli ifade ayırıcılarına örnekler:
FS = "[,;]"— virgül veya noktalı virgüle göre ayırırFS = "[ \t]+"— bir veya daha fazla boşluk ya da sekmeye göre ayırır (varsayılanla aynı, ancak açıkça belirtilmiştir)FS = "::"— gerçek çift iki noktaya göre ayırırFS = "\\|"— dikey çizgi karakterine göre ayırır (kaçış karakteri kullanılmalıdır)
FS bir düzenli ifade olduğunda awk (gawk) onu gerçek bir dize olarak değil, bir desen olarak ele alır.
#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO | startup ok | main\n' \
| awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'
# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
| awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'Çıktı Alanı Ayırıcısı: OFS
OFS (Çıktı Alanı Ayırıcısı), print ile bir kaydı yeniden oluşturduğunuzda awk'in alanların arasına ne koyacağını denetler. Varsayılanı tek bir boşluktur.
Temel nokta şudur: OFS yalnızca virgül söz dizimini print içinde kullandığınızda veya bir alana atama yaptığınızda ve awk $0'ı yeniden oluşturduğunda alanların arasına eklenir. Kaynak kodunda boşluklarla birleştirme yaparsanız OFS kullanılmaz.
print $1, $2, $3— virgüller alanların arasına OFS eklenmesini sağlarprint $1 " " $2— açıkça belirtilen boşluk kullanılır, OFS yok sayılır
Yaygın bir yöntem, CSV okuyup TSV yazmaktır; bunun için FS="," ve OFS="\t" ayarlanır.
#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'
echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'
echo '---'
# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'awk'i OFS ile $0'ı Yeniden Oluşturmaya Zorlama
İnce ama önemli bir yöntem vardır: herhangi bir alana atama yapmak (bir alanı kendisine atamak, $1=$1, bile) awk'i tüm alanları OFS ile birleştirerek $0'ı yeniden oluşturmaya zorlar.
Bu, bir kaydın sınırlayıcılarını her alanı elle yazdırmadan yeniden biçimlendirmenin deyimsel yoludur:
FS'yi girdi sınırlayıcısına ayarlayınOFS'yi istediğiniz çıktı sınırlayıcısına ayarlayın$1=$1ile yeniden oluşturmayı tetikleyin$0'ı yazdırın
Bu yaklaşım her sayıda alana uyarlanabilir ve $1, $2, $3, ... gibi değerleri sabit kodlamaktan kaçınır.
#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
| awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'
# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
| awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'Kayıt Ayırıcısı: RS
FS bir kayıt içindeki alanları nasıl ayırıyorsa, RS (Kayıt Ayırıcısı) de kayıtları birbirinden neyin ayırdığını tanımlar. Varsayılan olarak RS bir newline karakteridir; bu nedenle awk her seferinde bir satırı işler.
RS değerini değiştirmek, çok satırlı kayıtların güçlü bir şekilde işlenmesini sağlar:
RS=""— paragraf kipi: boş satırlar kayıtları ayırır (alanlar birden çok satıra yayılabilir)RS=";"— noktalı virgüllere göre ayırır (SQL dökümleri için kullanışlıdır)RS="\n"— açıkça belirtilmiş newline (varsayılan)
Paragraf kipinde (RS=""), çok satırlı kayıt içindeki alanları ayırmak için yine FS kullanılır; ayrıca bir kayıt içindeki newline karakterleri de otomatik olarak alan ayırıcısı kabul edilir.
#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London
Name: Bob
Role: Designer
City: Paris'
echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
print "Record", NR":"
for (i=1; i<=NF; i++) print " ", $i
print ""
}'Çıktı Kayıt Ayırıcısı: ORS
ORS (Çıktı Kayıt Ayırıcısı), her print ifadesinden sonra yazdırılır. Varsayılan değeri bir newline karakteridir (\n); her print ifadesinin bu nedenle yeni bir satıra geçmesinin sebebi budur.
ORS değerini değiştirerek şunları yapabilirsiniz:
- Kayıtları tek satırda birleştirebilirsiniz:
ORS=" " - Çıktı kayıtları arasına boş satırlar ekleyebilirsiniz:
ORS="\n\n" - JSON veya XML parçaları gibi özel çıktı biçimleri oluşturabilirsiniz
printf ifadesinin ORS kullanmadığını unutmayın — ORS yalnızca yalın print ifadesi için geçerlidir. Biçimlendirme üzerinde tam denetim gerektiğinde printf kullanın.
#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo # final newline
# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
| awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'Uygulamalı Örnek: Apache Erişim Günlüklerini Ayrıştırma
Apache/nginx erişim günlükleri, alanları boşluklarla ayrılmış, iyi bilinen bir biçime sahiptir. Bazı alanlar (zaman damgası gibi) boşluk içerir ve köşeli parantez veya tırnak içine alınır; bu da awk ile doğrudan alanlara ayırmayı zorlaştırır.
Uygulanabilir bir yaklaşım, yapıyı hesaba katan bir normal ifade FS kullanmak ya da tam biçimi bilerek belirli alanları konumlarına göre çıkarmaktır.
Birleşik Günlük Biçimi alanları kabaca şöyledir:
- İstemci IP adresi
- Ident (genellikle
-) - Kimlik doğrulama kullanıcısı (genellikle
-) - Zaman damgası (köşeli parantez içindedir ve tek bir belirteç sayılır)
- İstek yöntemi+yolu+protokolü (tırnak içindedir)
- HTTP durum kodu
- Yanıt baytları
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'
echo "$logs" | awk '{
ip = $1
status = $9
bytes = $10
# Extract the request path from the quoted string in field 7
split($7, parts, "/")
path = "/" parts[2]
printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'Bir İşlem Hattında FS, OFS, RS ve ORS'yi Birleştirme
Gerçek kabuk mühendisliğinde bu ayırıcıları nadiren tek başlarına kullanırsınız. Yaygın bir işlem hattı biçimi, awk'ı işlem hattının ortasında bir biçim dönüştürücü olarak kullanarak yapılandırılmış bir biçimi başka bir biçime dönüştürmektir.
Ayırıcıları birleştirirken dikkat edilmesi gerekenler:
- Biçimleri dönüştürürken
FSveOFSdeğerleriniBEGINiçinde her zaman birlikte ayarlayın - Tüm alanları tek tek listelemeden yeniden biçimlendirmek istediğinizde
$1=$1kullanarak$0'ın yeniden oluşturulmasını tetikleyin RSdeğerini yalnızca kayıtlarınız gerçekten birden çok satıra yayılıyorsa değiştirin- Çıktı kayıtları arasındaki boşlukları denetlemek için
ORSkullanın - Kesin biçimlendirme için
printfkullanmayı tercih edin;ORS'nin otomatik sonlandırması işinize geldiğindeprintkullanın
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
| awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'Bilgi Yoklaması: OFS ve Alanların Yeniden Oluşturulması
OFS'nin awk içinde alan atamasıyla nasıl etkileştiğine ilişkin anlayışınızı sınayın.
Ders Özeti: Kayıtlar, Alanlar ve Ayırıcılar
Artık awk'ın yapılandırılmış verileri nasıl okuyup yazacağını tam olarak denetleyebilirsiniz. Dört ayırıcı değişkenin özeti şöyledir:
FS— Girdi Alan Ayırıcısı.-File veyaBEGINiçinde ayarlanır. Bir karakter, dize veya normal ifade olabilir. Varsayılan: boşluk karakterleri.OFS— Çıktı Alan Ayırıcısı.print $1, $2çağrılarında alanların arasına eklenir ve bir alan atamasından sonra awk$0'ı yeniden oluşturduğunda kullanılır. Varsayılan: tek boşluk.RS— Girdi Kayıt Ayırıcısı. Kayıtları (satırları) neyin ayırdığını tanımlar. Varsayılan: newline. Paragraf kipi için boş dize olarak ayarlanır.ORS— Çıktı Kayıt Ayırıcısı. Herprintifadesinden sonra eklenir. Varsayılan: newline. Satırları birleştirmek veya aralarına boşluk eklemek için değiştirilebilir.
Hatırlanması gereken en önemli kalıp şudur: FS ve OFS değerlerini BEGIN içinde ayarlayın, ardından alan konumlarını sabit olarak belirtmeden tüm alanlardaki ayraçları yeniden biçimlendirmek istediğinizde $1=$1 kullanarak $0'ı yeniden oluşturun. Bu kalıp, sütun sayısı ne olursa olsun dosyalarda çalışır ve awk tabanlı biçim dönüştürme işlem hatlarının temelini oluşturur.
Sıkça Sorulan Sorular
“awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar” dersi ücretsiz mi?
Evet — “awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar” 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.
“awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar” dersinde ne öğreneceğim?
CSV, TSV ve günlük satırlarını temiz sütunlara ayırmak için girdi ve çıktı alanı ayraçlarını denetleyin. 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 1. dersidir.
“awk'ta Kayıtlar, Alanlar ve Özel Ayraçlar” 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