
Dalam menulis script, terkadang kita ingin menjalankan sekumpulan perintah berdasarkan data yang ada pada suatu file (baik raw file, csv, dsb). Kemudian juga terkadang, kita ingin menuliskan suatu script yang menghasilkan suatu file berupa log, atau data terstruktur seperti csv, dan sebagainya.
Maka, pada seri tulisan “Belajar Bash Scripting” kali ini, saya akan membahas mengenai bagaimana cara membaca dan menghasilkan suatu file pada bash.
Membaca File
Secara umum, suatu file teks bisa dibaca menggunakan perintah cat:
| |
Sebenarnya, perintah cat ini berfungsi untuk menggabungkan file menjadi 1 dan menampilkannya pada stdout.
Karena fungsinya demikian, ketika argumen yang diberikan hanyalah 1 saja, maka tentu yang muncul hanya isi dari file tersebut. Dengan demikian, hal tersebut bisa dimanfaatkan untuk keperluan “membaca isi file”.
Biasanya cat digunakan untuk membaca/membuka file yang kemudian akan diproses menggunakan perintah lain agar mudah dibaca. Beberapa perintah mendukung input langsung melalui stdin sehingga cat tidak diperlukan.
Menyimpan isi file kedalam variabel
Menggunakan process substitution:
| |
Menggunakan printf:
| |
Membaca file baris-per-baris
Ada beberapa cara untuk melakukan hal ini, tergantung dengan tujuannya. Namun, seluruhnya menggunakan loop, baik for atau while
- Jika hanya melakukan suatu proses tanpa adanya penyematan variabel, maka bisa menggunakan pipe. Hanya bisa dengan
whileloop saja. - Jika melakukan suatu proses dengan adanya penyematan variabel didalamnya, maka pipe tidak bisa digunakan. Bisa menggunakan
foratauwhileloop.
Semua proses yang berjalan didalam pipeline, itu berjalan pada subshell. Pada subshell, semua penyematan variabel hanya berdampak pada lingkup subshell itu sendiri dan tidak terekspos ke shell diatasnya.
Loop menggunakan pipe
Menggunakan kombinasi while read dengan inputan dari pipe:
| |
Pada contoh diatas, tiap baris yang ada pada file, bisa diakses menggunakan variabel $line (bisa diganti sesuai keinginan, while read -r baris misalnya) dan berurutan. Dalam bentuk seperti ini, semua penyematan variabel tidak akan tersimpan.
Loop tanpa pipe
Masih menggunakan kombinasi while read dengan inputan dari <:
| |
Metode yang ini digunakan apabile jika operasi yang ingin dilakukan terdapat penyematan variabel berdasarkan data yang ada pada baris yang dibaca.
Loop for juga bisa digunakan, namun secara asal (default), akan bermasalah jika baris yang ada di dalam file itu lebih dari 1 kata (dipisahkan dengan spasi):
| |
Untuk mengatasi limitasi diatas, perlu mengatur variabel internal IFS (Internal Field Separator) untuk memberitahu for, pada momen apa suatu baris itu berganti.
| |
Secara asal, variabel IFS berisikan 1 spasi. Sehingga for (dan perintah lain) akan memaknai ganti “kolom” ketika bertemu spasi.
Contoh tanpa mengganti IFS:
| |
Hasilnya adalah setiap barisnya akan terpecah (split) pada spasi, sehingga menjadi tidak sesuai harapan.
Contoh dengan mengganti IFS:
| |
Membaca file csv
File csv adalah suatu file yang tiap barisnya berisikan kolom-kolom yang dipisahkan (delimiter atau separator) dengan tanda koma , (atau separator yang lain, seperti spasi, tab, dsb).
Contoh file csv:
| |
Misal, kita ingin membuat script untuk meng-generate alamat email berdasarkan data diatas. Maka, kita bisa menggunakan kombinasi while read loop dan IFS untuk memisahkan masing-masing kolomnya.
| |
Sintaks ${variabel,,} merupakan salah satu dari fungsi Parameter Expansion dari Bash untuk mengubah isi variabel menjadi huruf kecil seluruhnya. Untuk menjadikan seluruhnya huruf kapital, gunakan ${variabel^^}. InsyaAllah, akan datang pembahasan tersendiri mengenai Parameter Expansion Bash.
Sintaks read -r nama kota ... diatas, akan menghasilkan variabel dengan nama-nama tersebut, sesuai dengan urutan di dalam file inputnya.
Misal, baris-baris dalam file input tersebut memiliki kolom-kolom berikut:
| |
maka, pada sintaks read ke-empat kolom tersebut bisa langsung disematkan kepada variabel dengan cara menyebutkan nama variabel sasuai dengan urutannya:
| |
Variabel bisa diberi nama secara bebas, seperti:
| |
Contoh diatas akan menghasilkan output berikut:
| |
Kemudian, jika file csv-nya memiliki delimiter berupa tab. Maka IFS bisa diset menjadi IFS=$'\t'.
Kesimpulan
Pada Bash, melakukan pembacaan baris-per-baris dari suatu file, bisa menggunakan for dan while loop. Untuk while loop, bisa melakukan looping pada pipe atau langsung menggunakan stdin (<).
Namun jika menggunakan pipe, maka penyematan variabel akan diabaikan.
Sekian artikel kali ini, semoga bermanfaat barakallahufiikum.