Anggota kelompok :
- 05111940000181 - Cliffton Delias Perangin Angin
- 05111940000095 - Fuad Elhasan Irfani
- 05111940000107 - Sabrina Lydia Simanjuntak
1a. Membuat script untuk memotong data setiap barisnya sampai ditemukan karakter : pertama sehingga hanya menampilkan error/info, jenisnya dan username
cat syslog.log | sed 's/^.*: //'1b. Menampilkan data syslog.log namun hanya yang mengandung kata ERROR lalu memotong usernamenya dengan pattern ' (.*)' lalu di sort setelah itu data yang berulang hanya tampil sekali dengan uniq(sekaligus jumlahnya karena ada -c) dan terakhir di sort by number dan di reverse
grep 'ERROR' syslog.log | sed 's/^.*ERROR //' | sed 's/ (.*)//' | sort | uniq -c | sort -nrecho Error,Count >> error_message.csv
grep -oE '(ERROR) .* ' syslog.log | sed s/"ERROR "// | sort | uniq -c | sort -nr | while read count text
do
echo $text,$count >> error_message.csv
doneecho Username,INFO,ERROR >> user_statistic.csv
# memfilter data menjadi jumlah error/info dan usernamenya diurutkan berdasarkan nama ascending lalu di read per line
grep -oE '.* (\(.*\))' syslog.log | sed 's/.*(\(.*\))/\1/' | sort | uniq -c | while read count name
do
infoUser=`grep -oE ".* (INFO) .* (\($name\))" syslog.log | sed 's/.*(\(.*\))/\1/' | wc -l | sed 's/^[ \t]*//'`
errUser=`grep -oE ".* (ERROR) .* (\($name\))" syslog.log | sed 's/.*(\(.*\))/\1/' | wc -l | sed 's/^[ \t]*//'`
echo $name,$infoUser,$errUser >> user_statistic.csv
done
#Didalam while loop pada setiap iterasi disimpan data jumlah error dan jumlah info pada setiap username dan sebelum iterasi selanjutnya data berupa nama,jumlah info, jumlah error dikriim ke user_statistic.csvKendala pengerjaan no. 1 secara keseluruhan:
- Pengerjaan lama karena belum terlalu paham shell sehingga tidak sempat selesai sampai praktikum berakhir.
2a. Untuk mengerjakan soal nomor 2, kita terlebih dahulu harus mendownload file Laporan-TokoShiSop.tsv , dan untuk menyelesaikan soal ini digunakan awk.
Pada soal nomor 2a, kita diminta untuk menampilkan transaksi dengan profit persentase terbesar dari file Laporan-TokoShiSop.tsv
export LC_ALL=C
awk '
BEGIN{FS="\t"}LC_ALL=C berfungsi untuk membaca data yang mengandung titik di file sebagai koma, agar terbaca sebagai desimal. awk berfungsi untuk memproses file Laporan-TokoShiSop.tsv. BEGIN merupakan special rule yang terdapat pada awk untuk membaca algoritma. FS=”\t” untuk memisahkan atau memproses file per tab, karena file Laporan-TokoShiSop memiliki data yang dipisahkan per tab.
profit=$21
sales=$18
profitpercentage=profit/(sales-profit)*100Pada bagian ini, diinisialisasikan profit dan sales. DImana untuk profit=$21 artinya nilai dari profit akan diambil atau terletak di tab ke-21, begitu juga untuk sales yang terletas di tab ke-18. Lalu dilakukan perhitungan untuk mencari profit persentase dengan rumus sesuai dengan soal yaitu profitpercentage=profit/(sales-profit)*100. Dimana profit dan sales akan menuju ke $21 dan $18 sesuai dengan inisialisasinya.
if(max<=profitpercentage){
max=profitpercentage
RowID=$1
}Disini diinisialisasi variable max, dimana variable max berfungsi sebagai pembanding untuk profitpercentage untuk memperoleh nilai terbesar. Dimana, jika nilai profitpercentage lebih besar dari max, maka nilai max akan terupdate sebagai nilai profitpercentage tersebut, hingga setiap nilai yang lebih besar akan tersimpan di max.
END {
printf("Transaksi terakhir dengan profit persentase terbesar yaitu %d dengan persentase %d%%.\n\n", RowID, max)
} ' /home/sabrina/Documents/sisop/Laporan-TokoShiSop.tsv >> hasil.txtEND merupakan special rule dalam awk. Pada, section ini, hasil profit persentase terbesar, beserta RowIDnya akan di print. Lalu, dibagian setelah END, /home/sabrina/Document/sisop/Laporan-TokoShiShop.tsv merupakan direktori file Laporan-TokoShiSop.tsv dan hasil outputnya akan dimasukkan ke file hasil.txt.
Berikut merupakan output profit persentase terbesar dari Laporan-TokoShiSop.tsv yaitu 9952 dengan persentase 100%
2b. Pada soal nomor 2b, kita diminta untuk menampilkan daftar nama customer di Albuquerque pada tahun 2017 dari file Laporan-TokoShiSop.tsv
export LC_ALL=C
awk '
BEGIN{FS="\t"}LC_ALL=C berfungsi untuk membaca data yang mengandung titik di file sebagai koma, agar terbaca sebagai desimal. awk berfungsi untuk memproses file Laporan-TokoShiSop.tsv. BEGIN merupakan special rule yang terdapat pada awk untuk membaca algoritma. FS=”\t” untuk memisahkan atau memproses file per tab, karena file Laporan-TokoShiSop memiliki data yang dipisahkan per tab.
orderID=$2
city=$10
customername=$7
if(orderID~"2017" && city=="Albuquerque"){
arrname[customername]++
}Pada bagian ini, diinisialisasikan orderID, city, dan customername. Dimana untuk orderID=$2 artinya nilai dari profit akan diambil atau terletak di tab ke-2, begitu juga untuk city yang terletas di tab ke-10 dan customername di tab ke-7. Lalu dilakukan pengkondisian, dimana jika orderID mengandung 2017 (pada tahun 2017) dan citynya adalah Albuquerque, maka nama customer yagn memenuhi kedua kondisi tersebut akan dimasukan ke arrname.
END{
print "Daftar nama customer di Alburquerque pada tahun 2017 antara lain:"
for(customername in arrname)
{print customername}
}' /home/sabrina/Documents/sisop/Laporan-TokoShiSop.tsv >> hasil.txtEND merupakan special rule dalam awk. Pada, section ini, Daftar nama customer yang memenuhi kedua kondisi sebelumnya akan diprint. Lalu, dibagian setelah END, /home/sabrina/Document/sisop/Laporan-TokoShiShop.tsv merupakan direktori file Laporan-TokoShiSop.tsv dan hasil outputnya akan dimasukkan ke file hasil.txt.
Berikut merupakan output daftar nama customer di Albuquerque pada tahun 2017 dari Laporan-TokoShiSop.tsv yaitu Benjamin Farhat, David Wiener, Michelle Lonsdale, dan Susan Vittorini.
2c. Pada soal nomor 2c, kita diminta tipe segmen yang penjualannya paling sedikit dari file Laporan-TokoShiSop.tsv
export LC_ALL=C
awk '
BEGIN{FS="\t"}LC_ALL=C berfungsi untuk membaca data yang mengandung titik di file sebagai koma, agar terbaca sebagai desimal. awk berfungsi untuk memproses file Laporan-TokoShiSop.tsv. BEGIN merupakan special rule yang terdapat pada awk untuk membaca algoritma. FS=”\t” untuk memisahkan atau memproses file per tab, karena file Laporan-TokoShiSop memiliki data yang dipisahkan per tab.
segment=$8
if(NR>1){
arrsegment[segment]++
}Pada bagian ini, diinisialisasikan segment. Dimana untuk segment=$8 artinya nilai dari profit akan diambil atau terletak di tab ke-8. Lalu dilakukan pengkondisian, dimana jika NR>1 (yang artinya dilakukan pengecualian untuk baris paling atas, yaitu judul dari tabel), maka segmen tersebut akan dimasukan ke arrsegment, dan untuk segment tersebut akan dijumlahkan dan dicatat.
END {
minsales=5000
for(segment in arrsegment){
if(minsales > arrsegment[segment]){
minsales=arrsegment[segment]
namasegment=segment;
}
}END merupakan special rule dalam awk. Pada, section ini, dilakukan inisialisasi untuk minsales yaitu 5000. Lalu untuk segment yang namanya berada di arrsegment, nilai dari arrsegment[segment] akan dibandingkan dengan nilai minsales, dimana jika nilai arrsegment[segment] lebih kecil dari nilai minsales, maka nilai tersebut akan disimpan di minsales dan segment akan tersimpan di namasegment. Minsales dan namasegment akan terupdate jika ditemukan nilai yang lebih kecil, hingga ditemukan nilai yang paling kecil.
printf("\nTipe segmen customer yang penjualannya paling sedikit adalah %s dengan %d total transaksi.\n\n", namasegment, minsales)
}' /home/sabrina/Documents/sisop/Laporan-TokoShiSop.tsv >> hasil.txtDisini tipe segmen yang penjualannya paling sedikit akan diprint. Lalu, dibagian setelah END, /home/sabrina/Document/sisop/Laporan-TokoShiShop.tsv merupakan direktori file Laporan-TokoShiSop.tsv dan hasil outputnya akan dimasukkan ke file hasil.txt.
Berikut merupakan output tipe customer pyang penjualannya paling sedikit dari Laporan-TokoShiSop.tsv yaitu Home Office dengan 1783 total transaksi.
2d. Pada soal nomor 2a, kita diminta untuk menampilkan wilayah bagian (region) yang total profitnya paling sedikit dari file Laporan-TokoShiSop.tsv
export LC_ALL=C
awk '
BEGIN{FS="\t"}LC_ALL=C berfungsi untuk membaca data yang mengandung titik di file sebagai koma, agar terbaca sebagai desimal. awk berfungsi untuk memproses file Laporan-TokoShiSop.tsv. BEGIN merupakan special rule yang terdapat pada awk untuk membaca algoritma. FS=”\t” untuk memisahkan atau memproses file per tab, karena file Laporan-TokoShiSop memiliki data yang dipisahkan per tab.
region=$13
profit=$21
if(NR>1){
arrregion[region]=arrregion[region]+profit;
}Pada bagian ini, diinisialisasikan profit dan region. Dimana untuk profit=$21 artinya nilai dari profit akan diambil atau terletak di tab ke-21, begitu juga untuk region yang terletas di tab ke-13. Lalu dilakukan pengkondisian, dimana jika NR>1 (yang artinya dilakukan pengecualian untuk baris paling atas, yaitu judul dari tabel), maka jumlah profit dari region tersebut akan dimasukkan ke arrregion[region] dan akan terus dijumlahkan profitnya kedalam arrregion[region].
END {
totalprofit=100000
for(region in arrregion){
if (totalprofit > arrregion[region]){
totalprofit = arrregion[region]
namaregion = region
}
}END merupakan special rule dalam awk. Pada, section ini, dilakukan inisialisasi untuk totalprofit yaitu 100000. Lalu untuk region yang namanya berada di arrregion, nilai dari arrregion[region] akan dibandingkan dengan nilai totalprofit, dimana jika nilai arrregion[region] lebih kecil dari nilai totalprofit, maka nilai tersebut akan disimpan di totalprofit dan region akan tersimpan di namaregion. totalprofit dan namaregion akan terupdate jika ditemukan nilai yang lebih kecil, hingga ditemukan nilai yang paling kecil.
printf("Wilayah bagian (region) yang memiliki total keuntungan (profit) yang paling sedikit adalah %s dengan total keuntungan %.4f\n", namaregion, totalprofit);
}' /home/sabrina/Documents/sisop/Laporan-TokoShiSop.tsv >> hasil.txtDisini wilayah bagian (region) yang total profitnya paling sedikit akan diprint. Lalu, dibagian setelah END, /home/sabrina/Document/sisop/Laporan-TokoShiShop.tsv merupakan direktori file Laporan-TokoShiSop.tsv dan hasil outputnya akan dimasukkan ke file hasil.txt.
Berikut merupakan wilayah bagian (region) yang total keuntungannya paling sedikit dari Laporan-TokoShiSop.tsv yaitu Central dengan total keuntungan 39706.3625
Kesulitan:
Untuk kesulitan yang dihadapi dalam mengerjakan soal nomor 2 ialah kesulitan mengeluarkan output. Setelah melakukan revisi, ternyata hal tersebut terjadi karena ketidaktelitian, dimana error terjadi karena tidak ada spasi, lupa memberi petik penutup awk, dan kesalahan pada penamaan direktori.
3a. Membuat script untuk mengunduh 23 gambar dari "https://loremflickr.com/320/240/kitten" serta menyimpan log-nya ke file "Foto.log". Karena gambar yang diunduh acak, ada kemungkinan gambar yang sama terunduh lebih dari sekali, oleh karena itu kalian harus menghapus gambar yang sama (tidak perlu mengunduh gambar lagi untuk menggantinya). Kemudian menyimpan gambar-gambar tersebut dengan nama "Koleksi_XX" dengan nomor yang berurutan tanpa ada nomor yang hilang (contoh : Koleksi_01, Koleksi_02, ...)
Pertama membuat file log kosong
printf "" > Foto.logBuat loop 23 kali untuk mengunduh gambar dan menyimpan log
for i in {1..23}
do
#download & simpan di log
wget "https://loremflickr.com/320/240/kitten" -O download -a Foto.logCek jika ini file pertama maka langsung rename
if [ $i -eq 1 ]
then
mv download `printf "Koleksi_%02d" "$nokoleksi"`
nokoleksi=$(($nokoleksi+1))
fiBuat loop untuk file selanjutnya untuk cek apakah file sama atau tidak
fileissame=0
#untuk file selanjutnya
for((j=1;j<nokoleksi;j=j+1))
do
if [ $i -eq 1 ]
then
break
fi
#cek apakah nama file sama
filename=`printf "Koleksi_%02d" "$j"`
same=`cmp $filename download -b`
if [ -z "$same" ]
then
fileissame=1
break
else
fileissame=0
fi
doneSelanjutnya jika nama tidak sama maka akan direname
if [ $i -gt 1 ]
then
if [ $fileissame -eq 1 ]
then
#jika nama sama maka hapus
rm download
else
#jika nama tidak sama maka direname
mv download `printf "Koleksi_%02d" "$nokoleksi"`
nokoleksi=$(($nokoleksi+1))
fi
fiBerikut hasil dari script diatas
Kendala 3a:
- Pengerjaan lama karena belum terlalu paham shell
3b. Karena Kuuhaku malas untuk menjalankan script tersebut secara manual, ia juga meminta kalian untuk menjalankan script tersebut sehari sekali pada jam 8 malam untuk tanggal-tanggal tertentu setiap bulan, yaitu dari tanggal 1 tujuh hari sekali (1,8,...), serta dari tanggal 2 empat hari sekali(2,6,...). Supaya lebih rapi, gambar yang telah diunduh beserta log-nya, dipindahkan ke folder dengan nama tanggal unduhnya dengan format "DD-MM-YYYY" (contoh : "13-03-2023").
Jalankan script 3a
cd ~/modul1/soal3
bash ./soal3a.shBuat folder seperti format
download_date=$(date +"%d-%m-%Y")
mkdir "$download_date"Lalu pindah gambar & log ke folder
mv ./Koleksi_* "./$download_date/"
mv ./Foto.log "./$download_date/"Gunakan cron untuk otomatisasi
0 20 1-31/7,2-31/4 * * bash ./home/xa/modul1/soal3:/soal3b.sh
# menit 0
# jam 20 (8 malam)
# untuk tgl 1-31 setiap 7 hari sekali
# untuk tgl 2-31 setiap 4 hari sekaliBerikut hasil dari script diatas
Kendala 3b:
- Tidak ada
3c. Agar kuuhaku tidak bosan dengan gambar anak kucing, ia juga memintamu untuk mengunduh gambar kelinci dari "https://loremflickr.com/320/240/bunny". Kuuhaku memintamu mengunduh gambar kucing dan kelinci secara bergantian (yang pertama bebas. contoh : tanggal 30 kucing > tanggal 31 kelinci > tanggal 1 kucing > ... ). Untuk membedakan folder yang berisi gambar kucing dan gambar kelinci, nama folder diberi awalan "Kucing_" atau "Kelinci_" (contoh : "Kucing_13-03-2023").
Pertama buat satu folder bernama "Koleksi" untuk mengumpulkan semua folder agar di soal selanjutnya lebih mudah. Lalu buat fungsi untuk mengunduh gambar kucing dan kelinci secara terpisah
kitten () {Pindah ke direktori koleksi
cd KoleksiBuat folder sesuai format lalu masuk ke direktori tersebut
mkdir $(date "+ Kucing_%d-%m-%Y")
cd $(date "+ Kucing_%d-%m-%Y")Buat file untuk menyimpan log agar terminal terlihat rapi (opsional). Lalu download gambar
printf "" > Foto.log
wget https://loremflickr.com/320/240/kitten -a Foto.log
cd
}Buat script yang sama untuk fungsi mengunduh gambar kelinci
bunny () {
echo "Download: Kelinci"
cd Koleksi
mkdir $(date "+ Kelinci_%d-%m-%Y")
cd $(date "+ Kelinci_%d-%m-%Y")
printf "" > Foto.log
wget https://loremflickr.com/320/240/bunny -a Foto.log
cd
}Buat inisialisasi week of year & day of week. Dan tampilkan date, day, dan week (opsional)
d=$(date +"%a %d %b %Y")
day=$(($(date +"%w")+1))
week=$(($(date +"%U")+1))
echo "$d"
echo "Day: $day"
echo "Week: $week"Untuk minggu genap dan hari genap maka jalankan fungsi kitten, untuk minggu genap dan hari ganjil maka jalankan fungsi bunny.
if [ $((week%2)) -eq 0 ] # minggu genap
then
if [ $((day%2)) -eq 0 ] # hari genap
then
kitten
else # hari ganjil
bunny
fiUntuk minggu ganjil jalankan kebalikan dari minggu genap.
else # minggu ganjil
if [ $((day%2)) -eq 0 ] # hari genap
then
bunny
else # hari ganjil
kitten
fi
fiBerikut hasil dari script diatas
Kendala 3c:
- Salah memahami soal. Saya kira menggunakan cron dan dimasukkan ke cron3e.tab
3d. Untuk mengamankan koleksi Foto dari Steven, Kuuhaku memintamu untuk membuat script yang akan memindahkan seluruh folder ke zip yang diberi nama “Koleksi.zip” dan mengunci zip tersebut dengan password berupa tanggal saat ini dengan format "MMDDYYYY" (contoh : “03032003”).
Buat fungsi zipping (agar bisa dipisah dengan unzip yang ada pada soal 3e)
function zipping() {Buat "current" yang nanti digunakan untuk password (MMDDYYYY)
current=$(date "+%m%d%Y")Buat zip. Set password (-p) dengan "current". Masukkan semua subfolder (-r) ke dalam zip juga
zip -P $current -r Koleksi.zip Koleksi/Hapus direktori setelah masuk zip
rm -rf Koleksi/
}Kendala 3d:
- Tidak ada
3e. Karena kuuhaku hanya bertemu Steven pada saat kuliah saja, yaitu setiap hari kecuali sabtu dan minggu, dari jam 7 pagi sampai 6 sore, ia memintamu untuk membuat koleksinya ter-zip saat kuliah saja, selain dari waktu yang disebutkan, ia ingin koleksinya ter-unzip dan tidak ada file zip sama sekali.
Tambahkan fungsi unzip ke script 3d. Script unzip hampir sama dengan zip
function unzipping() {
current=$(date "+%m%d%Y")
unzip -P $current Koleksi.zip
rm -f Koleksi.zip
}Buat cron job untuk menjalankan script secara otomatis
0 7 * * 1-5 source soal3d.sh; zipping
0 18 * * 1-5 source soal3d.sh; unzipping7: jalankan (zip) tiap jam 7 pagi
18: jalankan (unzip) tiap jam 6 sore
1-5: setiap hari senin sampai Jum'at
Kendala 3e:
- Tidak ada
Kendala pengerjaan no. 3 secara keseluruhan:
- Pengerjaan lama karena belum terlalu paham shell sehingga tidak sempat selesai sampai praktikum berakhir.












