Belajar dengan membaca secara berurutan

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
Menyimpan jumlah ke dalam variabel lalu bercabang
n=$(grep -c ERROR access.log)n ≥ 2cetak WARNn < 2cetak OK2 atau lebih1 atau kurangperingatannormal
Jumlah hasil grep -c masuk ke variabel n, lalu if mencetak WARN kalau nilainya 2 atau lebih dan OK kalau tidak.
SintaksArtiContoh
n=$(grep -c pat f)Memasukkan jumlah baris yang cocok ke variabel nn=$(grep -c error log.txt)
$(cmd | cmd)Mengambil hasil pipe ke dalam variabeltop=$(sort log.txt | head -1)
if [ "$n" -ge 2 ]; then …Bercabang berdasarkan apakah jumlahnya 2 atau lebihif [ "$n" -ge 2 ]; then echo warn; fi

Buat skrip pemeriksa yang menghitung data bergaya access log dengan grep -c, lalu menampilkan peringatan kalau errornya 2 atau lebih dan normal kalau tidak.

① Jalankan printf 'INFO login\nERROR timeout\nINFO logout\nERROR 500\nINFO ping\n' > access.log untuk membuat file bahannya.

② Buka scan.sh dengan vi scan.sh, tekan i untuk masuk mode insert. Simpan jumlahnya ke dalam variabel dengan n=$(grep -c ERROR access.log), lalu tampilkan WARN: $n errors found atau OK memakai if [ "$n" -ge 2 ]; then … else … fi (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

③ Tambahkan izin eksekusi dengan chmod +x scan.sh, jalankan ./scan.sh, dan pastikan peringatannya keluar.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

(Kalau kamu menjalankannya dengan benar, penjelasannya akan muncul)

Linux console
0 / 3 selesai
Loading Linux Terminal...

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
Menjumlahkan total lalu bercabang dari nilainya
total=$(awk … errors.txt)total > 20perlu tindakantotal ≤ 20dalam batasmelebihimasih di dalam ambangmelewati ambangdalam ambang
if membandingkan total hasil penjumlahan awk dengan ambang batas 20, bercabang ke perlu tindakan saat melebihi dan ke dalam batas saat tidak.
SintaksArtiContoh
awk '{s+=$1} END{print s}' fMenjumlahkan kolom 1awk '{s+=$1} END{print s}' nums.txt
sort f | uniq -cMengurutkan dulu sebelum menghitung kemunculansort tags.txt | uniq -c
if [ "$total" -gt N ]; then …Bercabang dengan membandingkan total dengan ambang Nif [ "$total" -gt 100 ]; then …

Buat skrip yang menjumlahkan data angka dengan awk lalu mengubah hasilnya tergantung apakah totalnya melewati ambang batas.

① Jalankan printf '12\n8\n5\n3\n' > errors.txt untuk membuat data angka satu kolom.

② Buka sum.sh dengan vi sum.sh, tekan i untuk masuk mode insert. Simpan totalnya ke dalam variabel dengan total=$(awk '{s+=$1} END{print s}' errors.txt), lalu tampilkan needs action: total $total atau within limit: total $total memakai if [ "$total" -gt 20 ]; then … else … fi (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

③ Tambahkan izin eksekusi dengan chmod +x sum.sh, jalankan ./sum.sh, dan pastikan hasilnya bercabang mengikuti total.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

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
Mengalihkan output dan error
./scan.shoutput echo (stdout)> report.txt./scan.shecho … 1>&2 (stderr)2> error.logstandard outputstandard error
Standard output pergi ke > report.txt dan standard error ke 2> error.log, dialihkan secara terpisah.
SintaksArtiContoh
cmd > outMenulis standard output ke file./scan.sh > report.txt
echo "…" 1>&2Mengirim pesan ke standard errorecho "failed" 1>&2
cmd > out 2> errMengalihkan output dan error ke file terpisah./scan.sh > report.txt 2> error.log

Buat skrip yang mengalihkan pesan normal dan pesan error ke file yang berbeda.

① Buka job.sh dengan vi job.sh, tekan i untuk masuk mode insert. Kirim echo "done" ke standard output dan echo "warning" 1>&2 ke standard error (tulis #!/bin/sh pada baris pertama). Setelah selesai, simpan dengan Esc:wq.

② Tambahkan izin eksekusi dengan chmod +x job.sh, lalu pisahkan output dan error ke file berbeda dengan ./job.sh > out.txt 2> err.txt.

③ Jalankan cat out.txt dan cat err.txt, dan pastikan pesan normal dan pesan error masing-masing masuk ke filenya sendiri.

④ Jika kamu ragu apa yang harus ditulis, kamu bisa menyalin isi dari panel jawaban dan menempelkannya ke mode insert vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Apa yang dimasukkan n=$(grep -c error log.txt) ke variabel n?

Soal 2Apa yang dilakukan if [ "$n" -ge 2 ]; then …?

Soal 3Pada ./scan.sh > report.txt 2> error.log, apa yang dialihkan oleh 2>?