Soal 1Apa yang dimasukkan n=$(grep -c error log.txt) ke variabel n?
Menggabungkan Perintah — Bercabang dari Hasil grep / awk
Artikel ini adalah bagian dari Kursus Linux yang membantumu menguasai keterampilan praktis Linux dari nol, mulai dari perintah dasar hingga shell script.
Di dalam skrip, simpan jumlahnya ke dalam variabel dengan n=$(grep -c ERROR access.log), ambil total dengan total=$(awk '{s+=$1} END{print s}'), lalu bercabang lewat if [ "$n" -ge 2 ] — skrip pemeriksa log yang dibangun dengan diagram dan terminal browser.
Memanggil perintah di dalam skrip — pipe dan substitusi perintah
Kekuatan sebenarnya dari shell script adalah kamu bisa menggabungkan perintah umum seperti `grep`, `awk`, `sed`, `sort`, dan `wc` di dalamnya.
Di dalam skrip pun kamu merangkai perintah dengan pipe |, lalu mengambil outputnya dengan substitusi perintah $(cmd).
Kalau kamu menulis n=$(grep -c error log.txt), jumlah baris yang cocok dari grep -c masuk ke variabel n.
Hasil agregasi juga bisa kamu masukkan ke variabel, seperti total=$(awk '{s+=$1} END{print s}' f).
Begitu hasil perintah ada di dalam variabel, kamu bisa memakai nilai itu untuk mengubah perilaku skrip.
printf 'INFO ok\nERROR disk\nINFO ok\nERROR cpu\n' > sys.log # buat bahannya
vi count.sh # buka di editor, tulis isi berikut, simpan dengan :wq
# #!/bin/sh
# n=$(grep -c ERROR sys.log)
# echo "ERROR count: $n"
chmod +x count.sh
./count.sh # ERROR count: 2
grep -c masuk ke variabel n, lalu if mencetak WARN kalau nilainya 2 atau lebih dan OK kalau tidak.| Sintaks | Arti | Contoh |
|---|---|---|
n=$(grep -c pat f) | Memasukkan jumlah baris yang cocok ke variabel n | n=$(grep -c error log.txt) |
$(cmd | cmd) | Mengambil hasil pipe ke dalam variabel | top=$(sort log.txt | head -1) |
if [ "$n" -ge 2 ]; then … | Bercabang berdasarkan apakah jumlahnya 2 atau lebih | if [ "$n" -ge 2 ]; then echo warn; fi |
Agregasi, lalu ubah perilaku dari hasilnya — awk dan percabangan
Bukan hanya jumlah, kamu juga bisa menjumlahkan angka lalu menilai dari totalnya.
total=$(awk '{s+=$1} END{print s}' f) menjumlahkan kolom 1 dari setiap baris dan memasukkan totalnya ke variabel total.
Kalau kamu ingin jumlah kemunculan per kata, urutkan dulu dengan sort f | uniq -c lalu hitung, dan ambil hasilnya dengan $(...).
Kalau kamu membandingkan total itu dengan ambang batas seperti if [ "$total" -gt 100 ]; then …, kamu bisa membuat keputusan semacam "beri peringatan begitu totalnya melewati batas".
Kalau kamu menyatukan agregasi dan percabangan ke dalam satu skrip, kamu punya alat praktis yang membaca data lalu menilai keadaannya.
printf '40\n30\n50\n' > sales.txt # data angka satu kolom
vi sum.sh # buka di editor, tulis isi berikut, simpan dengan :wq
# #!/bin/sh
# total=$(awk '{s+=$1} END{print s}' sales.txt)
# if [ "$total" -gt 100 ]; then
# echo "total $total: goal met"
# else
# echo "total $total: not met"
# fi
chmod +x sum.sh
./sum.sh # total 120: goal met
printf 'a\na\nb\n' > tags.txt # bahan dengan kata berulang
sort tags.txt | uniq -c # urutkan dulu, baru hitung
# output:
# 2 a
# 1 b
if membandingkan total hasil penjumlahan awk dengan ambang batas 20, bercabang ke perlu tindakan saat melebihi dan ke dalam batas saat tidak.| Sintaks | Arti | Contoh |
|---|---|---|
awk '{s+=$1} END{print s}' f | Menjumlahkan kolom 1 | awk '{s+=$1} END{print s}' nums.txt |
sort f | uniq -c | Mengurutkan dulu sebelum menghitung kemunculan | sort tags.txt | uniq -c |
if [ "$total" -gt N ]; then … | Bercabang dengan membandingkan total dengan ambang N | if [ "$total" -gt 100 ]; then … |
Mengalihkan output dan error — > dan 2>
Kadang kamu ingin hasil skrip tersimpan di file dan bukan tampil di layar.
./scan.sh > report.txt menuliskan output normal (standard output) ke report.txt.
Kalau kamu mengirim pesan error ke standard error dengan echo "..." 1>&2, maka ./scan.sh > report.txt 2> error.log bisa menyimpan hasil normal dan errornya di file terpisah.
vi job.sh # buka di editor, tulis isi berikut, simpan dengan :wq
# #!/bin/sh
# echo "processing started" # standard output
# echo "note: input was empty" 1>&2 # standard error
chmod +x job.sh
./job.sh > out.txt 2> err.txt # kirim output dan error ke file terpisah
cat out.txt # processing started
cat err.txt # note: input was empty
> report.txt dan standard error ke 2> error.log, dialihkan secara terpisah.| Sintaks | Arti | Contoh |
|---|---|---|
cmd > out | Menulis standard output ke file | ./scan.sh > report.txt |
echo "…" 1>&2 | Mengirim pesan ke standard error | echo "failed" 1>&2 |
cmd > out 2> err | Mengalihkan output dan error ke file terpisah | ./scan.sh > report.txt 2> error.log |
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Apa yang dilakukan if [ "$n" -ge 2 ]; then …?
Soal 3Pada ./scan.sh > report.txt 2> error.log, apa yang dialihkan oleh 2>?