awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma
Kullanıcı tanımlı fonksiyonlar oluşturun ve ham veri akışlarından düzenli tablo raporları üretmek için printf kullanın.
awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma, CoddyKit'te ücretsiz bir Linux Command Line & Bash Scripting Mastery dersidir. Bu, 4 dersinin 4. 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'ta İşlevler ve printf Neden Önemlidir?
awk programlarınız tek satırlık komutlardan çok adımlı işlem hatlarına büyüdükçe iki özellik vazgeçilmez hâle gelir: kullanıcı tanımlı işlevler ve printf biçimlendirmesi.
İşlevler, yeniden kullanılabilir mantığı — yüzde hesaplayıcı, dize kırpıcı veya birim dönüştürücü gibi — kapsüllemenizi sağlar; böylece aynı şeyi bir kez yazıp aynı programın herhangi bir yerinde çağırabilirsiniz. printf ise çıktının tam olarak nasıl görüneceğini denetlemenizi sağlar: sütun genişlikleri, ondalık basamaklar, dolgu ve hizalama.
Birlikte kullanıldıklarında ham günlük satırlarını, mühendislerin ve yöneticilerin harekete geçebileceği, düzenli ve okunabilir raporlara dönüştürürler.
- İşlevler yinelemeyi azaltır ve programların yalıtılmış olarak test edilebilmesini sağlar.
printf, verileri sabit genişlikli sütunlarda hizalar; böylece farklı girdi uzunluklarında bile raporlar okunabilir kalır.- Her iki özellik de POSIX awk, gawk ve mawk içinde çalışır; uzantı gerekmez.
awk'ta Kullanıcı İşlevi Tanımlama
Kullanıcı işlevi, herhangi bir örüntü-eylem kuralından önce veya sonra function anahtar sözcüğüyle bildirilir. Söz dizimi şöyledir:
function name(param1, param2, local1, local2) {
# body
return value
}Temel bir awk deyimi: yerel değişkenler, önlerinde fazladan boşluk bulunan ek parametreler olarak tanımlanır. local anahtar sözcüğü yoktur; fazladan boşluk kullanılması, bu parametrelerin çağıranın aktardığı bağımsız değişkenler değil, yerel değişkenler olduğunu belirtir.
- Parametre olarak bildirilmemiş tüm değişkenler varsayılan olarak geneldir.
- İşlevler kendilerini yinelemeli olarak çağırabilir.
returnisteğe bağlıdır; kullanılmadığında işlev boş bir dize döndürür.
#!/usr/bin/env bash
# Demonstrate a simple awk user function
echo '10 3
7 0
100 4' | awk '
function divide(a, b, result) {
if (b == 0) return "ERR"
result = a / b
return result
}
{
print $1 "/" $2 " = " divide($1, $2)
}
'Dize Mantığıyla İşlevler
İşlevler, yinelenen dize işlemleri için özellikle kullanışlıdır. Başta ve sonda bulunan boşlukları kırpmayı düşünün; ham günlük verileri karşılaştırma veya raporlama öncesinde buna sıkça ihtiyaç duyar.
Aşağıdaki örnek, gsub kullanarak trim(s) işlevini tanımlar ve ana kuralı temiz ve okunabilir tutarak bunu her kayıtta kullanır.
gsub(regex, replacement, target), target değerini yerinde değiştirir ve değiştirme sayısını döndürür.- Düzenli ifade mantığını bir işlevin içine koymak, kural bloğunun iş mantığına odaklanmasını sağlar.
- Bir
BEGINbloğunda doğrudan elle hazırlanmış dizeleri aktararak birim testi yapabilirsiniz.
#!/usr/bin/env bash
# trim() strips leading/trailing spaces; used to normalise CSV-like data
printf ' alice , 90 \n bob , 85 \n carol , 92 \n' | awk -F',' '
function trim(s) {
gsub(/^[ \t]+|[ \t]+$/, "", s)
return s
}
{
name = trim($1)
score = trim($2)
print name, score
}
'awk'ta printf'e Giriş
awk içindeki printf, C ve Bash'in yerleşik printf işleviyle aynı kuralları izler. print ile arasındaki temel fark, printf'in asla otomatik olarak satır sonu eklememesidir; \n karakterini kendiniz eklemelisiniz.
Yaygın biçim belirteçleri:
%s— dize%d— tam sayı%f— kayan noktalı sayı%e— bilimsel gösterim%g—%f/%eseçeneklerinden daha kısa olanı
Genişlik ve duyarlılık, % ile belirteç arasına sayılar yerleştirilerek denetlenir: %-20s, 20 karakterlik bir alanda sola hizalar; %8.2f, 2 ondalık basamaklı ve 8 karakter genişliğinde bir kayan noktalı sayı üretir.
#!/usr/bin/env bash
# printf format specifiers in awk
echo '' | awk '
BEGIN {
printf "%s\n", "plain string"
printf "%10s\n", "right-pad"
printf "%-10s|\n", "left-pad"
printf "%8.2f\n", 3.14159
printf "%08d\n", 42
printf "%e\n", 123456.789
}
'printf ile Rapor Üst Bilgisi Oluşturma
Düzenli bir raporun bir üst bilgi satırına ve ayırıcı satıra ihtiyacı vardır. BEGIN bloğu bunları üretmek için doğal yerdir; bu blok herhangi bir girdi işlenmeden önce bir kez çalışır.
Püf noktası, üst bilgideki genişlikleri veri satırlarında kullanılan genişliklerle tam olarak eşleştirmektir. Genişlik sabitlerini BEGIN içinde (veya bir işlevde) tanımlamak, sütun genişliklerini daha sonra ayarladığınızda her şeyin uyumlu kalmasını sağlar.
- Bölücü çizgiyi oluşturmak için kısa çizgilerden oluşan bir ayırıcı dizeyle
printfkullanın. - Üst bilgi satırlarını her zaman
\nile sonlandırın. - Eksiksiz bir rapor yapısı için bir
BEGINüst bilgisini, kayıt başına satırları ve birENDalt bilgisini birleştirin.
#!/usr/bin/env bash
# Print a report header in BEGIN, data rows per-record, total in END
printf 'alice 9200 12\nbob 8750 10\ncarol 10400 14\n' | awk '
BEGIN {
printf "%-10s %10s %6s %12s\n", "Name", "Salary", "Months", "Annual"
printf "%s\n", "----------------------------------------------"
total = 0
}
{
annual = $2 * $3
total += annual
printf "%-10s %10d %6d %12d\n", $1, $2, $3, annual
}
END {
printf "%s\n", "----------------------------------------------"
printf "%-10s %10s %6s %12d\n", "TOTAL", "", "", total
}
'Biçimlendirme Mantığı için Kullanıcı İşlevleri
Çok sütunlu raporlar oluştururken aynı biçimlendirme çağrısına birkaç yerde ihtiyaç duymak yaygındır; örneğin bir yüzde çubuğu oluşturmak veya baytları insanların okuyabileceği birime dönüştürmek. Bunu bir işlevin içine koymak yinelemeyi önler ve biçimi genel olarak kolayca değiştirmenizi sağlar.
Aşağıdaki işlev, baytları KB, MB veya GB birimlerine dönüştürür ve biçimlendirilmiş bir dize döndürür. Çağıran kural yalnızca $NF değerini (son alanı) aktarır ve dönen sonucu yazdırır.
#!/usr/bin/env bash
# human_bytes() converts raw byte counts to KB/MB/GB strings
printf 'var.log 1024\naccess.log 2097152\ncore.dump 1073741824\ntiny.txt 512\n' | awk '
function human_bytes(n, s) {
if (n >= 1073741824) { s = sprintf("%.1f GB", n/1073741824) }
else if (n >= 1048576) { s = sprintf("%.1f MB", n/1048576) }
else if (n >= 1024) { s = sprintf("%.1f KB", n/1024) }
else { s = sprintf("%d B", n) }
return s
}
BEGIN { printf "%-20s %10s\n", "File", "Size"; print "------------------------------" }
{ printf "%-20s %10s\n", $1, human_bytes($2) }
'Yazdırmadan Önce Verileri Dizilerde Biriktirme
Gerçek raporlar çoğu zaman toplamları, ortalamaları veya sıralamaları gerektirir — bunlar, tüm girdiyi görmeden hesaplayamayacağınız değerlerdir. İzlenecek yaklaşım şöyledir:
- Kayıt başına işleme aşamasında verileri ilişkisel dizilerde biriktirin.
- Türetilmiş değerleri (ortalamalar, yüzdeler)
ENDiçinde hesaplayın. - Biçimlendirilmiş çıktıyı yalnızca
ENDiçinden üretin; böylece genişlikler tüm veri kümesine göre uyarlanabilir.
Bu gecikmeli çıktı yaklaşımı, awk ile rapor üretimindeki en güçlü kalıplardan biridir. Aşağıdaki örnek, bir erişim günlüğündeki HTTP durum kodlarına göre istek sayılarını ve yanıt baytlarını toplar.
#!/usr/bin/env bash
# Summarise an nginx-style access log by HTTP status code
printf '127.0.0.1 200 1234\n127.0.0.1 404 512\n10.0.0.2 200 8900\n10.0.0.3 500 256\n10.0.0.4 200 4096\n10.0.0.5 404 300\n' | awk '
{
status = $2
bytes = $3
count[status]++
total_bytes[status] += bytes
}
END {
printf "%-8s %8s %14s\n", "Status", "Requests", "Total Bytes"
print "-----------------------------------"
for (s in count)
printf "%-8s %8d %14d\n", s, count[s], total_bytes[s]
}
'awk'ta Özyinelemeli İşlevler
awk özyinelemeyi destekler. Klasik kullanım alanlarından biri faktöriyel hesaplamak veya tekrarlanan dizeler oluşturmaktır (örneğin, terminal genişliğine göre uzunluğu belirlenen tirelerden oluşan bir satır). Özyineleme, awk'ta genel amaçlı dillere kıyasla daha az yaygındır; ancak doğru şekilde çalışır ve tüm önemli uygulamalarda kullanılabilir.
Aşağıdaki örnek, özyinelemeli bir repeat(s, n) işlevi tanımlar ve bunu, en geniş veri satırının genişliğiyle otomatik olarak eşleşen ayırıcı satırlar çizmek için kullanır — sabit sayıda tire yazmanız gerekmez.
- Büyük girdilerde derin özyinelemeden kaçının — awk, kuyruk çağrısı iyileştirmesine sahip değildir.
- Basit yinelemeler için
sprintf("%*s", n, "")ilegsub(/ /, "-")kullanmak daha hızlıdır; ancak açıklayıcılığı daha düşüktür.
#!/usr/bin/env bash
# Recursive repeat() to build separator lines dynamically
awk '
function repeat(s, n, acc) {
if (n <= 0) return ""
acc = s repeat(s, n-1)
return acc
}
BEGIN {
header = sprintf("%-15s %10s %10s", "Metric", "Current", "Target")
sep = repeat("-", length(header))
print sep
print header
print sep
printf "%-15s %10.1f %10.1f\n", "CPU %", 72.4, 60.0
printf "%-15s %10.1f %10.1f\n", "Mem GB", 14.2, 16.0
printf "%-15s %10d %10d\n", "Open FDs", 1024, 800
print sep
}
' /dev/nullawk İçinde Bir Dosyaya veya İşlem Hattına printf Yazdırma
awk'ın printf (ve print) komutları, kabuk komutlarına çıktı yönlendirebilir veya bunlara veri aktarabilir — tüm işlemi bir alt kabuk içine sarmalamanıza gerek kalmadan, doğrudan awk programının içinden.
printf "..." > "file.txt"— bir dosyaya yazar (bir kez içeriği siler, ardından aynı çalıştırma sırasında ekleme yapar).printf "..." >> "file.txt"— bir dosyaya ekleme yapar.printf "..." | "sort -rn"— bir kabuk komutuna veri aktarır; awk, kanalını kayıtlar boyunca açık tutar ve programın sonunda kapatır.
Yaygın bir yaklaşım, bir günlük üzerindeki tek geçişi durum veya sunucu başına birden çok çıktı dosyasına bölmektir; böylece büyük bir dosyayı tekrar tekrar taramaktan kaçınılır.
#!/usr/bin/env bash
# Route records into per-status files using print redirection
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
printf '200 /index.html\n404 /missing\n200 /api/data\n500 /crash\n404 /lost\n' | awk -v out="$tmpdir" '
{
file = out "/" $1 ".log"
printf "%-6s %s\n", $1, $2 > file
}
END {
close(file) # flush all open handles
}
'
echo "=== 200 ==="
cat "$tmpdir/200.log"
echo "=== 404 ==="
cat "$tmpdir/404.log"awk ile CSV Raporu Oluşturma
Tüm raporlar insanlar için hazırlanmaz. Bazen çıktının, bir elektronik tabloya veya sonraki bir işlem hattına aktarılabilecek, makinelerce okunabilir CSV biçiminde olması gerekir. awk'ın printf komutu bunu temiz bir şekilde gerçekleştirir: OFS değerini virgül olarak ayarlayın veya her ayırıcıyı açıkça denetleyin.
awk ile güvenilir CSV oluşturmak için iki önemli kural vardır:
- Virgül veya satır sonu içerebilecek alanları çift tırnak içine alın.
- Bir alandaki gerçek çift tırnakları iki katına çıkararak kaçışlayın:
He said ""hello"".
Aşağıdaki csv_field(s) işlevi, bu tırnaklama mantığını kapsüller; böylece her dize alanına tutarlı biçimde uygulanabilir.
#!/usr/bin/env bash
# Emit a valid CSV report from space-separated input
printf 'alice engineer 95000\nbob "sales,mgr" 82000\ncarol developer 110000\n' | awk '
function csv_field(s, safe) {
safe = s
gsub(/"/, "\"\"" , safe) # double any embedded quotes
return "\"" safe "\"" # wrap in quotes
}
BEGIN { print "Name,Role,Salary" }
{
printf "%s,%s,%d\n", csv_field($1), csv_field($2), $3
}
'Uçtan Uca: Eksiksiz Bir Erişim Günlüğü Raporu
Bu son örnek, her şeyi bir araya getirir: kullanıcı işlevleri, printf biçimlendirmesi, dizi biriktirme ve yapılandırılmış bir üst bilgi/alt bilgi. Girdi, basitleştirilmiş bir web erişim günlüğüdür; çıktı ise yöntem başına toplamları ve genel toplam satırını içeren, insanların okuyabileceği bir özet tablosudur.
Kullanılan temel teknikler:
count[method]++vebytes[method] += size, yöntem başına istatistikleri tek geçişte biriktirir.human_bytes()(önceki bir sahneden) bayt toplamlarını dönüştürür.- Üst bilgide, verilerde ve alt bilgide eşleşen genişliklerle kullanılan
printf, girdi boyutu ne olursa olsun tablonun hizalı kalmasını sağlar. ENDbloğu, diziyifor (k in arr)ile dolaşır ve bir kanallasortkomutuna aktararak sıralanmış çıktı üretir.
#!/usr/bin/env bash
# Full access log report: method breakdown with human-readable bytes
printf 'GET /index 200 4096\nPOST /api 201 512\nGET /img 200 102400\nDELETE /item 204 0\nPOST /login 401 256\nGET /style 200 8192\n' | awk '
function human_bytes(n, s) {
if (n >= 1048576) s = sprintf("%.1f MB", n/1048576)
else if (n >= 1024) s = sprintf("%.1f KB", n/1024)
else s = sprintf("%d B", n)
return s
}
{
method = $1
size = $4
count[method]++
bytes[method] += size
grand_count++
grand_bytes += size
}
END {
fmt = "%-10s %8s %15s\n"
sep = "----------------------------------"
printf fmt, "Method", "Requests", "Bytes"
print sep
for (m in count)
printf "%-10s %8d %15s\n", m, count[m], human_bytes(bytes[m])
print sep
printf "%-10s %8d %15s\n", "TOTAL", grand_count, human_bytes(grand_bytes)
}
'Bilgi Kontrolü: awk İşlevlerinde Yerel Değişkenler
POSIX kuralını izleyerek result değişkenini bir awk işlevi içinde yerel değişken olarak aşağıdakilerden hangisi doğru biçimde tanımlar?
Ders Özeti: awk İşlevleri, printf ve Rapor Üretimi
Bu derste ham veri akışlarından biçimlendirilmiş raporlar üreten, üretim kalitesinde awk programları yazmayı öğrendiniz. İleride kullanmak üzere hatırlamanız gerekenler:
- Kullanıcı işlevleri
function name(params, locals)ile tanımlanır. Yerel değişken parametrelerinden önce fazladan boşluk bırakılması POSIX kuralıdır;localanahtar sözcüğü yoktur. - printf, çıktı üzerinde kesin denetim sağlar: genişlik (
%10s), hizalama (%-10s) ve duyarlık (%8.2f).\nkarakterini açıkça eklemeyi unutmayın. - Üst bilgileri ve ayırıcıları üretmek için BEGIN'i, verileri biriktirmek için kayıt başına kuralları, toplamları hesaplayıp tamamlanmış raporu yazdırmak için de END'i kullanın.
- Raporları bölmek veya çıktıyı sonradan işlemek için awk içinden dosyalara (
> file) veya işlem hatlarına (| "sort")printfçıktısı yönlendirin. - CSV üretirken, iç içe geçmiş virgülleri ve tırnakları güvenli biçimde işlemek için dize alanlarını bir csv_field() yardımcı işlevine aktarın.
- Birimleri dönüştüren (
human_bytes), karakterleri yineleyen (repeat) veya dizeleri temizleyen (trim,csv_field) işlevleri kişisel bir awk kitaplığında tutmaya değer; bu işlevler projeler arasında sorunsuzca birleştirilebilir.
Sıkça Sorulan Sorular
“awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma” dersi ücretsiz mi?
Evet — “awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma” 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.
“awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma” dersinde ne öğreneceğim?
Kullanıcı tanımlı fonksiyonlar oluşturun ve ham veri akışlarından düzenli tablo raporları üretmek için printf kullanın. 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 4. dersidir.
“awk Fonksiyonları, printf Biçimlendirmesi ve Rapor Oluşturma” 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
- 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