Pada bab sebelumnya Anda 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, Anda 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 Anda mengolah teks dengan cepat. Setelah memahami bab ini, Anda akan mampu merangkai perintah sederhana menjadi alur kerja yang jauh lebih produktif.
Standard Input, Output, dan Error
Setiap proses di Linux memiliki tiga aliran (stream) data bawaan yang dikenal sebagai standard stream. Ketiga aliran ini dihubungkan ke terminal secara otomatis saat sebuah perintah dijalankan. Masing-masing aliran ini memiliki nomor identitas yang disebut file descriptor, yang akan Anda 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 Anda menjalankan sebuah perintah, hasilnya dicetak ke stdout, sementara pesan kesalahan dicetak 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.
Output Redirection
Output redirection memungkinkan Anda mengalihkan keluaran sebuah perintah dari layar terminal ke sebuah file. Operator yang digunakan adalah tanda lebih besar (>).
>: Menulis ke File (Overwrite)
Operator > menuliskan keluaran perintah ke sebuah file. Jika file tersebut belum ada, ia akan dibuat. Jika file tersebut sudah ada, isinya akan ditimpa seluruhnya.
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, Anda dapat menjalankan cat daftar.txt.
Karena > menimpa file yang sudah ada, Anda harus berhati-hati agar tidak kehilangan isi file penting secara tidak sengaja.
>>: Menambah ke File (Append)
Operator >> bekerja hampir sama dengan >, tetapi alih-alih menimpa, ia menambahkan keluaran ke akhir file. Jika file belum ada, ia akan dibuat terlebih dahulu.
echo "Baris baru" >> daftar.txtSetiap kali perintah di atas dijalankan, teks Baris baru akan ditambahkan ke akhir file daftar.txt tanpa menghapus isi sebelumnya. Operator >> sangat berguna untuk mencatat log atau mengumpulkan keluaran dari beberapa perintah ke dalam satu file.
Mengalihkan Standard Error
Selain stdout, Anda 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, Anda juga bisa menggunakan 2>> untuk menambahkan pesan kesalahan ke akhir file tanpa menimpanya.
Ada kalanya Anda 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 Anda 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.
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.
<: 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.
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 dicatat bahwa secara default pipe hanya menyalurkan stdout, bukan stderr, dari perintah pertama.
ls -l | sortPerintah di atas menjalankan ls -l, lalu hasilnya langsung diurutkan oleh sort. Tidak ada file sementara yang dibuat di antaranya. Anda 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.
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.
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. Anda juga dapat membalik hasil dengan -v untuk menampilkan baris yang tidak cocok dengan pola.
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.
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.
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.
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.
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.
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. Saat opsi -i digunakan, perubahan ditulis langsung ke file.
Ringkasan Operator
Tabel berikut merangkum seluruh operator redirection dan pipe yang telah dibahas pada bab ini, sebagai referensi cepat yang bisa Anda 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 Anda terbiasa merangkai perintah dengan pipe, Anda 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 buku ini dibangun di atasnya.
Dengan berakhirnya bab ini, Anda telah menyelesaikan 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.

