Jawaban soal praktikum Sistem Operasi modul 1.
Anggota kelompok:
- Richard Asmarakandi - 05111940000017
- Muhammad Rafki Mardi - 0511194000054
- Husin Muhammad Assegaff - 05111940000127
Deskripsi:
Membuat laporan aplikasi ticky dengan harus melakukan beberapa hal berikut,
Deskripsi:
Mengumpulkan informasi jenis log (ERROR/INFO), pesan log, dan username dari log aplikasi pada file syslog.log
.
Pembahasan:
grep -oP "(INFO.*)|(ERROR.*)" syslog.log
- Menggunakan
grep -oP
untuk mencari pola karakter yang diinginkan - Pada
(INFO.*)|(ERROR.*)
bermakna bahwa mencari baris yang terdapat kata "INFO" atau "ERROR" dan ditampilkan karakternya mulai dari "INFO" atau "ERROR" sampai akhir baris masing-masing. - Untuk
syslog.log
merupakan file yang digunakan untuk mengeksekusi perintah yang diinginkan. Sehingga hasilnya sebagai berikut:
Jan 31 00:09:39 ubuntu.local ticky: INFO Created ticket [#4217] (mdouglas)
Jan 31 00:16:25 ubuntu.local ticky: INFO Closed ticket [#1754] (noel)
Jan 31 00:21:30 ubuntu.local ticky: ERROR The ticket was modified while updating (breee)
Jan 31 00:44:34 ubuntu.local ticky: ERROR Permission denied while closing ticket (ac)
Jan 31 01:00:50 ubuntu.local ticky: INFO Commented on ticket [#4709] (blossom)
Jan 31 01:29:16 ubuntu.local ticky: INFO Commented on ticket [#6518] (rr.robinson)
Jan 31 01:33:12 ubuntu.local ticky: ERROR Tried to add information to closed ticket (mcintosh)
Jan 31 01:43:10 ubuntu.local ticky: ERROR Tried to add information to closed ticket (jackowens)
Jan 31 01:49:29 ubuntu.local ticky: ERROR Tried to add information to closed ticket (mdouglas)
Jan 31 02:30:04 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 02:55:31 ubuntu.local ticky: ERROR Ticket doesn't exist (xlg)
Jan 31 03:05:35 ubuntu.local ticky: ERROR Timeout while retrieving information (ahmed.miller)
Jan 31 03:08:55 ubuntu.local ticky: ERROR Ticket doesn't exist (blossom)
Jan 31 03:39:27 ubuntu.local ticky: ERROR The ticket was modified while updating (bpacheco)
Jan 31 03:47:24 ubuntu.local ticky: ERROR Ticket doesn't exist (enim.non)
Jan 31 04:30:04 ubuntu.local ticky: ERROR Permission denied while closing ticket (rr.robinson)
Jan 31 04:31:49 ubuntu.local ticky: ERROR Tried to add information to closed ticket (oren)
Jan 31 04:32:49 ubuntu.local ticky: ERROR Timeout while retrieving information (mcintosh)
Jan 31 04:44:23 ubuntu.local ticky: ERROR Timeout while retrieving information (ahmed.miller)
Jan 31 04:44:46 ubuntu.local ticky: ERROR Connection to DB failed (jackowens)
Jan 31 04:49:28 ubuntu.local ticky: ERROR Permission denied while closing ticket (flavia)
Jan 31 05:12:39 ubuntu.local ticky: ERROR Tried to add information to closed ticket (oren)
Jan 31 05:18:45 ubuntu.local ticky: ERROR Tried to add information to closed ticket (sri)
Jan 31 05:23:14 ubuntu.local ticky: INFO Commented on ticket [#1097] (breee)
Jan 31 05:35:00 ubuntu.local ticky: ERROR Connection to DB failed (nonummy)
Jan 31 05:45:30 ubuntu.local ticky: INFO Created ticket [#7115] (noel)
Jan 31 05:51:30 ubuntu.local ticky: ERROR The ticket was modified while updating (flavia)
Jan 31 05:57:46 ubuntu.local ticky: INFO Commented on ticket [#2253] (nonummy)
Jan 31 06:12:02 ubuntu.local ticky: ERROR Connection to DB failed (oren)
Jan 31 06:26:38 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 06:32:26 ubuntu.local ticky: INFO Created ticket [#7298] (ahmed.miller)
Jan 31 06:36:25 ubuntu.local ticky: ERROR Timeout while retrieving information (flavia)
Jan 31 06:57:00 ubuntu.local ticky: ERROR Connection to DB failed (jackowens)
Jan 31 06:59:57 ubuntu.local ticky: INFO Commented on ticket [#7255] (oren)
Jan 31 07:59:56 ubuntu.local ticky: ERROR Ticket doesn't exist (flavia)
Jan 31 08:01:40 ubuntu.local ticky: ERROR Tried to add information to closed ticket (jackowens)
Jan 31 08:03:19 ubuntu.local ticky: INFO Closed ticket [#1712] (britanni)
Jan 31 08:22:37 ubuntu.local ticky: INFO Created ticket [#2860] (mcintosh)
Jan 31 08:28:07 ubuntu.local ticky: ERROR Timeout while retrieving information (montanap)
Jan 31 08:49:15 ubuntu.local ticky: ERROR Permission denied while closing ticket (britanni)
Jan 31 08:50:50 ubuntu.local ticky: ERROR Permission denied while closing ticket (montanap)
Jan 31 09:04:27 ubuntu.local ticky: ERROR Tried to add information to closed ticket (noel)
Jan 31 09:15:41 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 09:18:47 ubuntu.local ticky: INFO Commented on ticket [#8385] (mdouglas)
Jan 31 09:28:18 ubuntu.local ticky: INFO Closed ticket [#2452] (jackowens)
Jan 31 09:41:16 ubuntu.local ticky: ERROR Connection to DB failed (ac)
Jan 31 10:11:35 ubuntu.local ticky: ERROR Timeout while retrieving information (blossom)
Jan 31 10:21:36 ubuntu.local ticky: ERROR Permission denied while closing ticket (montanap)
Jan 31 11:04:02 ubuntu.local ticky: ERROR Tried to add information to closed ticket (breee)
Jan 31 11:19:37 ubuntu.local ticky: ERROR Connection to DB failed (sri)
Jan 31 11:22:06 ubuntu.local ticky: ERROR Timeout while retrieving information (montanap)
Jan 31 11:31:34 ubuntu.local ticky: ERROR Permission denied while closing ticket (ahmed.miller)
Jan 31 11:40:25 ubuntu.local ticky: ERROR Connection to DB failed (mai.hendrix)
Jan 31 11:47:07 ubuntu.local ticky: INFO Commented on ticket [#4562] (ac)
Jan 31 11:58:33 ubuntu.local ticky: ERROR Tried to add information to closed ticket (ahmed.miller)
Jan 31 12:00:17 ubuntu.local ticky: INFO Created ticket [#7897] (kirknixon)
Jan 31 12:02:49 ubuntu.local ticky: ERROR Permission denied while closing ticket (mai.hendrix)
Jan 31 12:20:23 ubuntu.local ticky: ERROR Connection to DB failed (kirknixon)
Jan 31 12:20:40 ubuntu.local ticky: ERROR Ticket doesn't exist (flavia)
Jan 31 12:24:32 ubuntu.local ticky: INFO Created ticket [#5784] (sri)
Jan 31 12:50:10 ubuntu.local ticky: ERROR Permission denied while closing ticket (blossom)
Jan 31 12:58:16 ubuntu.local ticky: ERROR Tried to add information to closed ticket (nonummy)
Jan 31 13:08:10 ubuntu.local ticky: INFO Closed ticket [#8685] (rr.robinson)
Jan 31 13:48:45 ubuntu.local ticky: ERROR The ticket was modified while updating (breee)
Jan 31 14:13:00 ubuntu.local ticky: INFO Commented on ticket [#4225] (noel)
Jan 31 14:38:50 ubuntu.local ticky: ERROR The ticket was modified while updating (enim.non)
Jan 31 14:41:18 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 14:45:55 ubuntu.local ticky: INFO Closed ticket [#7948] (noel)
Jan 31 14:50:41 ubuntu.local ticky: INFO Commented on ticket [#8628] (noel)
Jan 31 14:56:35 ubuntu.local ticky: ERROR Tried to add information to closed ticket (noel)
Jan 31 15:27:53 ubuntu.local ticky: ERROR Ticket doesn't exist (blossom)
Jan 31 15:28:15 ubuntu.local ticky: ERROR Permission denied while closing ticket (enim.non)
Jan 31 15:44:25 ubuntu.local ticky: INFO Closed ticket [#7333] (enim.non)
Jan 31 16:17:20 ubuntu.local ticky: INFO Commented on ticket [#1653] (noel)
Jan 31 16:19:40 ubuntu.local ticky: ERROR The ticket was modified while updating (mdouglas)
Jan 31 16:24:31 ubuntu.local ticky: INFO Created ticket [#5455] (ac)
Jan 31 16:35:46 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 16:53:54 ubuntu.local ticky: INFO Commented on ticket [#3813] (mcintosh)
Jan 31 16:54:18 ubuntu.local ticky: ERROR Connection to DB failed (bpacheco)
Jan 31 17:15:47 ubuntu.local ticky: ERROR The ticket was modified while updating (mcintosh)
Jan 31 17:29:11 ubuntu.local ticky: ERROR Connection to DB failed (oren)
Jan 31 17:51:52 ubuntu.local ticky: INFO Closed ticket [#8604] (mcintosh)
Jan 31 18:09:17 ubuntu.local ticky: ERROR The ticket was modified while updating (noel)
Jan 31 18:43:01 ubuntu.local ticky: ERROR Ticket doesn't exist (nonummy)
Jan 31 19:00:23 ubuntu.local ticky: ERROR Timeout while retrieving information (blossom)
Jan 31 19:20:22 ubuntu.local ticky: ERROR Timeout while retrieving information (mai.hendrix)
Jan 31 19:59:06 ubuntu.local ticky: INFO Created ticket [#6361] (enim.non)
Jan 31 20:02:41 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 20:21:55 ubuntu.local ticky: INFO Commented on ticket [#7159] (ahmed.miller)
Jan 31 20:28:26 ubuntu.local ticky: ERROR Connection to DB failed (breee)
Jan 31 20:35:17 ubuntu.local ticky: INFO Created ticket [#7737] (nonummy)
Jan 31 20:48:02 ubuntu.local ticky: ERROR Connection to DB failed (mdouglas)
Jan 31 20:56:58 ubuntu.local ticky: INFO Closed ticket [#4372] (oren)
Jan 31 21:00:23 ubuntu.local ticky: INFO Commented on ticket [#2389] (sri)
Jan 31 21:02:06 ubuntu.local ticky: ERROR Connection to DB failed (breee)
Jan 31 21:20:33 ubuntu.local ticky: INFO Closed ticket [#3297] (kirknixon)
Jan 31 21:29:24 ubuntu.local ticky: ERROR The ticket was modified while updating (blossom)
Jan 31 22:58:55 ubuntu.local ticky: INFO Created ticket [#2461] (jackowens)
Jan 31 23:25:18 ubuntu.local ticky: INFO Closed ticket [#9876] (blossom)
Jan 31 23:35:40 ubuntu.local ticky: INFO Created ticket [#5896] (mcintosh)
Kendala :
Kendala awal (secara umum) masih belum paham regex beserta penggunaan grep. Sehingga harus mencari dan mempelajari dokumentasinya, karena di modul tidak ada.
Deskripsi:
Menampilkan semua pesan berjenis 'ERROR' beserta jumlah kemunculannya
Pembahasan:
grep -oP '(?<=ERROR).*(?=\ \()' syslog.log | sort | uniq -c | cut -b 6-99 | sort -nr | cut -b 1-2 > temps1b1.txt
grep -oP '(?<=ERROR).*(?=\ \()' syslog.log | sort | uniq -c | cut -b 6-99 | sort -nr | cut -b 4-99 > temps1b2.txt
paste -d '\t\t' temps1b2.txt temps1b1.txt
- Menggunakan
grep -oP
untuk mencari pola karakter yang diinginkan - Pada
?<=ERROR
berarti melakukan lookbehind dengan mencari kata ERROR tanpa memasukkan kata ERROR sebagai input - Pada
.*
berarti melakukan pencarian dengan karakter sembarang setelah kata ERROR (pada konteks kali ini) - Pada ?= berarti melakukan lookahead agar output tidak menampilkan username
- Untuk
syslog.log
merupakan file yang digunakan untuk mengeksekusi perintah yang diinginkan. Sehingga hasilnya sebagai berikut: - Dilakukan sorting agar pesan error yang sama (duplikat) terletak berjajar
- Uniq -c dilakukan untuk mengeliminasi pesan yang sama (duplikat) dengan option -c untuk menampilkan jumlah muncul pesan error
- cut -b 6-99 dilakukan untuk memotong spasi yang muncul pada awal string
- sort -nr dilakukan untuk sorting kembali dari angka kemunculan paling banyak
- Lalu bash baris pertama digunakan untuk memotong angka kemunculannya, sedangkan bash baris kedua digunakan untuk memotong pesan errornya
- Setelah itu digabung kan pada perintah paste
- Hasilnya akan seperti ini :
Timeout while retrieving information 15
Connection to DB failed 13
Tried to add information to closed ticket 12
Permission denied while closing ticket 10
The ticket was modified while updating 9
Ticket doesn't exist 7
Kendala :
Kendala hampir sama dengan 1a, masih belum mengenal grep dan regex dan baru tahu mengenai lookahead lookbehind dan sebagian besar waktu
berkurang karena mencoba-coba dan mempelajari regex melalui regex101.com. Lalu sedikit bingung menemukan perintah yang cocok digunakan
agar dapat menyelesaikan soal sesuai dengan perintah, dan akhirnya menemukan perintah paste.
Deskripsi:
Menampilkan jumlah kemunculan log ERROR dan INFO untuk setiap user.
Pembahasan:
printf "Username,INFO,ERROR\n"
user=$(grep -oP "(?<=\().*(?=\))" syslog.log | sort | uniq)
for i in $user
do
printf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()$i" syslog.log) $(grep -cP "ERROR.*(?<=\()$i" syslog.log);
done
- Pertama mencetak "Username,INFO,ERROR" di header file menggunakan printf
- kemudian membuat variabel
user
yang diisi nama-nama user darisyslog.log
dengan menggunakangrep -oP "(?<=\().*(?=\))" syslog.log
. -o
berguna untuk menampilkan karakter berdasarkan pola atau pattern danP
sebagai Perl Regular Expression yakni untuk menjalankan pattern yang digunakan dan berbentuk regex- Maksud dari
"(?<=\().*(?=\))"
adalah menggunakan look behind"(?<=\()
untuk melihat karakter selanjutnya, setelah karakter '(' dengan menghilangkan makna khususnya menggunakan '' - Lalu,
.*
untuk melakukan pencarian karakter sebarang setelah '('. Dan juga menggunakan look ahead(?=\))"
untuk hanya melihat karakter sebelum ')' dengan '' berfungsi untuk menghilangkan makna khusus kurung tersebut - Kemudian disorting dan diseleksi / dipilih cukup 1 dari setiap nama-nama user yang sama menggunakan
sort
danuniq
- Selanjutnya, setelah mendapat nama username dan dimasukkan ke variabel
user
. Maka dilakukan looping untuk mencetak jumlah kemunculan log ERROR dan INFO pada setiap user dengan perintahprintf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()$i" syslog.log) $(grep -cP "ERROR.*(?<=\()$i" syslog.log)
- Pada perintah di atas, untuk %d pertama berasal dari pencarian menggunakan
$(grep -cP "INFO.*(?<=\()$i" syslog.log)
untuk menghitung berapa kali muncul kata INFO dengan menggunakan look behind pada karakter'(' untuk memastikan bahwa langsung menunjuk pada $i atau nama user - Adapun untuk %d yang kedua
$(grep -cP "ERROR.*(?<=\()$i" syslog.log)
, perbedaannya hanya pada kata yang dicari dan dihitung kemunculannya adalah ERROR - Sehingga outputnya sebagai berikut,
Username,INFO,ERROR
ac,2,2
ahmed.miller,2,4
blossom,2,6
bpacheco,0,2
breee,1,5
britanni,1,1
enim.non,2,3
flavia,0,5
jackowens,2,4
kirknixon,2,1
mai.hendrix,0,3
mcintosh,4,3
mdouglas,2,3
montanap,0,4
noel,6,3
nonummy,2,3
oren,2,7
rr.robinson,2,1
sri,2,2
xlg,0,4
Kendala :
Sebelumnya masih salah pada log info dan error user "ac", karena regex-nya hanya INFO.*$i
dan ERROR.*$i
, sehingga terdapat nama user yang lain mengundang kata "ac" yang juga terhitung.
Deskripsi:
Menuliskan semua informasi dari soal 1.b dan dimasukkan ke dalam file error_message.csv
Pembahasan:
grep -oP '(?<=ERROR\ ).*?(?=\ \()' syslog.log | sort | uniq -c | sort -nr | cut -b 6-7 > temp1.txt
grep -oP '(?<=ERROR\ ).*?(?=\ \()' syslog.log | sort | uniq -c | sort -nr | cut -b 9-50 > temp2.txt
sed 's/$/ ,/' temp2.txt > temp3.txt
printf "Error,Count\n" > error_message.csv
paste temp3.txt temp1.txt >> error_message.csv
- Baris satu dan dua sama dengan Soal 1.b
- Perintah pada baris ketiga digunakan untuk menambahkan koma pada setiap baris di file temp2.txt dan dioutputkan ke file temp3.txt
- Baris 4 memerintahkan untuk menulis Error,Count pada file error_message.csv dan menambah newline pada akhir baris
- Baris 5 menempel hasil potongan ke error_message.csv dengan urutan pesan error, lalu banyak errornya
- Hasilnya akan seperti ini :
Error,Count
Timeout while retrieving information 15
Connection to DB failed 13
Tried to add information to closed ticket 12
Permission denied while closing ticket 10
The ticket was modified while updating 9
Ticket doesn't exist 7
Kendala :
Hampir tidak ada kendala, namun mungkin sedikit sulit ketika mencoba menambahkan koma pada akhir kalimat di setiap barisnya yang kemudian
setelah sekian lama menemukan perintah sed beserta cara penulisannya. selebihnya hampir sama dengan nomor sebelumnya, hanya mengubah output
dari yang sebelumnya di terminal, sekarang ke file.
Deskripsi:
Menampilkan jumlah kemunculan log ERROR dan INFO untuk setiap user, kemudian disimpan pada file user_statistic.csv dengan nama user diurutkan secara ascending.
Pembahasan:
printf "Username,INFO,ERROR\n" > user_statistic.csv
user=$(grep -oP "(?<=\().*(?=\))" syslog.log | sort | uniq)
for i in $user
do
printf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()($i)" syslog.log) $(grep -cP "ERROR.*(?<=\()($i)" syslog.log);
done | sort >> user_statistic.csv;
- Berhubung penjelasannya sama seperti nomor 1c, maka bisa dilihat disini pembahasan lengkapnya
- Perbedaannya pada saat setelah melakukan looping, dilakukan sort secara ascending untuk mengurutkan hasilnya berdasarkan nama user
- Kemudian, hasilnya disimpan pada file user_statistic.csv dengan menggunakan operator redirect
>>
yang berfungsi untuk memasukkan hasilnya ke file tersebut
Kendala :
Tidak ada kendala dalam soal ini.
Deskripsi:
Membuat laporan untuk rapat tahunan sebuah startup bernama “TokoShiSop” berupa kesimpulan-kesimpulan, yakni:
Deskripsi:
Mengetahui ID karyawan dengan Profit Percentage terbesar.
Note:
Profit Percentage = (Profit ÷ Cost Price) × 100
Pembahasan:
awk '
BEGIN {FS = "\t";}
{
if(NR != 1){
profitPercentage = ($21 / ($18 - $21)) * 100;
if(maxProfitPercentage <= profitPercentage){
maxProfitPercentage = profitPercentage;
orderId = $2;
row = $1;
}
}
}
END {
printf ("Transaksi terakhir dengan profit percentage terbesar yaitu %s \ndengan persentase %.2f%%\n\n", orderId, maxProfitPercentage);
}' Laporan-TokoShiSop.tsv >> hasil.txt
- Data dari
Laporan-TokoShiSop.tsv
berbentuk tabel yang dipisahkan olehTAB
. - AWK akan dimulai dari statement BEGIN.
- Bagian
BEGIN {FS = "\t";}
, mengindikasi kan bahwa ekstraksi data menggunakan filed separator (FS) berupa\t
aliasTAB
, sehingga tiap kolom ke-n akan menempati$n
. - Karna data memiliki header digunakan
if(NR != 1)
agar ekstraksi data sesuai dengan kolom tanpa mengambil nama kolom. - Seluruh baris nantinya akan dicari profit percentage-nya dengan
profitPercentage = ($21 / ($18 - $21)) * 100;
dan di kembalikan ke variabelprofitPercentage
. - Kemudian nanti setiap baris akan dilakukan pengecekan melalui conditional dibawah. Variabel
maxProfitPercentage
berisi NULL sehingga otomatis saat pertama kali akan terganti kan olehprofitPercentage
, hal ini berjalan terus hingga baris akhir data.
profitPercentage = ($21 / ($18 - $21)) * 100;
if(maxProfitPercentage <= profitPercentage){
maxProfitPercentage = profitPercentage;
orderId = $2;
row = $1;
}
- Kemudian akan terjadi pengoperan operand ke
maxProfitPercentage
, dan ID karyawana serta urutan barisnya akan disimpan keorderID
danrow
secara berturut-turun. - Setelah BEGIN selesai, awk akan mengeksekusi END, disini hasil
printf(...)
berupa float dua angka dibelakang koma akan di outputkan kehasil.txt
menghasilkan:
Transaksi terakhir dengan profit percentage terbesar yaitu CA-2017-121559
dengan persentase 100.00%
Bukti :
Kendala :
Tidak ada kendala dalam soal ini.
Deskripsi:
Mencari daftar nama pelanggan yang berasal dari Albuquerque yang pernah bertransaksi pada tahun 2017.
Pembahasan:
(echo "Daftar nama customer di Alburquerque pada tahun 2017 antara lain:" ;
awk -F "\t" '/Albuquerque/&&/.....-17/&&$3 ~ /.....-17/ NR > 1 {print$7}' Laporan-TokoShiSop.tsv | uniq) >> hasil.txt
- Script
echo "..."
untuk memenuhi syarat format jawaban - Standar opsi awk
-F "\t"
menyatakan filed separator (FS) berupa\t
aliasTAB
, sehingga tiap kolom ke-n akan menempati$n
. - Bagian
/Albuquerque/&&/.....-17/&&$3 ~ /.....-17/
merupakan regular expression yang mensyaratkan bahwa dalam baris data harus terdapat nilaiAlbuquerque
dan.
berupa wildcard berupa karakter bebas. - Ekspresi
.....-17
untuk menghimpun semua rekaman dengan tahun 2017 dan Albuquerque. - Ekspresi
$3 ~ /.....-17/
untuk filter terhadapTanggal Transaksi
dengan tahun transkasi 2017. - Perintah
{print$7}
akan mencetak bagian kolom ke 7 dari fileLaporan-TokoShiSop.tsv
dan disaring dengan script bash| uniq
lalu masuk kehasil.txt
menghasilkan: - Tanda kurung di awal dan di akhiran agar dimasukan sekaligus ke
hasil.txt
Daftar nama customer di Alburquerque pada tahun 2017 antara lain:
Michelle Lonsdale
Benjamin Farhat
David Wiener
Susan Vittorini
Bukti :
Kendala : Masalah saat memilih spesifik kolom tahun transaksi 2017.
Deskripsi:
Mencari segment customer dan jumlah transaksinya yang paling sedikit.
Pembahasan:
- Menggunakan struktur
awk
yang sama dengan soal 2.a dimulai dengan BEGIN. - memasukan prasyarat berupa
Home Office
,Consumer
, 'Corporate' ke sebuah arraykat
. - Kemudian dengan conditional if setiap kali melewati baris yang memenuhi syarat akan dihitung per-array
tr
. - Di akhiran akan dilakukan looping
for( value in array )
mencari indeks array dengan nilai minimum yakni indekske
. - Bagian END kemudian mencetak serta hasil indeks
ke
melaluiprintf(...)
akan di outputkan kehasil.txt
menghasilkan:
Tipe segmen customer yang penjualannya paling sedikit adalah Home Office
dengan total transaksi 1783.
Bukti :
Kendala :
Tidak ada kendala dalam soal ini.
Deskripsi:
Mencari wilayah bagian (region) yang memiliki total keuntungan (profit) paling sedikit dan total keuntungan wilayah tersebut.
Pembahasan:
- Menggunakan struktur
awk
yang sama dengan soal 2.a dimulai dengan BEGIN. - memasukan prasyarat berupa
Central
,West
,North
danSouth
ke sebuah arrayar
. - Kemudian dengan conditional if setiap kali melewati baris yang memenuhi syarat akan dihitung per-array
par
. - Di akhiran akan dilakukan looping
for( value in array )
mencari indeks array dengan nilai minimum yakni indekskep
. - Bagian END kemudian mencetak serta hasil indeks
kep
melaluiprintf(...)
akan di outputkan kehasil.txt
menghasilkan:
Wilayah bagain (region) yang memiliki total keuntungan (profit) yang
paling sedikit adalah Central dengan total keuntungan 39706 (Profit).
Bukti :
Kendala :
Tidak ada kendala dalam soal ini.
Deskripsi:
Mengunduh 23 gambar dari link https://loremflickr.com/320/240/kitten dengan menyimpannya ke file Foto.log. Juga memastikan tidak ada gambar yang sama serta menyimpan gambar dengan penamaan Koleksi_XX, contoh Koleksi_01, Koleksi_02
Pembahasan:
#!/bin/bash
number=1
while [ $number -le 23 ]
do
wget -a Foto.log -nv https://loremflickr.com/320/240/kitten
number=$((number+1))
done
md5sum * | sort | awk 'BEGIN{hash = ""} $1 == hash {print $2} {hash = $1}' | xargs rm
s=1
for file in *
do
if [[ $file == *"kitten"* ]]
then
namafile=`printf "Koleksi_%02d.jpg" $s`
mv $file $namafile
s=$((s+1))
fi
done
- inisiasi variabel number dengan diisi nilai 1 untuk digunakan sebagai indeks dalam perulangan ketika mengunduh gambar
- Kemudian menggunakan while dengan kondisi
$number -le 23
atau nilai number <= 23, maka akan mengeksekusi unutk mengunduh gambar dan memasukkannya ke Foto.log - Lalu, setelah 23 foto selesai diunduh, maka dihitung hash dari setiap file foto menggunakan
md5sum
dan disorting menggunakansort
- Setelah itu, menggunakan awk dengan inisialisasi awal
hash = ""
atau hash diisi dengan string kosong yang tidak akan sesuai dengan hash apapun. - Kemudian, memeriksa setiap baris apabila
hash
bernilai sama dengan$1
, yaitu hash file pada kolom pertama dari file sekarang (kolom kedua). Maka, akan diprint jika benar - Kemudian, pada akhir setiap langkah
hash
akan menyimpan hash dari file sekarang - Kemudian
xargs
berfungsi untuk menjadikan input dari awk yang ada sebagai argumen untukrm
atau remove file yang duplikat - Setelah itu, melakukan perulangan kembali dengan inisiasi variabel s untuk indeksnya
- Perulangan ini berfungsi untuk mengubah nama file yang terdapat kata
kitten
menjadiKoleksi_%02d.jpg
yang mana %d merupakan $s - Berikut untuk bukti eksekusinya,
Kendala :
Sebelumnya masih belum memahami soal 3a ini, terutama bagian penggunaan hash
Deskripsi: Sama seperti nomor 3a, hanya saja script dijalankan secara otomatis sehari sekali pada jam 8 malam dengan format tanggal,
- Dari tanggal 1 dijalankan 7 hari sekali
- Dari tanggal 2 dijalankan 4 hari sekali Agar lebih rapi, gambar yang telah diunduh beserta log, dipindahkan ke folder yang format penamaannya mengikuti tanggalnya, DD-MM-YYY
Pembahasan:
bash ./soal3a.sh
current_date=$(date +"%d-%m-%Y")
mkdir "$current_date"
mv ./Koleksi_* "./$current_date/"
mv ./Foto.log "./$current_date/"
echo "Moved to $current_date"
- Berhubung yang diminta sama seperti nomor 3a, maka melakukan eksekusi jawaban nomor tersebut dengan menggunakan
bash ./soal3a.sh
- Kemudian,
current_date=$(date +"%d-%m-%Y")
berfungsi untuk membuat variabel current_date yang menyimpan tanggal pada saat eksekusi dengan format DD-MM-YY - Setelah itu, membuat directory atau folder dari variabel tersebut menggunakan
mkdir "$current_date"
- Lalu,
mv ./Koleksi_* "./$current_date/"
berfungsi untuk memindahkan seluruh file foto ke folder yang telah dibuat sebelumnya - Begitu juga dengan file Foto.log juga dipindahkan ke folder tersebut dengan cara
mv ./Foto.log "./$current_date/"
0 20 1-31/7,2-31/4 * * bash ~/soal-shift-sisop-modul-1-A06-2021/soal3/soal3b.sh
- Sesuai permintaan soal,script ini akan mengeksekusi script soal3b.sh dengan rincian
0 20
yang menunjukkan waktu jam 8 malam - Kemudian,
1-31/7,2-31/4
bermakna dijalankan pada tanggal 1 sampai tanggal 31 dengan aturan 7 hari sekali. Juga dari tanggal 2 sampai tanggal 31 dengan aturan 4 hari sekali. - Dan yang terakhir,
* *
yang mana bintang pertama menunjukkan dilakukan di semua bulan dan bintang kedua menunjukkan dieksekusi pada semua hari tanpa terkecuali.
Kendala :
Tidak ada kendala
Deskripsi:
Selain mengunduh gambar kucing, juga mengunduh gambar kelinci pada link https://loremflickr.com/320/240/bunny dengan cara bergantian (bebas gambar mana yang didahulukan). Adapun untuk membedakan gambar kucing dan kelinci, maka dibuatkan folder dengan nama awalan Kucing_DD-MM-YYYY dan Kelinci_DD-MM-YY
Pembahasan:
PWD=`pwd`;
folder_kucing=`ls -d Kucing_* | wc -l`
folder_kelinci=`ls -d Kelinci_* | wc -l`
- Membuat script yang secara bergantian mengunduh gambar kucing atau kelinci.
- Acuan berdasarkan perbandingan jumlah folder kucing dengan kelinci, dimulai dengan kucing.
- Dilakukan perhitungan jumlah masing masing folder dengan
wc
(word count) melaluils
degnan filter-d
,-d
digunakan untuk hanya directory, menghitung jumlah masing - masing directory kelinci dan kucing. Jika sama jumlahnya atau tidak ada maka dimulai dari kucing. - variabel
$PWD
digunakan untuk memindahkan file yang sudah di download ke folder tujuan relatif terhadap root.
if [ $folder_kucing -le $folder_kelinci ]
then
newdir="Kucing_$(date +"%d-%m-%Y")"
mkdir $newdir
...
elif [ $folder_kucing -gt $folder_kelinci ]
then
newdir="Kelinci_$(date +"%d-%m-%Y")"
mkdir $newdir
...
fi
- Jika salah satu kondisi tercapai maka akan dibuat folder dengan nama sesuai dengan format diminta.
- Digunakan
$(date +"%d-%m-%Y")
untuk menarik tanggal saat itu sebagai nilai variabel lalu disematkan ke string nama folder. Bagian%d
untuk day,%m
untuk month dan%Y
untuk year. - Skema pengunduhan dan filter sama dengan soal 3.a
for ((num=1 ; num<=23; num=num+1))
do
wget -a Foto.log -nv https://loremflickr.com/320/240/kitten
done
mv Foto.log $newdir
...
ke=1
for file in *
do
if [[ $file == *"kitten"* ]]
then
namafile=`printf "Kucing_%02d.jpg" $ke`
mv $file $namafile
ke=$((ke+1))
mv *.jpg $PWD/$newdir
fi
done
...
- Hanya berbeda saat pemindahan
.log
file setelah pengunduhan ke folder tujuan[nama]_DD-MM-YYYY
. - Dilakukan renaming dengan melakukan traverse seluruh file di folder sekarang, dan jika file memenuhi syarat dilakukan renaming sesuai format dengan bantuan counter nilai
$ke
, dan$ke
increment.
Bukti :
Kendala :
Cukup lama untuk menemukan metode filter 3a sehingga bisa dijalankan ke soal 3c, cukup bingung apakah menggunakan crontab
atau hanya berdasarkan jalan mulai script.
Deskripsi:
Membuat script yang dapat memindahkan seluruh folder ke bentuk zip dengan nama Koleksi.zip dan menguncinya dengan password berupa tanggal saat itu, yakni MMDDYYYY
Pembahasan:
#Mendapatkan tanggal hari ini untuk digunakan sebagai password zip dengan format bulan,tanggal,dan tahun 4 digit
now=$(date +'%m%d%Y')
#Mengzip file
zip -rem Koleksi.zip Kucing_* Kelinci_* -P "$now"
- Mendapatkan tanggal sekarang dengan format "MMDDYYYY" dapat dilakukan dengan
$(date +'%m%d%Y')
yang lalu dioper dalam variabel "now". - Menggunakan perintah zip dengan opsi sebagai berikut :
-r
digunakan untuk meng-zip file secara rekursi-e
diperlukan agar zip dapat ter-Encrypt-m
digunakan untuk memindahkan spesifik file ke zip dan menghapus file yang telah dipindahkan-P "$now"
digunakan untuk menambahkan password dengan nilai password adalah isi dari variabel "now"
Bukti :
Kendala :
Untuk mendapatkan tanggal hari ini sebagai password, sangat mudah ditemukan di internet. Namun mungkin untuk perintah zip perlu mencari beberapa option yang diperlukan
agar dapat menyelesaikan sesuai dengan perintah soal
Deskripsi: Lanjutan dari nomor 3d, yaitu dilakukan perintah zip setiap hari kecuali sabtu dan minggu, dari jam 7 pagi sampai 6 sore. Selain waktu tersebut, tidak dilakukan zip dan filenya di-unzip
Pembahasan:
#di-zip
0 7 * * 1-5 bash ~/soal-shift-sisop-modul-1-A06-2021/soal3/soal3d.sh
#tidak di-zip & di-unzip
0 18 * * 1-5 unzip -P "$(date +"%d%m%Y")" ~/soal-shift-sisop-modul-1-A06-2021/soal3/Koleksi.zip -d ~/soal-shift-sisop-modul-1-A06-2021/soal3/ && rm ~/soal-shift-sisop-modul-1-A06-2021/soal3/Koleksi.zip
- Diminta untuk membuat crontab untuk meng-zip dan meng-unzip folder foto.
- Dengan crontab yang kedua menjalankan pertintah
unzip
, karna file dipasangkan enkripsi berupa tanggal terbuatnya file zip, digunakan modifiers-P
dengan nilai berupa tanggal pada saat itu juga. - Opsi
-d
untuk lokasi tujuan unzip, kemudiam menghapus fileKoleksi.zip
denganrm
.
Bukti :
Kendala :
Tidak ada kendala