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
while
loop saja. - Jika melakukan suatu proses dengan adanya penyematan variabel didalamnya, maka pipe tidak bisa digunakan. Bisa menggunakan
for
atauwhile
loop.
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.