Soal 1Sintaks mana yang memakai default access.log saat argumen pertama tidak dioper?
Laporan Agregasi Log — Menggabungkan Argumen, Fungsi, dan Perintah
Artikel ini adalah bagian dari Kursus Linux yang membantumu menguasai keterampilan praktis Linux dari nol, mulai dari perintah dasar hingga shell script.
Terima log target dengan log=${1:-access.log}, agregasikan dengan perulangan for plus grep -c dan awk '{sum+=$1}', lalu bungkus semuanya jadi laporan here-doc dan exit code — dijelaskan dengan diagram dan dipraktikkan di terminal browser.
Menyatukan semua bagian ke satu skrip — kerangka laporan agregasi log
Semua yang sudah kamu pelajari sejauh ini — variabel, parameter posisi ($1), percabangan ([ ] dan if), perulangan (for / while), fungsi (name() { } dan local), membaca input (while read … done < file), integrasi perintah ($(...)), dan output (>> dan here-doc) — kini menyatu dalam satu skrip praktis.
Temanya adalah yang paling sering muncul di operasional: laporan agregasi log.
Skrip praktis menerima log target dan ambang batas lewat argumen, memeriksa inputnya, mengagregasi, menyatukan hasilnya jadi laporan, dan ditutup dengan mengembalikan exit code.
Untuk agregasinya, bekerjalah dengan perintah seperti grep untuk jumlah, awk untuk total, dan sed untuk merapikan; menarik pekerjaan berulang ke dalam fungsi dan perulangan membuatnya tetap enak dibaca.
Saat parameter posisinya kosong, isi dengan nilai default ${1:-access.log}.
vi mini.sh # buka di editor, tulis isi berikut, simpan dengan :wq
# #!/bin/sh
# log=${1:-access.log} # default saat argumennya tidak diberikan
# count_status() { # fungsi yang mengembalikan jumlah per status code
# grep -c " $1\$" "$log"
# }
# if [ ! -f "$log" ]; then # cek input
# echo "not found: $log" >&2
# exit 1
# fi
# for s in 200 403 500; do # agregasi per status code
# echo "$s : $(count_status $s)"
# done
# exit 0
chmod +x mini.sh
| Elemen | Kegunaannya di skrip ini | Contoh |
|---|---|---|
Variabel name=... | Menyimpan nama log, tujuan output, dan ambang batas di satu tempat | log=${1:-access.log} |
Argumen $1 / ${1:-default} | Menerima log target dan ambang batas dari command line | limit=${2:-1} |
Kondisi [ -f f ] / if | Memastikan lognya ada dan menilai apakah ambangnya terlewati | if [ ! -f "$log" ]; then exit 1; fi |
Perulangan for / while read | Agregasi per status code dan membaca baris demi baris | for s in 200 403 500; do … done |
Fungsi name() { … } | Mengelompokkan agregasi di bawah satu nama lalu memakainya ulang | count_status() { grep -c " $1\$" "$log"; } |
Membaca input while read … < f | Membaca log baris demi baris dan menghitung per URL | while read line; do … done < "$log" |
Integrasi $(grep -c …) / awk | Mengambil jumlah dan total dengan substitusi perintah | n=$(grep -c ' 500$' "$log") |
Output >> / here-doc | Menuliskan nilai agregasi sebagai laporan berformat tetap | cat > "$out" <<REPORT … REPORT |
Baca inputnya lalu selesaikan dengan integrasi perintah — while read plus grep / awk / sed
Pemrosesan rinci baris demi baris kamu lakukan dengan while read line; do … done < file.
Kalau kamu menggabungkan itu di dalam satu fungsi dengan grep untuk menyaring tiap baris, awk untuk mengagregasi kolom, dan sed untuk menyeragamkan penulisannya, kamu bisa memakai ulang logika agregasinya sebagai komponen.
Kalau kamu menyelipkan langkah merapikan seperti sed 's/^GET /[GET] /', tata letak laporannya tetap konsisten.
Untuk menutupnya, sisipkan nilai agregasi ke laporan berformat tetap dengan here-doc, tambahkan peringatan lalu kembalikan exit 1 saat ambangnya terlewati, atau kembalikan exit 0 saat semuanya baik-baik saja.
Kalau kamu menerima argumen kedua sebagai ambang batas dengan ${2:-100} lalu membandingkan angkanya seperti if [ "$err" -gt "$limit" ], kamu mendapat laporan yang sekaligus memberi penilaian dan bisa kamu pakai di operasional.
Puncaknya adalah bekerja dengan `grep` / `awk` / `sed` yang kamu pelajari di dasar, di dalam struktur kontrol sebuah shell script.
vi scan.sh # buka di editor, tulis isi berikut, simpan dengan :wq
# #!/bin/sh
# log=${1:-access.log}
# limit=${2:-1}
# err=$(grep -c ' 500$' "$log") # ambil jumlah 500 lewat integrasi
# while read line; do # baca baris demi baris
# echo "$line" | sed 's/^/log: /' # rapikan lalu cetak
# done < "$log"
# if [ "$err" -gt "$limit" ]; then # nilai terhadap ambang batas
# echo "WARN: too many 500"; exit 1
# fi
# exit 0
chmod +x scan.sh
while read mengambil barisnya satu per satu, dan bekerja bersama grep / awk / sed mengubahnya menjadi laporan yang sekaligus memberi penilaian.Lulus atau gagal lewat argumen ambang batas — agregasi dan exit code menyatu
Kalau kamu menyatukan penerimaan argumen dan agregasi di bagian awal dengan penilaian dan exit code di bagian akhir menjadi satu skrip, kamu mendapat laporan dengan penilaian lulus-gagal yang bisa kamu pakai di operasional.
Terima ambang batasnya dari argumen pertama; saat jumlah yang diagregasi grep -c atau awk mencapai atau melewatinya, beri peringatan lalu kembalikan exit 1, dan saat masih di bawahnya, anggap normal lalu kembalikan exit 0.
Pemanggilnya bisa menilai berhasil atau gagal dari exit code itu.
Pada perbandingan angka, -gt berarti "lebih besar dari" dan -ge berarti "lebih besar atau sama dengan", yang mengubah perlakuan terhadap nilai yang persis sama dengan ambangnya.
[ "$err" -gt "$limit" ] di Latihan 2 tidak terpenuhi saat jumlahnya sama dengan ambangnya, sedangkan [ "$err" -ge "$limit" ] di Latihan 3 tetap memberi peringatan meski nilainya sama.
Perbedaan inilah yang menentukan hasil tepat di nilai ambangnya, jadi pilih yang cocok dengan keperluanmu.
-ge membandingkan jumlah hasil agregasi dengan ambang batasnya: mencapai atau melewatinya berarti peringatan dan exit 1, di bawahnya berarti normal dan exit 0.Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Sintaks mana yang membaca file baris demi baris lalu memprosesnya?
Soal 3Bagaimana kamu memberi tahu pemanggilnya bahwa ada yang salah saat ambang batasnya terlewati?