Pada bab sebelumnya kita telah mempelajari cara mendapatkan bantuan di Linux melalui man, --help, info, dan tldr. Kini saatnya menutup bagian command line dengan salah satu kekuatan terbesar terminal Linux, yaitu kemampuannya menghubungkan perintah satu sama lain. Alih-alih menjalankan setiap perintah secara terpisah, kita dapat mengarahkan keluaran sebuah perintah ke file, menjadikan isi file sebagai masukan, atau menyalurkan keluaran sebuah perintah langsung ke perintah berikutnya. Konsep ini disebut redirection dan pipe, dan menjadi fondasi cara kerja terminal yang efisien. Bab ini juga memperkenalkan filter teks seperti grep, sort, dan sed yang akan membantu kita mengolah teks dengan cepat. Setelah memahami bab ini, kita akan mampu merangkai perintah sederhana menjadi alur kerja yang jauh lebih produktif.
18.1 Standard Input, Output, dan Error
Setiap proses di Linux memiliki tiga aliran (stream) data bawaan yang dikenal sebagai standard stream. Terminal menghubungkan ketiga aliran ini secara otomatis begitu sebuah perintah berjalan. Masing-masing aliran ini memiliki nomor identitas yang disebut file descriptor, yang akan kita temui kembali ketika mempelajari operator redirection untuk stderr.
| Stream | Nama | File Descriptor | Deskripsi |
|---|---|---|---|
| stdin | Standard Input | 0 | Aliran masukan yang dibaca oleh program, biasanya dari keyboard |
| stdout | Standard Output | 1 | Aliran keluaran normal hasil kerja program |
| stderr | Standard Error | 2 | Aliran keluaran untuk pesan kesalahan |
Ketika kita menjalankan sebuah perintah, sistem mencetak hasilnya ke stdout dan pesan kesalahan ke stderr. Pada keadaan normal, keduanya tampil di layar terminal sehingga terlihat menyatu. Namun keduanya sebenarnya adalah aliran yang terpisah dan dapat diarahkan secara independen. Pemahaman ini penting karena redirection bekerja terhadap aliran-aliran tersebut.
18.2 Output Redirection
Output redirection memungkinkan kita mengalihkan keluaran sebuah perintah dari layar terminal ke sebuah file. Operator yang digunakan adalah tanda lebih besar (>).
18.2.1 >: Menulis ke File (Overwrite)
Operator > menuliskan keluaran perintah ke sebuah file. Jika file tersebut belum ada, sistem akan membuatnya. Jika file tersebut sudah ada, operator ini menimpa seluruh isinya.
ls -l > daftar.txtPerintah di atas menuliskan hasil ls -l ke file daftar.txt. Tidak ada apa pun yang tampil di layar karena seluruh keluaran sudah dialihkan ke file. Untuk melihat isinya, jalankan cat daftar.txt.
Karena > menimpa file yang sudah ada, waspadai risiko kehilangan isi file penting secara tidak sengaja. Salah satu jebakan yang sering ditemui pemula adalah menjalankan perintah seperti sort daftar.txt > daftar.txt untuk "mengurutkan" file itu sendiri. Shell membuka dan mengosongkan file tujuan lebih dulu sebelum sort sempat membaca isinya, sehingga hasil akhirnya justru file kosong. Jika ingin mengurutkan sebuah file lalu menyimpan hasilnya kembali ke file yang sama, gunakan file sementara terlebih dahulu, misalnya sort daftar.txt > sementara.txt && mv sementara.txt daftar.txt.
18.2.2 >>: Menambah ke File (Append)
Operator >> bekerja hampir sama dengan >, tetapi alih-alih menimpa, ia menambahkan keluaran ke akhir file. Jika file belum ada, sistem akan membuatnya terlebih dahulu.
echo "Baris baru" >> daftar.txtSetiap kali perintah di atas berjalan, teks Baris baru bertambah di akhir file daftar.txt tanpa menghapus isi sebelumnya. Operator >> sangat berguna untuk mencatat log atau mengumpulkan keluaran dari beberapa perintah ke dalam satu file. Sysadmin sering memanfaatkan pola ini untuk mengumpulkan output dari beberapa proses backup atau cron job ke dalam satu file log harian.
18.2.3 Mengalihkan Standard Error
Selain stdout, kita juga dapat mengalihkan stderr secara terpisah menggunakan operator 2>, sesuai dengan nomor file descriptor stderr yang telah dibahas sebelumnya. Sebagai contoh:
perintah-yang-salah 2> error.txtPerintah di atas akan menyimpan pesan kesalahan ke file error.txt, sementara keluaran normal (jika ada) tetap tampil di layar. Sama seperti >> pada stdout, kita juga bisa menggunakan 2>> untuk menambahkan pesan kesalahan ke akhir file tanpa menimpanya.
Ada kalanya kita ingin menggabungkan stdout dan stderr ke dalam satu file yang sama. Untuk itu, gunakan operator 2>&1 setelah redirection stdout:
perintah > semua-output.txt 2>&1Urutan di sini penting: 2>&1 berarti "arahkan stderr ke tempat yang sama dengan stdout saat ini", sehingga baris ini harus ditulis setelah > semua-output.txt. Sebagai jalan pintas yang lebih ringkas, shell Bash modern menyediakan operator &> yang mengalihkan stdout dan stderr sekaligus dalam satu langkah:
perintah &> semua-output.txtTerakhir, jika kita ingin membuang keluaran tertentu sepenuhnya tanpa menyimpannya ke mana pun, Linux menyediakan file khusus /dev/null. Menulis ke /dev/null sama seperti membuang data ke "lubang hitam"; datanya hilang begitu saja dan tidak memakan ruang disk. Pola ini sering ditemui pada script atau konfigurasi service untuk menyembunyikan pesan yang tidak penting:
perintah > /dev/null 2>&1Contoh di atas membuang seluruh keluaran normal maupun pesan kesalahan dari perintah, sehingga tidak ada apa pun yang tampil di terminal.
18.3 Input Redirection
Input redirection adalah kebalikan dari output redirection. Operator yang digunakan adalah tanda lebih kecil (<). Alih-alih membaca masukan dari keyboard, perintah membaca masukan dari sebuah file.
18.3.1 <: Membaca dari File
sort < daftar.txtPerintah di atas membuat sort membaca isi daftar.txt sebagai masukannya, kemudian mencetak hasil pengurutan ke layar. Secara fungsional, ini setara dengan sort daftar.txt karena sort memang menerima nama file sebagai argumen. Namun tidak semua perintah menerima nama file, dan di situlah input redirection menjadi berguna.
18.4 Pipe |: Menghubungkan Perintah
Pipe adalah fitur yang menjadikan terminal Linux begitu kuat. Operator | mengambil stdout dari sebuah perintah dan menyalurkannya sebagai stdin bagi perintah berikutnya, tanpa perantara file. Perlu diperhatikan bahwa secara default pipe hanya menyalurkan stdout, bukan stderr, dari perintah pertama.
ls -l | sortPerintah di atas menjalankan ls -l, lalu sort langsung mengurutkan hasilnya. Tidak ada file sementara yang tercipta di antaranya. Kita dapat merangkai beberapa pipe dalam satu baris untuk membangun alur pengolahan data yang kompleks.
cat daftar.txt | grep "Dokumen" | wc -lContoh tersebut menampilkan isi file, menyaring baris yang mengandung kata Dokumen, lalu menghitung jumlah baris hasilnya. Masing-masing perintah melakukan satu hal sederhana, dan pipe menggabungkan mereka menjadi solusi yang lebih besar. Developer sering merangkai pola seperti ini saat menelusuri log aplikasi untuk menghitung berapa kali sebuah error tertentu muncul.
18.5 Filter Teks yang Umum
Filter adalah perintah yang membaca masukan, mengolahnya, dan menuliskan hasilnya ke keluaran. Filter sangat cocok dirangkai dengan pipe. Berikut beberapa filter teks yang paling sering digunakan.
18.5.1 grep: Mencari Teks
grep mencari baris yang mengandung pola tertentu dalam sebuah file atau keluaran perintah. Ia adalah salah satu perintah paling sering dipakai di Linux.
grep "error" log.txt
grep -i "warn" log.txtOpsi -i membuat pencarian mengabaikan perbedaan huruf besar dan kecil. Kita juga dapat membalik hasil dengan -v untuk menampilkan baris yang tidak cocok dengan pola.
18.5.2 sort: Mengurutkan Output
sort mengurutkan baris-baris teks secara alfabetis atau numerik.
sort nama.txt
sort -n angka.txtOpsi -n mengurutkan secara numerik, sedangkan -r membalik urutan. Tanpa opsi tambahan, sort mengurutkan berdasarkan abjad.
18.5.3 uniq: Menghapus Duplikat
uniq menghapus baris duplikat yang berurutan. Karena hanya bekerja pada baris yang bersebelahan, biasanya uniq dirangkai setelah sort agar seluruh duplikat berkumpul.
sort nama.txt | uniqUntuk menghitung frekuensi kemunculan setiap baris, tambahkan opsi -c.
18.5.4 wc: Menghitung Baris, Kata, dan Karakter
wc adalah singkatan dari word count. Ia menghitung jumlah baris, kata, dan byte dalam sebuah file atau masukan.
wc laporan.txt
wc -l laporan.txtOpsi -l menampilkan jumlah baris saja, -w untuk jumlah kata, dan -c untuk jumlah byte. Untuk teks yang mengandung karakter multi-byte seperti emoji atau huruf beraksen, jumlah byte bisa berbeda dari jumlah karakter sebenarnya; pada kasus tersebut gunakan opsi -m yang menghitung jumlah karakter, bukan byte.
18.5.5 cut: Memotong Kolom
cut mengekstrak bagian tertentu dari setiap baris, misalnya kolom atau rentang karakter. Ia sangat berguna untuk mengolah data yang tersusun dalam kolom.
cut -d ":" -f 1 /etc/passwd
cut -c 1-5 nama.txtContoh pertama memotong file /etc/passwd dengan delimiter titik dua dan mengambil kolom pertama, yaitu daftar nama pengguna. Contoh kedua mengambil lima karakter pertama dari setiap baris.
18.5.6 awk: Pemrosesan Teks Sederhana
awk adalah bahasa pemrosesan teks yang ringkas namun sangat kuat. Untuk keperluan sederhana, awk sering dipakai untuk mengekstrak kolom tertentu.
awk '{print $1}' data.txtPerintah di atas mencetak kolom pertama dari setiap baris data.txt. Meskipun terlihat mirip dengan cut, awk jauh lebih fleksibel karena dapat melakukan perhitungan dan memproses data berdasarkan kondisi.
18.5.7 sed: Substitusi Teks
sed adalah singkatan dari stream editor. Ia mengedit aliran teks baris per baris. Penggunaan paling umum adalah substitusi teks dengan perintah s/lama/baru/.
sed 's/lama/baru/' file.txt
sed -i 's/lama/baru/' file.txtContoh pertama menampilkan hasil substitusi ke layar tanpa mengubah file, sehingga aman untuk sekadar pratinjau. Saat opsi -i digunakan, sed langsung menulis perubahan ke file dan tidak menyediakan mekanisme undo. Sebelum menjalankan sed -i pada file penting, buat cadangan otomatis dengan menambahkan ekstensi backup, misalnya sed -i.bak 's/lama/baru/' file.txt, sehingga file asli tetap tersimpan sebagai file.txt.bak.
18.6 Ringkasan Operator
Tabel berikut merangkum seluruh operator redirection dan pipe yang telah dibahas pada bab ini, sebagai referensi cepat yang bisa kita buka kembali kapan saja:
| Operator | Fungsi |
|---|---|
> | Menulis stdout ke file (menimpa isi lama) |
>> | Menambahkan stdout ke akhir file |
< | Membaca stdin dari file |
2> | Menulis stderr ke file (menimpa isi lama) |
2>> | Menambahkan stderr ke akhir file |
2>&1 | Mengarahkan stderr ke tujuan yang sama dengan stdout |
&> | Mengarahkan stdout dan stderr sekaligus ke file |
| | Menyalurkan stdout perintah pertama menjadi stdin perintah berikutnya |
Redirect, pipe, dan filter adalah tiga keterampilan yang saling melengkapi dan menjadi inti dari penggunaan terminal secara produktif. Begitu kita terbiasa merangkai perintah dengan pipe, kita akan menyadari bahwa banyak tugas yang tampak rumit sebenarnya dapat diselesaikan dengan satu baris perintah yang tersusun dari bagian-bagian sederhana. Latihlah kemampuan ini secara rutin, karena hampir seluruh materi lanjutan dalam series ini dibangun di atasnya.
Bab ini menutup seluruh materi command line dasar pada Bagian V. Pada bab berikutnya, kita akan berpindah ke Bagian VI dan mulai belajar menyunting file langsung dari terminal menggunakan nano, text editor berbasis terminal yang paling ramah bagi pemula.

