Agregasi dengan Array dan Pengelompokan awk
Hitung jumlah, banyaknya data, dan ringkasan berdasarkan kelompok menggunakan array asosiatif yang indeksnya berasal dari nilai field.
Agregasi dengan Array dan Pengelompokan awk adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa Itu Array Asosiatif awk?
Dalam awk, array asosiatif adalah penyimpanan pasangan kunci-nilai, dengan kunci yang dapat berupa string atau angka apa pun. Berbeda dari array berindeks dalam kebanyakan bahasa, array awk pada dasarnya adalah peta hash—sempurna untuk mengelompokkan dan mengagregasikan data berdasarkan nilai field.
- Dideklarasikan secara implisit: cukup lakukan penetapan
arr[key] = value - Kunci secara bawaan berupa string (angka dikonversi)
- Tidak ada batas ukuran—awk memperbesar array sesuai kebutuhan
- Ideal untuk menghitung jumlah, banyaknya kemunculan, dan rekap per kelompok dalam satu lintasan
Anda tidak perlu menginisialisasi kunci sebelum menaikkan nilainya—awk otomatis memperlakukan kunci yang belum disetel sebagai nol atau string kosong.
Menghitung Baris per Kelompok
Pola agregasi yang paling umum adalah menghitung berapa kali setiap nilai unik dalam sebuah field muncul. Gunakan field $1 (atau field apa pun) sebagai kunci array, lalu naikkan penghitung pada setiap baris yang cocok.
Blok END dijalankan setelah semua input dikonsumsi—di situlah Anda mencetak hasil yang telah dikumpulkan.
count[$1]++Setelah pemrosesan selesai, count menyimpan jumlah total baris untuk setiap nilai unik dari $1.
#!/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]
}'
Menjumlahkan Field Numerik per Kelompok
Menghitung hanyalah salah satu bentuk agregasi. Untuk menjumlahkan field numerik yang dikelompokkan berdasarkan field lain, akumulasikan nilai numerik ke dalam array yang kuncinya berasal dari field kelompok.
Polanya adalah:
- Kunci = field pengelompokan (misalnya,
$1untuk nama pengguna) - Nilai = total berjalan dari field numerik (misalnya,
$2untuk byte)
Ini menghitung jumlah lengkap per kelompok dalam satu lintasan awk—tanpa memerlukan pengurutan atau prapemrosesan.
#!/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]
}'
Menggabungkan Hitungan dan Jumlah dalam Satu Lintasan
awk memungkinkan Anda mempertahankan beberapa array secara bersamaan, sehingga Anda memperoleh hitungan dan jumlah (dan karenanya rata-rata) untuk setiap kelompok dalam satu pemindaian file. Ini jauh lebih efisien daripada menjalankan pipeline dua kali.
count[key]++—melacak kemunculantotal[key] += $N—melacak jumlah berjalan- Dalam
END, bagitotal[k] / count[k]untuk mendapatkan rata-rata per kelompok
#!/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]
}'
Kunci Multi-Field untuk Pengelompokan 2 Dimensi
Anda dapat membuat kunci gabungan dengan menggabungkan beberapa field menggunakan pemisah. Dengan begitu, Anda memperoleh pengelompokan dua dimensi tanpa sintaks khusus.
Pilih pemisah yang tidak mungkin muncul dalam data (misalnya, SUBSEP, pemisah record bawaan awk \034, atau karakter pipa literal |).
- Kunci gabungan:
arr[$1 SUBSEP $2]atauarr[$1"|"$2] - Pecah kembali kunci saat mencetak:
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]
}
}'
Melacak Nilai Minimum dan Maksimum per Kelompok
Array asosiatif memudahkan pelacakan nilai min dan max per kelompok. Triknya adalah melakukan inisialisasi hanya pada kemunculan pertama setiap kunci menggunakan kondisi khusus !(key in arr).
!(key in min_arr)bernilai true saat pertama kali sebuah kunci ditemukan- Setelah inisialisasi, bandingkan dan timpa menggunakan pemeriksaan standar kurang-dari / lebih-dari
Pola ini menghindari nilai nol semu yang dapat merusak nilai minimum Anda.
#!/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]
}'
Distribusi Frekuensi—Kelompok Teratas-N
Tugas yang umum di dunia nyata adalah menemukan nilai yang paling sering muncul sejumlah N teratas. awk menangani penghitungan; teruskan melalui sort dan head untuk memberi peringkat dan mengambil sebagian hasil.
Pola pipeline ini merupakan praktik idiomatis dalam rekayasa shell:
- awk menghitung kemunculan ke dalam array, lalu mencetak
count keydalamEND sort -rnmengurutkan secara numerik dalam urutan menurunhead -n 5hanya mempertahankan 5 teratas
Membiarkan awk berfokus pada agregasi dan menyerahkan pengurutan kepada sort mengikuti filosofi Unix.
#!/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
Menggunakan NR dan FNR untuk Agregasi Banyak File
Saat memproses banyak file, NR (total record yang telah dibaca) dan FNR (record dalam file saat ini) yang merupakan bawaan awk memungkinkan Anda menandai dari file mana setiap record berasal menggunakan FILENAME.
FILENAME—nama file yang sedang dibacaFNR == 1—terpicu di awal setiap file baru (berguna untuk melewati header)
Dengan demikian, Anda dapat melakukan agregasi per file dan per kelompok di seluruh direktori berisi log dalam satu pemanggilan awk.
Mencetak Output Terurut dari Array awk
Perulangan for (key in array) dalam awk tidak menjamin urutan. Untuk output deterministik, teruskan hasil cetak END awk ke sort, atau kumpulkan nilai dan urutkan di dalam awk menggunakan fungsi asorti / asort (hanya GNU awk).
Pendekatan pipeline shell yang portabel biasanya lebih disukai untuk skrip lintas platform:
sort -k1,1—mengurutkan berdasarkan field pertama (kunci kelompok) secara alfabetissort -k2,2rn—mengurutkan berdasarkan field kedua (hitungan/jumlah) secara numerik menurun
#!/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
Menghapus Kunci Array dan Mengosongkan Status
Terkadang Anda perlu mengatur ulang status agregasi di tengah aliran—misalnya saat memproses file log yang setiap bagiannya dipisahkan oleh baris kosong atau nilai penanda.
delete arr[key]—menghapus satu entridelete arr—mengosongkan seluruh array (GNU awk)- Periksa keberadaan dengan
(key in arr)sebelum mengaksesnya untuk menghindari pembuatan entri bayangan
Teknik ini memungkinkan agregasi jendela geser atau per bagian tanpa memulai ulang awk.
#!/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
}'
Pipeline Dunia Nyata: Ringkasan Log Nginx
Menggabungkan semuanya—berikut agregasi satu lintasan awk siap produksi atas format log gabungan Nginx. Agregasi ini menghitung jumlah permintaan, total byte, dan tingkat kesalahan per host virtual dalam satu pemindaian.
Teknik utama yang digunakan:
- Kunci gabungan:
vhostyang diekstrak dari sebuah field - Array paralel:
reqs[],bytes[],errors[] - Akumulasi bersyarat:
$9 >= 400untuk menghitung hanya respons yang mengalami kesalahan - Tabel
printfberformat dalamEND
#!/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
}'
Pemeriksaan Pengetahuan: Menginisialisasi Min dengan Benar
Uji pemahaman Anda tentang kesalahan umum dalam agregasi awk.
Ringkasan Pelajaran: Agregasi dengan Array awk
Anda telah mempelajari pola inti untuk menghitung agregasi per kelompok sepenuhnya di dalam awk:
- Menghitung:
count[$key]++—naikkan pada setiap baris, cetak dalamEND - Menjumlahkan:
total[$key] += $N—akumulasikan field numerik per kelompok - Rata-rata: pertahankan
count[]dantotal[], lalu bagi dalamEND - Min/Max: isi pada kemunculan pertama menggunakan
!(key in arr), lalu bandingkan - Kunci gabungan: gabungkan field dengan pemisah untuk pengelompokan multidimensi
- Output terurut: teruskan hasil cetak
ENDawk kesortuntuk urutan yang deterministik - Pengaturan ulang bagian: gunakan
delete arruntuk mengosongkan status di antara bagian-bagian logis input
Pola-pola ini memungkinkan Anda menggantikan kueri basis data yang berat atau beberapa lintasan pipeline dengan satu pemanggilan awk yang efisien—keterampilan penting dalam rekayasa shell untuk produksi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Agregasi dengan Array dan Pengelompokan awk” gratis?
Ya — teks lengkap “Agregasi dengan Array dan Pengelompokan awk” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Agregasi dengan Array dan Pengelompokan awk”?
Hitung jumlah, banyaknya data, dan ringkasan berdasarkan kelompok menggunakan array asosiatif yang indeksnya berasal dari nilai field. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?
Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Agregasi dengan Array dan Pengelompokan awk” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?
Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Record, Field, dan Pemisah Kustom dalam awk
- Pola, Rentang, dan Blok BEGIN/END
- Agregasi dengan Array dan Pengelompokan awk
- Fungsi awk, Pemformatan printf, dan Pembuatan Laporan