Fungsi awk, Pemformatan printf, dan Pembuatan Laporan
Definisikan fungsi buatan pengguna dan gunakan printf untuk menghasilkan laporan berbentuk tabel yang rapi dari aliran data mentah.
Fungsi awk, Pemformatan printf, dan Pembuatan Laporan adalah pelajaran Linux Command Line & Bash Scripting Mastery gratis di CoddyKit. Ini adalah pelajaran 4 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 Linux Command Line & Bash Scripting Mastery, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Linux Command Line & Bash Scripting Mastery mencakup 4 pelajaran total.
Mengapa Fungsi dan printf Penting dalam awk
Saat program awk Anda berkembang dari baris tunggal menjadi pipeline bertahap, dua fitur menjadi penting: fungsi yang ditentukan pengguna dan pemformatan printf.
Fungsi memungkinkan Anda merangkum logika yang dapat digunakan kembali—penghitung persentase, pemangkas string, konverter satuan—sehingga Anda menulisnya sekali dan memanggilnya di mana saja dalam program yang sama. printf memungkinkan Anda mengontrol secara tepat tampilan output: lebar kolom, jumlah angka desimal, pengisi, dan perataan.
Jika digabungkan, keduanya mengubah baris log mentah menjadi laporan yang rapi dan mudah dibaca, yang dapat ditindaklanjuti oleh para teknisi dan manajer.
- Fungsi mengurangi duplikasi dan membuat program dapat diuji secara terpisah.
printfmeratakan data ke dalam kolom dengan lebar tetap agar laporan tetap mudah dibaca meskipun panjang input bervariasi.- Kedua fitur ini berfungsi dalam POSIX awk, gawk, dan mawk—tanpa memerlukan ekstensi.
Mendefinisikan Fungsi Pengguna dalam awk
Fungsi pengguna dideklarasikan dengan kata kunci function, sebelum atau sesudah aturan pola-tindakan apa pun. Sintaksnya adalah:
function name(param1, param2, local1, local2) {
# body
return value
}Idiom awk yang penting: variabel lokal hanyalah parameter tambahan dengan spasi ekstra sebelumnya. Tidak ada kata kunci local—konvensi spasi tambahan menandakan bahwa parameter tersebut adalah variabel lokal, bukan argumen yang diberikan oleh pemanggil.
- Semua variabel yang tidak dideklarasikan sebagai parameter secara bawaan bersifat global.
- Fungsi dapat memanggil dirinya sendiri secara rekursif.
returnbersifat opsional; tanpa itu, fungsi mengembalikan string kosong.
#!/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)
}
'Fungsi dengan Logika String
Fungsi sangat berguna untuk operasi string yang dilakukan berulang kali. Pertimbangkan pemangkasan spasi di awal dan akhir—sesuatu yang sering diperlukan data log mentah sebelum perbandingan atau pelaporan.
Contoh di bawah mendefinisikan trim(s) menggunakan gsub dan menggunakannya pada setiap record, sehingga aturan utama tetap bersih dan mudah dibaca.
gsub(regex, replacement, target)mengubah target secara langsung dan mengembalikan jumlah substitusi.- Menempatkan logika regex di dalam fungsi membuat blok aturan tetap berfokus pada logika bisnis.
- Anda dapat melakukan pengujian unit dengan meneruskan string buatan tangan secara langsung dalam blok
BEGIN.
#!/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
}
'Pengenalan printf dalam awk
printf dalam awk mengikuti konvensi yang sama seperti printf bawaan C dan Bash, yaitu printf. Perbedaan utamanya dari print adalah printf tidak pernah menambahkan baris baru secara otomatis—Anda harus menambahkan \n sendiri.
Penentu format yang umum:
%s—string%d—bilangan bulat%f—bilangan pecahan%e—notasi ilmiah%g—versi yang lebih singkat dari%f/%e
Lebar dan presisi dikendalikan dengan menempatkan angka di antara % dan penentu: %-20s meratakan ke kiri dalam field 20 karakter; %8.2f menghasilkan bilangan pecahan selebar 8 karakter dengan 2 angka desimal.
#!/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
}
'Membuat Header Laporan dengan printf
Laporan yang rapi memerlukan baris header dan garis pemisah. Blok BEGIN adalah tempat yang tepat untuk menghasilkan keduanya—blok ini dijalankan sekali sebelum input apa pun diproses.
Triknya adalah menyamakan lebar header secara tepat dengan lebar yang digunakan pada baris data. Mendefinisikan konstanta lebar dalam BEGIN (atau dalam fungsi) menjaga semuanya tetap selaras saat Anda nantinya menyesuaikan lebar kolom.
- Gunakan
printfdengan string pemisah berupa tanda hubung untuk menggambar garis pembatas. - Selalu akhiri baris header dengan
\n. - Gabungkan header
BEGIN, baris per record, dan footerENDuntuk struktur laporan yang lengkap.
#!/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
}
'Fungsi Pengguna untuk Logika Pemformatan
Setelah Anda membuat laporan dengan banyak kolom, Anda biasanya memerlukan pemanggilan pemformatan yang sama di beberapa tempat—misalnya, untuk menampilkan bilah persentase atau mengonversi byte menjadi satuan yang mudah dibaca manusia. Menempatkannya di dalam fungsi menghindari duplikasi dan memudahkan perubahan format secara menyeluruh.
Fungsi di bawah mengonversi byte menjadi KB, MB, atau GB dan mengembalikan string yang telah diformat. Aturan pemanggil cukup meneruskan $NF (field terakhir) dan mencetak apa pun yang dikembalikan.
#!/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) }
'Mengakumulasi Data dalam Larik Sebelum Mencetak
Laporan nyata sering memerlukan total, rata-rata, atau peringkat—nilai yang tidak dapat Anda hitung sebelum melihat seluruh masukan. Polanya adalah:
- Akumulasikan data ke dalam larik asosiatif selama tahap pemrosesan per rekaman.
- Hitung nilai turunan (rata-rata, persentase) dalam
END. - Keluarkan hasil yang telah diformat hanya dari
END, sehingga lebar dapat menyesuaikan seluruh kumpulan data.
Pola keluaran tertunda ini merupakan salah satu idiom paling ampuh dalam pembuatan laporan awk. Contoh berikut menghitung jumlah permintaan dan byte respons untuk setiap kode status HTTP dari log akses.
#!/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]
}
'Fungsi Rekursif dalam awk
awk mendukung rekursi. Salah satu penggunaan klasiknya adalah menghitung faktorial atau menghasilkan string berulang (seperti baris tanda hubung dengan panjang yang sesuai lebar terminal). Rekursi lebih jarang digunakan dalam awk daripada dalam bahasa serbaguna, tetapi berfungsi dengan benar dan tersedia dalam semua implementasi utama.
Contoh berikut mendefinisikan fungsi rekursif repeat(s, n) dan menggunakannya untuk menggambar garis pemisah yang secara otomatis sesuai dengan lebar baris data terlebar—tanpa memerlukan tanda hubung yang dikodekan secara tetap.
- Hindari rekursi yang terlalu dalam pada masukan berukuran besar—awk tidak memiliki optimisasi pemanggilan ekor.
- Untuk pengulangan sederhana,
sprintf("%*s", n, "")dengangsub(/ /, "-")lebih cepat, tetapi kurang memperjelas konsep.
#!/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/nullprintf ke Berkas atau Alur Pemrosesan di Dalam awk
printf (dan print) milik awk dapat mengalihkan keluaran ke berkas atau menyalurkannya ke perintah shell—langsung dari dalam program awk, tanpa membungkus semuanya dalam subshell.
printf "..." > "file.txt"— menulis ke berkas (memotong isinya sekali, lalu menambahkan data selama proses yang sama).printf "..." >> "file.txt"— menambahkan data ke berkas.printf "..." | "sort -rn"— menyalurkan data ke perintah shell; awk mempertahankan alur pemrosesan tetap terbuka di antara rekaman dan menutupnya saat program berakhir.
Pola yang umum adalah membagi satu kali pembacaan log menjadi beberapa berkas keluaran per status atau per host, sehingga tidak perlu membaca ulang berkas besar berkali-kali.
#!/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"Membuat Laporan CSV dengan awk
Tidak semua laporan ditujukan untuk manusia. Terkadang keluaran harus berupa CSV yang dapat dibaca mesin untuk digunakan oleh lembar kerja atau alur pemrosesan lanjutan. printf milik awk menangani hal ini dengan rapi: tetapkan OFS sebagai koma, atau kendalikan setiap pembatas secara eksplisit.
Dua aturan penting untuk CSV yang andal dari awk:
- Bungkus bidang yang mungkin berisi koma atau baris baru dalam tanda kutip ganda.
- Lepaskan tanda kutip ganda literal di dalam bidang dengan menggandakannya:
He said ""hello"".
Fungsi csv_field(s) di bawah merangkum logika pemberian tanda kutip ini agar dapat diterapkan secara konsisten pada setiap bidang string.
#!/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
}
'Dari Awal hingga Akhir: Laporan Log Akses Lengkap
Contoh terakhir ini menggabungkan semuanya: fungsi pengguna, pemformatan printf, akumulasi larik, serta header/footer terstruktur. Masukannya adalah log akses web sederhana; keluarannya adalah tabel ringkasan yang mudah dibaca manusia, dengan total per metode dan baris total keseluruhan.
Teknik utama yang digunakan:
count[method]++danbytes[method] += sizemengakumulasikan statistik per metode dalam satu kali pembacaan.human_bytes()(dari bagian sebelumnya) mengonversi total byte.printfdengan lebar yang sama pada header, data, dan footer memastikan tabel tetap sejajar terlepas dari ukuran masukan.- Blok
ENDmelakukan iterasi pada larik denganfor (k in arr)dan menghasilkan keluaran terurut melalui alur pemrosesan kesort.
#!/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)
}
'Uji Pemahaman: Variabel Lokal dalam Fungsi awk
Manakah dari pilihan berikut yang mendeklarasikan result dengan benar sebagai variabel lokal di dalam fungsi awk, mengikuti konvensi POSIX?
Ringkasan Pelajaran: Fungsi awk, printf, dan Pembuatan Laporan
Dalam pelajaran ini Anda mempelajari cara menulis program awk berkualitas produksi yang menghasilkan laporan terformat dari aliran data mentah. Berikut hal-hal penting yang perlu Anda ingat:
- Fungsi pengguna dideklarasikan dengan
function name(params, locals). Spasi tambahan sebelum parameter variabel lokal merupakan konvensi POSIX—tidak ada kata kuncilocal. - printf memberikan kendali yang presisi atas keluaran: lebar (
%10s), perataan (%-10s), dan presisi (%8.2f). Ingatlah untuk menambahkan\nsecara eksplisit. - Gunakan BEGIN untuk menghasilkan header dan pemisah, aturan per rekaman untuk mengakumulasikan data, dan END untuk menghitung total serta mencetak laporan yang telah selesai.
- Alihkan keluaran
printfke berkas (> file) atau alur pemrosesan (| "sort") dari dalam awk untuk membagi laporan atau memproses keluaran lebih lanjut. - Bungkus bidang string dalam pembantu csv_field() saat menghasilkan CSV agar koma dan tanda kutip yang terdapat di dalamnya ditangani dengan aman.
- Fungsi yang mengonversi satuan (
human_bytes), mengulang karakter (repeat), atau membersihkan string (trim,csv_field) layak disimpan dalam pustaka awk pribadi—fungsi-fungsi tersebut dapat dikomposisikan dengan rapi di berbagai proyek.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Fungsi awk, Pemformatan printf, dan Pembuatan Laporan” gratis?
Ya — teks lengkap “Fungsi awk, Pemformatan printf, dan Pembuatan Laporan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Linux Command Line & Bash Scripting Mastery, upgrade ke CoddyKit PRO. Kursus Linux Command Line & Bash Scripting Mastery mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Fungsi awk, Pemformatan printf, dan Pembuatan Laporan”?
Definisikan fungsi buatan pengguna dan gunakan printf untuk menghasilkan laporan berbentuk tabel yang rapi dari aliran data mentah. Kamu berlatih Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery?
Tidak diperlukan pengalaman sebelumnya. Linux Command Line & Bash Scripting Mastery 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 4 dari 4.
Berapa lama pelajaran “Fungsi awk, Pemformatan printf, dan Pembuatan Laporan” 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 Linux Command Line & Bash Scripting Mastery ini?
Ya. Setiap pelajaran Linux Command Line & Bash Scripting Mastery 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