"Repository dibuat untuk memenuhi tugas praktikum mata kuliah sistem operasi tahun 2020."
Anggota :
Muhammad Ilya Asha Soegondo [05311840000010]
Mohammad Ifaizul Hasan [05311840000029]
Asisten :
Nandha Himawan [05111740000180]
- Judul
- Daftar Isi
- Pendahuluan
3.1. Prasyarat - Modul 1
4.1. Soal 1
4.1.1. Penyelesaian
4.2. Soal 2
4.2.1. Penyelesaian
4.3. Soal 3
4.3.1. Penyelesaian
- Sebuah distribusi Linux (misal: Ubuntu, Linux Mint).
- gawk (GNU awk).
sudo apt-get install gawk
Whits adalah seorang mahasiswa teknik informatika. Dia mendapatkan tugas praktikum untuk membuat laporan berdasarkan data yang ada pada file “Sample-Superstore.csv”. Namun dia tidak dapat menyelesaikan tugas tersebut. Laporan yang diminta berupa :
a. Tentukan wilayah bagian (region) mana yang memiliki keuntungan (profit) paling sedikit
b. Tampilkan 2 negara bagian (state) yang memiliki keuntungan (profit) paling
sedikit berdasarkan hasil poin a
c. Tampilkan 10 produk (product name) yang memiliki keuntungan (profit) paling sedikit berdasarkan 2 negara bagian (state) hasil poin b
Whits memohon kepada kalian yang sudah jago mengolah data untuk mengerjakan
laporan tersebut.
Gunakan Awk dan Command pendukung.
a. Wilayah bagian dengan keuntungan paling sedikit
region=($(awk -F "\"*,\"*" 'FNR>1{u[$13]+=$NF}END{for(i in u)printf "%6.4f %s \n", u[i], i}' Sample-Superstore.csv | sort -g | head -n1))
- Mengolah Sample-Superstore.csv menggunakan
awk
dengan cara menentukan field separator","
-F "\"*,\"*"
, melewati kolom headerFNR>1
, menggunakan array untuk mengelompokkan keuntungan berdasarkan wilayah bagianu[$13]+=$NF
, dan menampilkan setiap elemen dari array tersebut beserta value-nyafor(i in u)printf "%6.4f %s \n", u[i], i
. - Mengurutkan keuntungan dari kecil ke besar menggunakan
sort
dan-g
untuk mengurutkan secara general numerik. - Menampilkan baris pertama menggunakan
head -n1
. - Hasil yang berupa wilayah bagian dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel
region
.
b. 2 negara bagian dengan keuntungan paling sedikit pada wilayah bagian dari poin a
state=($(awk -F "\"*,\"*" -v a=${region[1]} 'FNR>1{if($13~a)u[$11]+=$NF}END{for(i in u)printf "%6.4f %s \n", u[i], i}' Sample-Superstore.csv | sort -g | head -n2))
- Mengolah Sample-Superstore.csv menggunakan
awk
dengan cara menentukan field separator","
-F "\"*,\"*"
, menggunakan hasil dari poin a dengan mengoper variabelregion
ke dalamawk
-v a=${region[1]}
, melewati kolom headerFNR>1
, jika wilayah bagian adalah wilayah bagian dari poin aif($13~a)
maka digunakan array untuk mengelompokkan keuntungan berdasarkan negara bagianu[$11]+=$NF
, dan menampilkan setiap elemen dari array tersebut beserta value-nyafor(i in u)printf "%6.4f %s \n", u[i], i
. - Mengurutkan keuntungan dari kecil ke besar menggunakan
sort
dan-g
untuk mengurutkan secara general numerik. - Menampilkan dua baris pertama menggunakan
head -n2
. - Hasil yang berupa 2 negara bagian dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel
state
.
c. 10 produk dengan keuntungan paling sedikit pada 2 negara bagian dari poin b
prod12=($(awk -F "\"*,\"*" -v a=${state[1]} -v b=${state[3]} 'FNR>1{if($11~a||$11~b)u[$17]+=$NF}END{for(i in u)printf "%5.4f in %s\\n\n",u[i],i}' Sample-Superstore.csv | sort -g | head -n10 | nl -s"."))
- Mengolah Sample-Superstore.csv menggunakan
awk
dengan cara menentukan field separator","
-F "\"*,\"*"
, menggunakan hasil dari poin b dengan mengoper variabelstate
ke dalamawk
-v a=${state[1]} -v b=${state[3]}
, melewati kolom headerFNR>1
, jika negara bagian adalah negara bagian dari poin bif($11~a||$11~b)
maka digunakan array untuk mengelompokkan keuntungan berdasarkan produku[$17]+=$NF
, dan menampilkan setiap elemen dari array tersebut beserta value-nyafor(i in u)printf "%5.4f in %s\\n\n",u[i],i
. - Mengurutkan keuntungan dari kecil ke besar menggunakan
sort
dan-g
untuk mengurutkan secara general numerik. - Menampilkan sepuluh baris pertama menggunakan
head -n10
. - Menomori per baris menggunakan
nl
dan menambahkan titik setelah nomor-s"."
. - Hasil yang berupa 10 produk dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel
prod12
.
Central Region has the lowest profit at 41340.4137
2 States with lowest profit in Central region : 1.Texas at -20198.3212 2.Illinois at -9246.8718
10 Products with lowest profit in both states : 1.-5552.8392 in GBC DocuBind P400 Electric Binding System 2.-3431.6730 in Fellowes PB500 Electric Punch Plastic Comb Binding Machine with Manual Bind 3.-2929.4845 in Ibico EPK-21 Electric Binding System 4.-1869.9890 in Lexmark MX611dhe Monochrome Laser Printer 5.-1601.1975 in Ibico Hi-Tech Manual Binding System 6.-1480.0335 in GBC DocuBind TL300 Electric Binding System 7.-1378.8216 in 3.6 Cubic Foot Counter Height Office Refrigerator 8.-1181.2824 in Hoover Upright Vacuum With Dirt Cup 9.-1147.0074 in GBC ProClick 150 Presentation Binding System 10.-1141.4700 in GBC Ibimaster 500 Manual ProClick Binding System
Pada suatu siang, laptop Randolf dan Afairuzr dibajak oleh seseorang dan kehilangan data-data penting. Untuk mencegah kejadian yang sama terulang kembali mereka meminta bantuan kepada Whits karena dia adalah seorang yang punya banyak ide. Whits memikirkan sebuah ide namun dia meminta bantuan kalian kembali agar ide tersebut cepat diselesaikan. Idenya adalah kalian
a. membuat sebuah script bash yang dapat menghasilkan password secara acak sebanyak 28 karakter yang terdapat huruf besar, huruf kecil, dan angka.
b. Password acak tersebut disimpan pada file berekstensi .txt dengan nama berdasarkan argumen yang diinputkan dan HANYA berupa alphabet.
c. Kemudian supaya file .txt tersebut tidak mudah diketahui maka nama filenya akan di enkripsi dengan menggunakan konversi huruf (string manipulation) yang disesuaikan dengan jam(0-23) dibuatnya file tersebut dengan program terpisah dengan (misal: password.txt dibuat pada jam 01.28 maka namanya berubah menjadi qbttxpse.txt dengan perintah ‘bash soal2_enkripsi.sh password.txt’. Karena p adalah huruf ke 16 dan file dibuat pada jam 1 maka 16+1=17 dan huruf ke 17 adalah q dan begitu pula seterusnya. Apabila melebihi z, akan kembali ke a, contoh: huruf w dengan jam 5.28, maka akan menjadi huruf b.) dan
d. jangan lupa untuk membuat dekripsinya supaya nama file bisa kembali.
HINT: enkripsi yang digunakan adalah caesar cipher.
Gunakan Bash Script
a. membuat sebuah script bash yang dapat menghasilkan password secara acak sebanyak 28 karakter yang terdapat huruf besar, huruf kecil, dan angka.
rand28=$(dd if=/dev/urandom | tr -dc a-zA-Z0-9 | fold -w 28 | awk '/[A-Z]/&&/[a-z]/&&/[0-9]/;a[$1]{for(i in a)print i}' | head -n1)
- Menampilkan /dev/urandom. Dalam sistem operasi mirip Unix, /dev/random, /dev/urandom dan /dev/arandom adalah file khusus yang berfungsi sebagai generator nomor pseudorandom. Wikipedia.
- Menyaring hasil generator agar memiliki format alphanumerik
tr -dc 'a-zA-Z0-9'
. - Menyingkat menjadi 28 huruf per baris
fold -w 28
. - Menyaring baris agar memiliki minimal 1 huruf kapital, 1 huruf kecil, dan 1 angka menggunakan
awk
.awk '/[A-Z]/&&/[a-z]/&&/[0-9]/;a[$1]{for(i in a)print i}'
. - Mengambil baris pertama
head -n 1
. - Disimpan ke variabel
rand28
.
b. Password acak tersebut disimpan pada file berekstensi .txt dengan nama berdasarkan argumen yang diinputkan dan HANYA berupa alphabet.
file=$(echo $@)
file=$(echo ${file%%.*} | tr -dc 'a-zA-Z')
echo "$rand28" > "$file.txt"
- Menyimpan argumen ke variabel
file
. - Memotong ekstensinya
echo ${file%%.*}
. - Menyaring agar tersisa hanya alphabet
tr -dc 'a-zA-Z'
. - Menyimpan hasil dari poin a ke file dengan nama berdasarkan argumen yang telah diproses.
echo "$rand28" > "$file.txt"
.
c. Kemudian supaya file .txt tersebut tidak mudah diketahui maka nama filenya akan di enkripsi dengan menggunakan konversi huruf (string manipulation) yang disesuaikan dengan jam(0-23) dibuatnya file tersebut dengan program terpisah.
#!/bin/bash
chr() { printf \\$(printf '%03o' $1); }
file=$(echo $@)
file=$(echo ${file%%.*} | tr -dc A-Za-z)
cr=$(sudo debugfs -R 'stat <'"$(stat -c %i $file.txt)"'>' "$(df --output=source $file.txt | tail -n1)" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*' | cut -c12-13)
if [[ $cr != 00 ]]; then
shift=$(chr $(($cr + 65)))-ZA-$(chr $(($cr + 64)))$(chr $(($cr + 97)))-za-$(chr $(($cr + 96)))
CC=$(echo $file | tr $shift A-Za-z)
mv "$file.txt" "$CC.txt"
fi
- Fungsi “chr” digunakan untuk mengkonversi angka menjadi huruf sesuai dengan standar ASCII.
- Menyimpan argumen ke variabel
file
. - Menghapus ekstensi dan karakter selain alfabet pada variabel
file
. - Mencari tahu kapan file dengan nama
file
.txt dibuat dengan menggunakan perintahdebugfs
untuk menemukan waktu pembuatan file, dengan-R
yang menginstruksikan debugfs untuk mengeksekusi perintah eksternal tunggal lalu keluar yaitustat
dengan argumen inode dan filesystem. Nomor inode didapatkan dari hasil perintahstat -c %i
terhadap file tersebut atau bisa juga dengan menggunakan perintahls -i
terhadap file tersebut. Kemudian untuk menemukan filesystem tempat file tersebut berada, cukup jalankan perintahdf --output=source
terhadap file tersebut untuk mengidentifikasi sistem filenya. Lalu kita ambil baris terakhir dari hasil perintah sebelumnya dengantail -n1
. Gunakan2>/dev/null
untuk menghilangkan error apa pun, . Hasil tersebut akan diambil tanggal dan waktu pembuatan filenya sajacrtime
menggunakangrep -oP 'crtime.*--\s*\K.*'
Lalu dipotong jamnya sajacut -c12-13
dan disimpan di variabelcr
d. Mengambil jam pembuatan dari filecrtime
, disimpan di variabelcrhour
. - Mengecek apakah file dibuat diluar jam 0.
a. Apabila file dibuat diluar jam 0, maka menggeser hurufA(65)
,@(64)
,a(97)
,`(96)
dengan offsetcr
, disimpan sesuai format(65+cr)-ZA-(64+cr)(97+cr)-za-(96+cr)
di variabelshift
.
b. Mentranslasi teks dari variabelfile
berdasarkan set pertamaA-Za-z
menjadi set keduashift
, dan hasilnya disimpan di variabelCC
.
c. Mengganti nama file dengan namafile
.txt menjadiCC
.txt .
d. jangan lupa untuk membuat dekripsinya supaya nama file bisa kembali.
- Mirip seperti poin c dengan pengecualian pada 5b dan 5c yaitu : 5b. menukar set pertama
A-Za-z
dan set keduashift
, dan hasilnya disimpan di variabeldCC
.
5c. Mengganti nama file dengan namafile
.txt menjadidCC
.txt .
1 tahun telah berlalu sejak pencampakan hati Kusuma. Akankah sang pujaan hati kembali ke naungan Kusuma? Memang tiada maaf bagi Elen. Tapi apa daya hati yang sudah hancur, Kusuma masih terguncang akan sikap Elen. Melihat kesedihan Kusuma, kalian mencoba menghibur Kusuma dengan mengirimkan gambar kucing. [a] Maka dari itu, kalian mencoba membuat script untuk mendownload 28 gambar dari https://loremflickr.com/320/240/cat" menggunakan command wget dan menyimpan file dengan nama “pdkt_kusuma_NO” (contoh: pdkt_kusuma_1, pdkt_kusuma_2, pdkt_kusuma_3) serta jangan lupa untuk menyimpan log messages wget kedalam sebuah file “wget.log”. Karena kalian gak suka ribet, kalian membuat penjadwalan untuk menjalankan script download gambar tersebut. Namun, script download tersebut hanya berjalan[b] setiap 8 jam dimulai dari jam 6.05 setiap hari kecuali hari Sabtu Karena gambar yang didownload dari link tersebut bersifat random, maka ada kemungkinan gambar yang terdownload itu identik. Supaya gambar yang identik tidak dikira Kusuma sebagai spam, maka diperlukan sebuah script untuk memindahkan salah satu gambar identik. Setelah memilah gambar yang identik, maka dihasilkan gambar yang berbeda antara satu dengan yang lain. Gambar yang berbeda tersebut, akan kalian kirim ke Kusuma supaya hatinya kembali ceria. Setelah semua gambar telah dikirim, kalian akan
selalu menghibur Kusuma, jadi gambar yang telah terkirim tadi akan kalian simpan kedalam folder /kenangan dan kalian bisa mendownload gambar baru lagi. [c] Maka dari itu buatlah sebuah script untuk mengidentifikasi gambar yang identik dari keseluruhan gambar yang terdownload tadi. Bila terindikasi sebagai gambar yang identik, maka sisakan 1 gambar dan pindahkan sisa file identik tersebut ke dalam folder ./duplicate
dengan format filename “duplicate_nomor” (contoh : duplicate_200, duplicate_201). Setelah itu lakukan pemindahan semua gambar yang tersisa kedalam folder ./kenangan
dengan format filename “kenangan_nomor” (contoh: kenangan_252, kenangan_253). Setelah tidak ada gambar di current directory, maka lakukan backup seluruh log menjadi
ekstensi “.log.bak”.
Hint : Gunakan wget.log untuk membuat location.log yang isinya
merupakan hasil dari grep “Location”. Gunakan Bash, Awk dan Crontab
a. Maka dari itu, kalian mencoba membuat script untuk mendownload 28 gambar dari https://loremflickr.com/320/240/cat" menggunakan command wget dan menyimpan file dengan nama “pdkt_kusuma_NO” (contoh: pdkt_kusuma_1, pdkt_kusuma_2, pdkt_kusuma_3) serta jangan lupa untuk menyimpan log messages wget kedalam sebuah file “wget.log”.
#!/bin/bash
rm wget.log 2>/dev/null
for i in `seq 1 28`; do
wget https://loremflickr.com/320/240/cat -O pdkt_kusuma_$i -a wget.log
done
- Menghapus wget.log bila ada.
- Melakukan perulangan 28 kali
for i in `seq 1 28`
pada link yang telah disediakan untuk mengunduh gambar secara randomwget https://loremflickr.com/320/240/cat
. - Tidak lupa untuk mengganti namanya sesuai dengan urutan pengunduhan
-O pdkt_kusuma_$i
dan memasukkannya kedalam log-a wget.log
.
b. Menjalankan script download gambar tersebut. Namun, script download tersebut hanya berjalan setiap 8 jam dimulai dari jam 6.05 setiap hari kecuali hari Sabtu
crontab -e
:
5 6-23/8 * * 0-5 /<path>/soal3.sh
- Cron diatas
5 6-23/8 * * 0-5
dapat diartikan bahwa setiap 8 jam sekali yang dimulai pada pukul 6.05 akan dijalankan programsoal3.sh
/<path>/soal3.sh
. Namun pada hari Sabtu tidak dijalankan pengunduhan sama sekali. - Jangan lupa mengganti permission agar bisa dieksekusi langsung
chmod +x
atau menambahkan/bin/bash
sebelum file pada crontab.
c. Maka dari itu buatlah sebuah script untuk mengidentifikasi gambar yang identik dari keseluruhan gambar yang terdownload tadi. Bila terindikasi sebagai gambar yang identik, maka sisakan 1 gambar dan pindahkan sisa file identik tersebut ke dalam folder ./duplicate
dengan format filename “duplicate_nomor” (contoh : duplicate_200, duplicate_201). Setelah itu lakukan pemindahan semua gambar yang tersisa kedalam folder ./kenangan
dengan format filename “kenangan_nomor” (contoh: kenangan_252, kenangan_253). Setelah tidak ada gambar di current directory, maka lakukan backup seluruh log menjadi
ekstensi “.log.bak”.
#!/bin/bash
fix() {
n=$(ls 2>/dev/null -1 -- ./"$1"/"$1"_* | wc -l)
for i in $2; do
let n+=1
mv $i "./$1/$1_$n"
done
}
grep 'Location:' wget.log | cut -c32-53 | tr -d "_" > location.log
a=($(paste "./location.log" <(echo -e "pdkt_kusuma_"{1..28}"\n" | tr -d " ") | awk -F \\t '{a[$1]=$2}END{for(i in a)if(i)print a[i]}' | sort -k2))
b=($(ls pdkt_kusuma_* | sort))
c=()
for i in "${b[@]}"; do
skip=
for j in "${a[@]}"; do
[[ $i == $j ]] && { skip=1; break; }
done
[[ -n $skip ]] || c+=("$i")
done
mkdir -p duplicate kenangan
fix duplicate "${c[*]}"
fix kenangan "${a[*]}"
mv ./wget.log{,.bak}
- Fungsi
fix
:
a. Menghitung jumlah file dengan nama yang berawalan dengan argumen pertama pada direktori memiliki nama yang sama dengan argumen pertama digabung garis bawah dengan carals -1
untuk menampilkan isi direktori secara baris demi baris,2>/dev/null
untuk mengalihkan error,--
sebagai pemisah antara opsi dan argumen,wc -l
untuk menghitung jumlah baris, hasil hitungan disimpan di variabeln
.
b. Mengulang sejumlah elemen direpresentasikan oleh variabeli
pada argumen kedua untuk menambah 1 pada variabeln
dan memindah file dengan nama yang sama dengan variabeli
ke direktori dengan nama yang sama dengan argumen pertama serta mengganti nama file tersebut menjadi sama seperti argumen pertama digabung garis bawah dan variabeln
. - Mencari baris yang memiliki tulisan awal
Location:
pada wget.loggrep 'Location:' wget.log
kemudian dipotong pada karakter ke-32 hingga karakter ke-53cut -c32-53
yang mana merupakan nomor seri pada nama file di URL file tersebut dan menghilangkan garis bawahtr -d "_"
untuk mempermudah pengurutan lalu disimpan sebagailocation.log
. - Menampilkan isi
location.log
lalu menempelkanpdkt_kusuma_NO
dengan nomor 1 - 28 di setiap baris di belakangnya. Menghilangkan baris dengan nomor seri yang sama menggunakanawk
a[$1]=$2
dan menghilangkan baris kosongif(i)
dan mengurutkan hasilnyasort -k2
disimpan di variabela
. - Melakukan pengurutan file dengan nama yang dimulai dengan
pdkt_kusuma_
pada direktorils pdkt_kusuma_*
kemudian diurutkansort
dan disimpan sebagai variabelb
yang akan berfungsi sebagai referensi. - Membuat array kosong bernama
c
.c=()
. - Membandingkan
a
denganb
dan menyimpan elemen yang ada dib
namun tidak ada dia
kec
dengan cara membuat perulangan untuk setiap elemen dalamb
,for i in "${b[@]}"
membuat variabelskip
dengan nilai 0,skip=
dan membuat perulangan untuk setiap elemen dalama
,for j in "${a[@]}"for j in "${a[@]}"
, apabila elemen dalama
danb
sama, maka mengganti nilaiskip
menjadi 1,[[ $i == $j ]]
skip=1
dan keluar dari perulangan elemena
,break
. Apabila nilaiskip
masih 0 ketika perulangan elemena
selesai,[[ -n $skip ]]
maka elemen tersebut dimasukkan kec
,c+=("$i")
. - Membuat direktori “duplicate” dan “kenangan” apabila tidak ada,
mkdir -p duplicate kenangan
. - Memanggil fungsi
fix
dengan argumenduplicate
dan"${c[*]}"
. - Memanggil fungsi
fix
dengan argumenkenangan
dan"${a[*]}"
. - Terakhir mencadangkan log,
mv ./wget.log{,.bak}
.