awk Dizileri ve Gruplamayla Toplama
Alan değerlerini anahtar olarak kullanan ilişkisel dizilerle toplamları, sayımları ve gruplara göre özetleri hesaplayın.
awk Dizileri ve Gruplamayla Toplama, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 3. 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 İlişkilendirmeli Dizileri Nedir?
awk içinde ilişkilendirmeli dizi, anahtarların herhangi bir dize veya sayı olabildiği bir anahtar-değer deposudur. Çoğu dildeki indeksli dizilerin aksine awk dizileri arka planda karma tablolarıdır; bu da alan değerlerine göre verileri gruplamak ve toplamak için onları ideal kılar.
- Örtük olarak tanımlanır: yalnızca
arr[key] = valueatamasını yapmanız yeterlidir - Anahtarlar varsayılan olarak dizelerdir (sayılar dönüştürülür)
- Boyut sınırı yoktur — awk diziyi gerektiğinde büyütür
- Tek geçişte toplamları ve sayımları hesaplamak, ayrıca gruplara göre özetler oluşturmak için idealdir
Bir anahtarı artırmadan önce başlatmanız gerekmez; awk ayarlanmamış bir anahtarı otomatik olarak sıfır veya boş dize olarak değerlendirir.
Grup Başına Satır Sayma
En yaygın toplama örüntüsü, bir alandaki her benzersiz değerin kaç kez göründüğünü saymaktır. Dizi anahtarı olarak $1 alanını (veya herhangi bir alanı) kullanın ve eşleşen her satırda bir sayaç artırın.
END bloğu, tüm girdiler tüketildikten sonra çalışır; biriken sonuçları yazdırmanız gereken yer burasıdır.
count[$1]++İşlemden sonra count, $1 değerlerinin her biri için toplam satır sayısını içerir.
#!/usr/bin/env bash
# Count how many log entries exist per HTTP status code
# Input format: <ip> <date> <method> <path> <status> <bytes>
printf '10.0.0.1 2024-01-01 GET /index 200 512
10.0.0.2 2024-01-01 POST /api 404 128
10.0.0.3 2024-01-01 GET /img 200 2048
10.0.0.4 2024-01-01 GET /api 500 64
10.0.0.5 2024-01-01 DELETE /api 404 32
' | awk '
{
count[$5]++
}
END {
for (status in count)
print status, count[status]
}'
Grup Başına Sayısal Alanı Toplama
Sayma, toplamanın yalnızca bir biçimidir. Bir alandaki sayısal değerleri başka bir alana göre gruplandırarak toplamak için sayısal değeri, grup alanının anahtarı olduğu bir dizide biriktirin.
Örüntü şöyledir:
- Anahtar = gruplama alanı (örneğin kullanıcı adı için
$1) - Değer = sayısal alanın devam eden toplamı (örneğin baytlar için
$2)
Bu işlem, tek bir awk geçişinde eksiksiz bir gruplara göre toplam hesaplar; sıralama veya ön işleme gerekmez.
#!/usr/bin/env bash
# Sum bytes transferred per user from an access log
printf 'alice 1024
bob 512
alice 2048
charlie 256
bob 768
alice 128
' | awk '
{
bytes[$1] += $2
}
END {
for (user in bytes)
printf "%-10s %d bytes\n", user, bytes[user]
}'
Tek Geçişte Sayma ve Toplamayı Birleştirme
awk, birden çok diziyi eş zamanlı olarak tutmanıza olanak tanır; böylece dosyanın tek bir taramasında her grup için sayıyı, toplamı ve dolayısıyla ortalamayı elde edebilirsiniz. Bu, işlem hattını iki kez çalıştırmaktan çok daha verimlidir.
count[key]++— oluşumları izlertotal[key] += $N— devam eden toplamı izlerENDiçinde, grup başına ortalamayı bulmak içintotal[k] / count[k]işlemini yapın
#!/usr/bin/env bash
# Compute per-department headcount and average salary
printf 'Engineering Alice 95000
Engineering Bob 88000
Marketing Carol 72000
Marketing Dave 68000
Engineering Eve 102000
Marketing Frank 75000
' | awk '
{
dept = $1
sal = $3
count[dept]++
total[dept] += sal
}
END {
printf "%-15s %5s %10s\n", "Department", "Count", "Avg Salary"
for (d in count)
printf "%-15s %5d %10.0f\n", d, count[d], total[d]/count[d]
}'
İki Boyutlu Gruplama için Çok Alanlı Anahtarlar
Birden çok alanı bir ayırıcıyla birleştirerek bileşik anahtar oluşturabilirsiniz. Bu, özel bir söz dizimi olmadan iki boyutlu gruplama yapmanızı sağlar.
Verilerde bulunamayacak bir ayırıcı seçin (örneğin SUBSEP, yerleşik awk kayıt ayırıcısı \034 veya değişmez bir dikey çizgi |).
- Bileşik anahtar:
arr[$1 SUBSEP $2]veyaarr[$1"|"$2] - Yazdırırken anahtarı yeniden bölün:
split(key, parts, "|")
#!/usr/bin/env bash
# Count requests grouped by HTTP method AND status code
printf 'GET 200
POST 201
GET 404
GET 200
DELETE 204
POST 201
GET 404
POST 500
' | awk '
{
key = $1 "|" $2
count[key]++
}
END {
printf "%-8s %-6s %s\n", "Method", "Status", "Count"
for (k in count) {
split(k, parts, "|")
printf "%-8s %-6s %d\n", parts[1], parts[2], count[k]
}
}'
Grup Başına En Küçük ve En Büyük Değeri İzleme
İlişkilendirmeli diziler, grup başına en küçük ve en büyük değerleri izlemeyi kolaylaştırır. Buradaki püf noktası, özel !(key in arr) koşulunu kullanarak yalnızca her anahtarın ilk ortaya çıkışında başlatma yapmaktır.
!(key in min_arr), bir anahtar ilk kez görüldüğünde doğrudur- Başlatmadan sonra standart küçüktür / büyüktür denetimiyle karşılaştırın ve üzerine yazın
Bu örüntü, en küçük değerinizi bozabilecek hatalı bir sıfır değerini önler.
#!/usr/bin/env bash
# Find min and max response time per endpoint
printf '/api/users 120
/api/orders 340
/api/users 98
/api/orders 512
/api/users 210
/api/orders 280
/health 5
/health 7
' | awk '
{
ep = $1
rt = $2
if (!(ep in mn)) { mn[ep] = rt; mx[ep] = rt }
if (rt < mn[ep]) mn[ep] = rt
if (rt > mx[ep]) mx[ep] = rt
}
END {
printf "%-15s %6s %6s\n", "Endpoint", "Min", "Max"
for (ep in mn)
printf "%-15s %6d %6d\n", ep, mn[ep], mx[ep]
}'
Sıklık Dağılımı — En Sık Görülen N Grup
Gerçek dünyadaki yaygın görevlerden biri, en sık görülen N değeri bulmaktır. awk sayma işlemini yapar; sıralamak ve sonuçları sınırlamak için sort ve head üzerinden yönlendirme yapın.
Bu işlem hattı örüntüsü, kabuk betiği mühendisliğinde deyimsel bir kullanımdır:
- awk, oluşumları bir dizide sayar ve
ENDiçindecount keyyazdırır sort -rn, sayısal olarak azalan düzende sıralarhead -n 5, yalnızca en üstteki 5 sonucu tutar
awk'ı toplamaya odaklamak ve sıralamayı sort'a devretmek Unix felsefesini izler.
#!/usr/bin/env bash
# Top 3 most active IP addresses from an access log
printf '192.168.1.10 GET /index
10.0.0.5 POST /api
192.168.1.10 GET /css
172.16.0.3 GET /index
10.0.0.5 GET /api
192.168.1.10 DELETE /api
172.16.0.3 POST /login
10.0.0.5 GET /index
10.0.0.5 POST /logout
' | awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' \
| sort -rn \
| head -n 3
Birden Çok Dosyada Toplama için NR ve FNR Kullanma
Birden çok dosya işlenirken awk'ın yerleşik NR (okunan toplam kayıt sayısı) ve FNR (geçerli dosyadaki kayıt sayısı) değerleri, her kaydın hangi dosyadan geldiğini FILENAME kullanarak etiketlemenizi sağlar.
FILENAME— o anda okunan dosyanın adıFNR == 1— her yeni dosyanın başlangıcında tetiklenir (üst bilgileri atlamak için kullanışlıdır)
Bu sayede tek bir awk çağrısıyla bir günlük dizininin tamamında dosya başına gruplara göre toplama yapabilirsiniz.
awk Dizilerinden Sıralı Çıktı Yazdırma
awk içindeki for (key in array) döngüsü sıralamayı garanti etmez. Belirli bir çıktı elde etmek için awk'ın END içindeki yazdırma çıktısını sort'a yönlendirin veya değerleri toplayıp yalnızca GNU awk'ta bulunan asorti / asort işlevleriyle awk içinde sıralayın.
Taşınabilir kabuk işlem hattı yaklaşımı, platformlar arası betikler için genellikle tercih edilir:
sort -k1,1— ilk alana (grup anahtarına) göre alfabetik sıralarsort -k2,2rn— ikinci alana (sayıma/toplama) göre sayısal olarak azalan düzende sıralar
#!/usr/bin/env bash
# Bytes per user, sorted alphabetically by username
printf 'zara 800
alice 1500
bob 300
alice 200
zara 400
bob 1100
' | awk '
{
total[$1] += $2
}
END {
for (u in total)
print u, total[u]
}' | sort -k1,1
Dizi Anahtarlarını Silme ve Durumu Temizleme
Bazen akışın ortasında toplama durumunu sıfırlamanız gerekir; örneğin günlük dosyalarını işlerken her bölüm boş bir satırla veya bir belirteç değeriyle ayrılıyorsa.
delete arr[key]— tek bir girdiyi kaldırırdelete arr— dizinin tamamını temizler (GNU awk)- Hayali girdiler oluşturmaktan kaçınmak için erişmeden önce
(key in arr)ile varlığını denetleyin
Bu teknik, awk'ı yeniden başlatmadan kayan pencere veya bölüm başına toplama yapmanızı sağlar.
#!/usr/bin/env bash
# Sum values within each section delimited by "---"
printf 'alice 100
bob 200
---
alice 50
bob 75
charlie 300
---
' | awk '
/^---/ {
print "-- Section totals --"
for (u in total) printf " %-10s %d\n", u, total[u]
delete total
next
}
{
total[$1] += $2
}'
Gerçek Dünya İşlem Hattı: Nginx Günlük Özeti
Tümünü bir araya getirelim: burada Nginx birleşik günlük biçimi üzerinde üretim kalitesinde, tek geçişli bir awk toplaması yer alıyor. Bu işlem, tek bir taramada sanal ana bilgisayar başına istek sayısını, toplam bayt sayısını ve hata oranını hesaplar.
Kullanılan temel teknikler:
- Bileşik anahtar: bir alandan çıkarılan
vhost - Paralel diziler:
reqs[],bytes[],errors[] - Koşullu biriktirme: yalnızca hata yanıtlarını saymak için
$9 >= 400 ENDiçinde biçimlendirilmişprintftablosu
#!/usr/bin/env bash
# Simulated Nginx combined log: host ip - - [date] "METHOD /path HTTP/1.1" status bytes
printf 'api.example.com 10.0.0.1 - - [01/Jan/2024] "GET /v1" 200 1024
www.example.com 10.0.0.2 - - [01/Jan/2024] "GET /" 200 4096
api.example.com 10.0.0.3 - - [01/Jan/2024] "POST /v1" 500 128
www.example.com 10.0.0.4 - - [01/Jan/2024] "GET /img" 404 64
api.example.com 10.0.0.5 - - [01/Jan/2024] "GET /v1" 200 2048
www.example.com 10.0.0.6 - - [01/Jan/2024] "GET /" 200 4096
api.example.com 10.0.0.7 - - [01/Jan/2024] "DELETE /v1" 403 32
' | awk '
{
host = $1; status = $9; b = $10
reqs[host]++
bytes[host] += b
if (status + 0 >= 400) errors[host]++
}
END {
printf "%-20s %6s %10s %6s\n", "Host", "Reqs", "Bytes", "Errors"
for (h in reqs)
printf "%-20s %6d %10d %6d\n", h, reqs[h], bytes[h], errors[h]+0
}'
Bilgi Kontrolü: En Küçük Değeri Doğru Başlatma
Yaygın bir awk toplama tuzağını anlayıp anlamadığınızı test edin.
Ders Özeti: awk Dizileriyle Toplama
Gruplara göre toplamaları tamamen awk içinde hesaplamak için gereken temel örüntüleri öğrendiniz:
- Sayma:
count[$key]++— her satırda artırın,ENDiçinde yazdırın - Toplama:
total[$key] += $N— sayısal alanları grup başına biriktirin - Ortalama: hem
count[]hem detotal[]değerlerini tutun,ENDiçinde bölme yapın - En küçük/En büyük:
!(key in arr)kullanarak ilk oluşumda başlatın, ardından karşılaştırın - Bileşik anahtarlar: çok boyutlu gruplama için alanları bir ayırıcıyla birleştirin
- Sıralı çıktı: belirli bir sıralama elde etmek için awk'ın
ENDiçindeki yazdırma çıktısınısort'a yönlendirin - Bölüm sıfırlamaları: girdinin mantıksal bölümleri arasındaki durumu temizlemek için
delete arrkullanın
Bu örüntüler, ağır veritabanı sorgularını veya birden çok işlem hattı geçişini tek ve verimli bir awk çağrısıyla değiştirmenizi sağlar; bu, üretim amaçlı kabuk betiği mühendisliği için temel bir beceridir.
Sıkça Sorulan Sorular
“awk Dizileri ve Gruplamayla Toplama” dersi ücretsiz mi?
Evet — “awk Dizileri ve Gruplamayla Toplama” 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 Dizileri ve Gruplamayla Toplama” dersinde ne öğreneceğim?
Alan değerlerini anahtar olarak kullanan ilişkisel dizilerle toplamları, sayımları ve gruplara göre özetleri hesaplayın. 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 3. dersidir.
“awk Dizileri ve Gruplamayla Toplama” 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