Perintah grep Linux: mencari teks dan menyaring keluaran

grep adalah perintah yang digunakan untuk menemukan baris yang cocok dengan pola tertentu dalam file atau output perintah. Ini mendukung tidak hanya pencarian dasar tetapi juga mengabaikan huruf besar/kecil, memilih baris yang tidak cocok, pencarian direktori secara rekursif, ekspresi reguler, dan menampilkan konteks di sekitarnya.

Bentuk paling dasar adalah grep 'pattern' filename. Karena pola mungkin berisi karakter yang memiliki arti khusus di shell, lebih aman jika terbiasa mengapitnya dengan tanda kutip tunggal.

Apa itu perintah grep?

grep membaca input baris demi baris dan menampilkan baris yang sesuai dengan pola. Nama ini berasal dari pernyataan perintah dalam editor teks Unix ed, g/re/p, yang berarti mencari dan mencetak baris yang sesuai dengan ekspresi reguler di seluruh rentang.

Dalam pencarian biasa tanpa file, grep membaca input standar, sehingga Anda dapat menyalurkan output dari perintah lain untuk mencarinya. Pada GNU grep, opsi rekursif tanpa operand direktori memakai direktori kerja saat ini. Sintaks pola default dari GNU grep adalah Ekspresi Reguler Dasar (BRE), dan menggunakan -E memungkinkan penggunaan Ekspresi Reguler Diperluas (ERE).

Sintaks Dasar dan Pencarian Pertama

Sintaks dasar adalah sebagai berikut. Tanda kurung siku menunjukkan item opsional, jadi jangan masukkan mereka dalam perintah sebenarnya.

grep [option] 'pattern' [file...]

Untuk menemukan baris yang mengandung ERROR di app.log, jalankan sebagai berikut.

grep 'ERROR' app.log

Jika Anda menentukan beberapa file, nama file muncul bersama setiap hasil.

grep 'ERROR' app.log worker.log

Anda juga dapat mencari input standar. Perintah berikut menunjukkan baris dalam pesan kernel yang mengandung usb, tanpa membedakan huruf besar/kecil.

dmesg | grep -i 'usb'

Akses ke pesan kernel dapat dibatasi oleh sistem; jika dmesg ditolak, periksa kebijakan akses dan izin yang berlaku.

Opsi grep yang sering digunakan

Opsi Fungsi Contoh Penggunaan
-i Cari tanpa membedakan huruf besar/kecil grep -i 'error' app.log
-v Pilih baris yang tidak cocok grep -v '^#' config
-n Tampilkan nomor baris dalam hasil grep -n 'TODO' main.c
-w Cari pola sebagai kata utuh grep -w 'cat' words.txt
-x Pilih seluruh baris saat cocok dengan pola grep -x 'enabled' status.txt
-F Perlakukan pola sebagai string tetap, bukan ekspresi reguler grep -F 'a.b' data.txt
-E Gunakan ekspresi reguler yang diperluas grep -E 'error|failed' app.log
-r Cari secara rekursif di subdirektori grep -r 'listen' /etc/nginx
-l Cetak hanya nama file yang cocok grep -rl 'deprecated' src
-c Cetak jumlah baris yang cocok per file grep -c 'ERROR' app.log
-A, -B, -C Cetak konteks setelah, sebelum, atau di sekitar baris yang cocok grep -C 2 'panic' app.log

Opsi di atas dapat digabungkan. Misalnya, grep -in 'error' app.log akan melakukan pencarian sambil mengabaikan huruf besar/kecil dan juga menampilkan nomor baris. Perilaku rinci dan opsi ekstensi GNU dapat ditemukan di manual GNU grep.

Membedakan Antara String dan Ekspresi Reguler

Cari string tetap dengan -F

Karakter yang memiliki makna khusus dalam ekspresi reguler, seperti titik, asterisk, dan tanda kurung, dapat dicari secara literal menggunakan -F. Dalam perintah berikut, titik diperlakukan sebagai titik sebenarnya dan bukan karakter apa pun.

grep -F '192.168.0.1' access.log

Jika istilah pencarian adalah string sederhana, Anda dapat mengurangi escape yang tidak perlu dan membuat niat Anda lebih jelas.

Gunakan ekspresi reguler diperluas dengan -E

Menggunakan -E memungkinkan Anda menggunakan sintaks ekspresi reguler diperluas, seperti |, +, ?, dan tanda kurung, lebih terbaca. Contoh berikut menemukan baris yang berisi salah satu dari ERROR, WARN, atau FATAL.

grep -E 'ERROR|WARN|FATAL' app.log

Dalam GNU grep, perbedaan antara ekspresi reguler dasar dan diperluas terutama terletak pada notasinya. Jika kompatibilitas dengan lingkungan lain penting, periksa implementasi grep sistem target dan opsi yang didukung.

Tentukan awal dan akhir sebuah baris

Simbol caret (^) menunjukkan awal dari sebuah baris, dan simbol dolar ($) menunjukkan akhir dari sebuah baris. Sebuah baris kosong dapat ditemukan dengan ^$, yang tidak memiliki karakter antara awal dan akhir.

grep '^server' config.txt
grep 'completed$' job.log
grep '^$' notes.txt

Untuk mengecualikan baris kosong dan baris komentar dari file konfigurasi, Anda dapat menerapkan dua kondisi tersebut secara berurutan seperti berikut.

grep -v '^[[:space:]]*#' app.conf | grep -v '^[[:space:]]*$'

Memperkecil rentang pencarian secara tepat

Mencocokkan seluruh kata dan seluruh baris

-w memilih baris di mana pola cocok dengan seluruh kata. Sebagai contoh, grep -w 'cat' akan menemukan cat tetapi tidak akan memilih cat di dalam category.

grep -w 'root' /etc/passwd

-x memilih satu baris hanya ketika seluruh baris cocok persis dengan pola.

grep -x 'active' service-status.txt

Menemukan baris yang tidak cocok

-v membalikkan pemilihan. Contoh berikut mencetak hanya baris yang tidak mengandung DEBUG.

grep -v 'DEBUG' app.log

Ketika digabungkan dengan -i, Anda dapat mengecualikan tanpa memperhatikan huruf besar atau kecil.

grep -iv 'debug' app.log

Mencari beberapa pola sekaligus

Menggunakan -e beberapa kali memungkinkan Anda menentukan setiap pola secara terpisah. Anda tidak perlu menggabungkannya menjadi satu ekspresi reguler kompleks, sehingga lebih mudah dibaca dalam skrip.

grep -e 'ERROR' -e 'FATAL' app.log

Jika ada banyak pola, Anda dapat membuat file dengan satu pola per baris dan membacanya dengan -f.

grep -f patterns.txt app.log

Mencari seluruh direktori secara rekursif

Perbedaan antara -r dan -R

-r mencari file secara rekursif di bawah direktori yang ditentukan. Ini mengikuti tautan simbolik yang ditentukan langsung di baris perintah, tetapi melewati tautan simbolik yang ditemukan selama pencarian rekursif.

grep -rn 'database_url' ./config

Opsi -R pada GNU grep mengikuti tautan simbolik yang ditemukan selama pencarian rekursif. Tautan yang sudah ada dapat menyebabkan loop atau memperluas cakupan pencarian; opsi ini tidak membuat tautan. Gunakan hanya jika cakupannya dipahami.

Menyertakan dan Mengecualikan Jenis File

--include hanya mencari pola nama file yang ditentukan, dan --exclude melewati file yang cocok. Masukkan pola dalam tanda kutip agar shell tidak memperluas tanda bintang terlebih dahulu.

grep -rn --include='*.conf' 'timeout' /etc
grep -rn --exclude='*.min.js' 'deprecated' ./src

Untuk mengecualikan direktori tertentu, gunakan --exclude-dir.

grep -rn --exclude-dir='.git' --exclude-dir='node_modules' 'api_key' .

Periksa hanya nama file yang cocok

Jika Anda memerlukan daftar file daripada konten yang cocok, gunakan -l. Setiap file berhenti dicari setelah menemukan kecocokan pertama, yang juga sesuai dengan tujuannya.

grep -rl --include='*.html' 'jb-heading' .

Sebaliknya, untuk menemukan hanya file tanpa pola yang cocok, gunakan -L versi huruf kapital.

grep -rL --include='*.html' 'jb-heading' .

Keluarkan hasil dalam format yang dapat dibaca

Tampilkan nomor baris dan nama file

-n menampilkan nomor baris dari baris yang cocok. Bahkan saat mencari di satu file saja, untuk memaksa tampilan nama file, gunakan -H pada grep GNU, dan untuk menyembunyikan nama file, gunakan -h.

grep -nH 'listen' nginx.conf

Melihat konteks sebelum dan sesudah baris yang cocok

Jika sulit menentukan penyebab hanya dari baris kesalahan, gunakan -A, -B, atau -C untuk melihat baris di sekitarnya. Angka menunjukkan berapa banyak baris tambahan yang dicetak.

grep -A 3 'ERROR' app.log
grep -B 2 'ERROR' app.log
grep -C 2 'ERROR' app.log

-A 3 menambahkan 3 baris setelah, -B 2 menambahkan 2 baris sebelum, dan -C 2 menambahkan 2 baris sebelum dan setelah.

Mencetak hanya bagian yang cocok

-o mencetak hanya bagian yang cocok dengan pola, bukan seluruh baris. Jika cocok berkali-kali dalam satu baris, setiap kecocokan dicetak secara terpisah.

grep -oE '[0-9]{3}-[0-9]{4}' contacts.txt

Untuk menyoroti kecocokan di terminal, Anda dapat menggunakan --color=auto. Saat mengirimkan keluaran ke file atau perintah lain, gunakan auto atau never untuk mencegah karakter kontrol warna tercampur.

Menggunakannya di log dan keluaran perintah

Menemukan Kesalahan dalam Log Terbaru

Untuk mencari hanya rentang terbaru daripada seluruh log, hubungkan dengan tail.

tail -n 500 app.log | grep -iE 'error|failed|fatal'

Jika Anda ingin terus memfilter log baru yang ditambahkan ke file, Anda dapat menggunakannya sebagai berikut.

tail -F app.log | grep --line-buffered 'ERROR'

--line-buffered adalah opsi ekstensi GNU yang mengosongkan buffer setelah setiap baris keluaran, sehingga mengurangi penundaan dalam jalur pipa. Metode untuk melacak, termasuk rotasi log, dapat ditemukan di panduan perintah tail Linux.

Menyaring Hasil Layanan dan Proses

Anda dapat mencari nama layanan tertentu dalam output systemctl.

systemctl list-unit-files | grep 'nginx'

Jika tujuan Anda hanya untuk memeriksa keberadaan sebuah proses, pgrep seringkali lebih langsung daripada ps | grep. Untuk mencari dengan nama perintah dan argumennya bersama-sama, Anda dapat mengeksekusinya sebagai berikut.

pgrep -af 'nginx'

Menghitung Baris yang Cocok

-c mencetak jumlah baris yang cocok, bukan jumlah kecocokan. Bahkan jika sebuah baris mengandung pola beberapa kali, baris tersebut hanya dihitung sekali.

grep -c 'ERROR' app.log

Untuk menghitung semua kemunculan yang cocok dalam satu baris, Anda bisa memisahkan setiap kecocokan dengan -o dan lalu menghitung dengan wc -l.

grep -o 'ERROR' app.log | wc -l

Periksa keberadaan tanpa output

-q tidak mencetak hasil dan hanya mengembalikan status keluar. Ini cocok untuk memeriksa keberadaan sebuah pola dalam kondisi shell.

if grep -q 'ready' status.log; then
 echo 'Service ready'
fi

Memahami status keluar grep

grep menyampaikan hasil pencarian tidak hanya melalui string output tetapi juga melalui status keluar. Biasanya, ini mengembalikan 0 jika ada baris yang cocok, 1 jika tidak ada baris yang cocok, dan 2 jika tidak dapat membaca file atau ada masalah sintaks.

Status keluar Arti Keputusan dalam skrip
0 Satu atau lebih kecocokan ditemukan Diproses seolah kondisi benar
1 Tidak ada kecocokan ditemukan Bisa menjadi hasil pencarian normal
2 Terjadi kesalahan Periksa file input, izin, atau pola

Oleh karena itu, Anda tidak boleh menyimpulkan bahwa eksekusi perintah itu sendiri gagal hanya karena tidak ada hasil. Dalam otomasi, Anda perlu membedakan antara 1 dan kesalahan nyata 2. GNU grep -q dapat berakhir dengan status 0 jika ditemukan kecocokan, bahkan jika ada kesalahan lain, jadi jika mendeteksi kesalahan di semua file input penting, verifikasi terpisah diperlukan.

Masalah umum dan solusi

Saat pola dimulai dengan tanda hubung

Pola -ERROR seperti ini dapat salah dikira sebagai opsi. Tempatkan pola setelah --, yang menunjukkan akhir dari opsi.

grep -- '-ERROR' app.log

Saat pesan 'Binary file matches' muncul

Jika GNU grep menentukan bahwa input adalah file biner, program dapat menampilkan pesan alih-alih mencocokkan baris. Jika Anda yakin itu sebenarnya adalah file teks, Anda dapat menganggapnya sebagai teks menggunakan -a.

grep -a 'ERROR' mixed-data.log

Sebaliknya, untuk mengecualikan file yang terdeteksi biner dalam pencarian rekursif, Anda dapat menggunakan -I; bagian biner diperlakukan seolah tidak cocok. Jangan selalu menggunakan -a pada data biner yang tidak diketahui, karena mungkin berisi karakter kontrol yang dapat mengacaukan terminal Anda.

Ketika hasil berbeda karena karakter khusus regex

Titik mencocokkan karakter tunggal apa pun dan asterisk berarti pengulangan dari ekspresi sebelumnya dalam ekspresi reguler. Jika Anda bermaksud mencari string sederhana, gunakan -F, dan jika Anda bermaksud menggunakan ekspresi reguler, bungkus seluruh pola dalam tanda kutip tunggal untuk mencegah ekspansi shell.

Ketika pencarian rekursif terlalu lambat atau menghasilkan terlalu banyak hasil

Persempit direktori awal untuk pencarian dan kecualikan file yang tidak diperlukan menggunakan --include, --exclude, dan --exclude-dir. Untuk menyembunyikan hanya kesalahan izin, Anda mungkin tergoda untuk membuang semua kesalahan standar, tetapi melakukan hal itu dapat menyebabkan Anda melewatkan masalah penting. Oleh karena itu, lebih baik terlebih dahulu memeriksa cakupan pencarian dan izin file.

Pertanyaan yang Sering Diajukan

Apakah grep secara default membedakan huruf besar dan huruf kecil?

Ya. Pencarian default bersifat case-sensitive. Untuk mengabaikan huruf besar/kecil, gunakan -i. Anda juga harus mempertimbangkan bahwa hasil penanganan huruf besar/kecil dapat bervariasi tergantung pada locale.

Apa perbedaan antara grep -r dan grep -R?

Dalam GNU grep, keduanya melakukan pencarian rekursif, tetapi -R mengikuti semua symbolic link yang ditemui selama pencarian. Untuk pencarian kode sumber atau file konfigurasi yang biasa, -r lebih mudah diprediksi.

Apakah ini merupakan kesalahan jika tidak ditemukan hasil pencarian?

Tidak selalu. Jika tidak ada kecocokan, biasanya akan mengembalikan status keluar 1, sementara kesalahan seperti kegagalan akses file atau opsi yang tidak valid dibedakan oleh status 2.

Bagaimana cara menemukan baris yang berisi setidaknya satu dari beberapa istilah pencarian?

grep -E 'error|warning' filename menggunakan operator alternasi dalam ekspresi reguler yang diperluas, atau Anda dapat mengulang -e seperti grep -e 'error' -e 'warning' filename. Untuk memperlakukan istilah pencarian sebagai string biasa daripada ekspresi reguler, Anda juga dapat menggunakan -F.

Ringkasan

Untuk pencarian string umum, sebaiknya membiasakan diri dengan grep -F; untuk beberapa kondisi ekspresi reguler, grep -E; dan untuk mencari seluruh direktori, grep -r. Untuk membuat hasil lebih mudah diinterpretasikan, Anda dapat menggunakan -n dan -C; jika Anda hanya membutuhkan daftar file, gunakan -l; dan untuk memeriksa keberadaan dalam skrip, gunakan -q.

Bungkus pola dalam tanda kutip tunggal, batasi secara khusus cakupan pencarian rekursif, dan bedakan antara status keluar 1 dan status kesalahan 2—ini adalah kunci untuk penggunaan yang aman. Untuk menjelajahi alat dasar lainnya secara bersamaan, lihat daftar perintah Linux yang sering digunakan (bahasa Inggris).