Wednesday, December 12, 2007

The Power Of Unix Shell

Kemarin malam, aku melakukan kesalahan bodoh dalam membuat script menggunakan bahasa PHP. Intinya sih script yang aku buat akan memberikan output file yang merepresentasikan isi dari suatu query ke database MySQL. Masing-masing field akan dipisahkan oleh tanda semicolon (;) dan masing-masing row akan dipisahkan oleh karakter newline (\n).

Berhubung karena aku melakukan kesalahan, aku lupa menambahkan karakter newline yang akan menjadi pemisah antar row. Karena kesalahan ini, file output tersebut hanya berisi satu baris. Terlebih lagi hasil query data yang aku lakukan juga lumayan banyak, maka ukuran file output tersebut juga lumayan besar. Isi file tersebut memiliki format :

aaaa1;bbbb1;cccc1;dddd1;eeee1;fffff1;;;;;;aaaa2;bbbb2;cccc2;dddd2..... (dst)

Entah juga apakah ini merupakan kesalahan lain dari scriptku atau bukan. Satu row query berisi enam field. Tapi jika melihat isi filenya seolah ada 11 field. Tapi beruntung juga sih, karena kesalahan ini aku bisa melihat bahwa masing-masing row dipisahkan oleh string ';;;;;;'.

Setelah berpikir lumayan lama mengenai solusi untuk memecahkan masalah ini - yang diantaranya adalah membuat script lain yang akan memecah satu baris file tersebut sesuai dengan jumlah row hasil query -, aku mencoba cara lain yang lebih sederhana, yaitu membuka file tersebut menggunakan editor dan me-replace semua string ';;;;;;' dengan karakter newline. Ternyata, karena saking besarnya ukuran file, ketika dibuka saja aplikasi editornya udah nge-hang duluan.

Akhirnya aku mencoba untuk mengutak-atik isi filenya mengunakan perintah di Shell. Ternyata hanya dengan menggunakan perintah sed (stream editor), semua masalah bisa terselesaikan. Untuk me-replace semua string ';;;;;;' menjadi karakter newline, hanya perlu menggunakan perintah

sed 's/;;;;;;/\n/g' [nama file]

Lama-lama jadi semakin betah aja ngutak-ngatik perintah-perintah Shell di Unix :P. Praktis dan cepat, tanpa perlu membuka file dan melihat isinya, semuanya langsung dikerjakan oleh satu baris perintah. Mungkin masalah diatas juga bisa diselesaikan menggukana editor vi. Cuma berhubung masalahnya udah selesai, nggak aku cobain deh tuh vi nya.

9 comments:

kunderemp said...

Jika file yang mau diubah banyak,
sed bisa dikombinasikan dengan find

Eko Budi Prasetyo said...

Untungnya cuma satu filenya :P

fajran said...

wah baru ngerasain ya lu ko :P

banyak aplikasi2 kecil yang bisa membaca stream dan ngeluarin stream. sed itu salah satunya aja..

contoh yg pernah gw lakukan tuk membuat Packages dan Packages.bz2 dari Packages.gz

zcat Packages.gz | tee Packages | bzip2 -9 -c > Packages.bz2

tuk ngedump+ngompress database jg enak

mysqldump blahblah | gzip -9 -c > data.sql.gz

Eko Budi Prasetyo said...

Yoi.. banyak sih command-command kecil tapi bener2 berguna banget. Makanya aku suka Ubuntu gara-gara itu jg.

* ga nyambung *

jpmrblood said...

Welcome to unix shell. :P

Jangan lupa awk, cut, tail, cat, dll.

Eko Budi Prasetyo said...

Yoi Pe, lagi belajar nih. Secara sekarang tiap hari udah pake Ubuntu. Hehehe

Btw, AWK masih terlalu advanced. Belajarnya satu-satu lah. Lagipula yang kayak bgini kan kebanyakan dapet ilmunya dari pengalamanan juga, nggak cuma dari baca teori doang.

fajran said...

cut lumayan tuk tokenizer..

misal tuk ngambil kolom ke 2 dg delimiter spasi

$ cat file | cut -d' ' -f 2

Eko Budi Prasetyo said...

Hehehe, itu salah satunya yang cukup berguna. Yang sering dipake ls, grep, cat, cut, ampe sed juga :P

jefri said...

hedopppp windows!!!