Cara Mengecualikan Pola, File, dan Direktori Dengan grep

Diterbitkan: 2022-06-29
Laptop Linux menampilkan prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Sejak 1974, perintah grep Linux telah membantu orang menemukan string dalam file. Tapi terkadang grep terlalu teliti. Berikut adalah beberapa cara untuk memberitahu grep untuk mengabaikan hal-hal yang berbeda.

Perintah grep

Perintah grep mencari file teks mencari string yang cocok dengan pola pencarian yang Anda berikan pada baris perintah. Kekuatan grep terletak pada penggunaan ekspresi regulernya. Ini memungkinkan Anda menjelaskan apa yang Anda cari, daripada harus mendefinisikannya secara eksplisit.

Kelahiran grep sudah ada sebelum Linux. itu dikembangkan pada awal 1970-an di Unix. Ini mengambil namanya dari urutan kunci g/re/p di editor baris ed (kebetulan, diucapkan "ee-dee"). Ini adalah singkatan dari g global, re gular express search, print matching lines.

grep terkenal—mungkin, terkenal—teliti dan berpikiran tunggal. Terkadang ia akan mencari file atau direktori yang Anda inginkan tanpa membuang waktu, karena hasilnya dapat membuat Anda tidak dapat melihat kayu untuk pepohonan.

Cara Menggunakan Perintah grep di Linux
TERKAIT Cara Menggunakan Perintah grep di Linux

Tentu saja, ada beberapa cara untuk mengatur grep. Anda dapat memintanya untuk mengabaikan pola, file, dan direktori sehingga grep menyelesaikan pencariannya lebih cepat, dan Anda tidak dibanjiri dengan kesalahan positif yang tidak berarti.

Tidak termasuk Pola

Untuk mencari dengan grep , Anda dapat menyalurkan input ke sana dari beberapa proses lain seperti cat , atau Anda dapat memberikan nama file sebagai parameter baris perintah terakhir.

Kami menggunakan file pendek yang berisi teks puisi Jabberwocky , oleh Lewis Carroll. Dalam dua contoh ini, kami menelusuri baris yang cocok dengan istilah penelusuran “Jabberwock”.

 cat jabberwocky.txt | grep "Jabberwock"
 grep "Jabberwock" jabberwocky.text 

Dua cara berbeda untuk mencari melalui file teks yang sama dengan grep

Baris yang berisi kecocokan dengan petunjuk pencarian terdaftar untuk kita, dengan elemen yang cocok di setiap baris disorot dengan warna merah. Itu pencarian langsung. Tetapi bagaimana jika kita ingin mengecualikan baris yang mengandung kata "Jabberwock" dan mencetak sisanya?

Kita bisa melakukannya dengan opsi -v (invert match). Ini mencantumkan baris yang tidak cocok dengan istilah pencarian.

 grep -v "Jabberwock" jabberwocky.text 

Menggunakan opsi pencarian terbalik -v dengan grep

Baris yang tidak berisi "Jabberwock" terdaftar di jendela terminal.

Semua baris yang tidak mengandung kata jabberwock

Kami dapat mengecualikan sebanyak mungkin istilah yang kami inginkan. Mari kita saring setiap baris yang mengandung "Jabberwock" dan setiap baris yang mengandung "dan." Untuk mencapai ini, kita akan menggunakan opsi -e (ekspresi). Kita perlu menggunakannya untuk setiap pola pencarian yang kita gunakan.

 grep -v -e "Jabberwock" -e "dan" jabberwocky.txt 

Menggunakan beberapa klausa pencarian dengan grep

Ada penurunan yang sesuai dalam jumlah baris dalam output.

Baris dari teks yang tidak cocok dengan salah satu istilah pencarian

Jika kita menggunakan opsi -E (extended regex), kita dapat menggabungkan pola pencarian dengan “ | “, yang dalam konteks ini tidak menunjukkan pipa, ini adalah operator OR logis.

 grep -Ev "Jabberwock|dan" jabberwocky.txt 

Menggunakan operator logika OR dengan grep

Kami mendapatkan output yang persis sama seperti yang kami lakukan dengan perintah sebelumnya yang lebih panjang lebar.

Baris dari teks yang tidak cocok dengan salah satu istilah pencarian

Format perintahnya sama jika Anda ingin menggunakan pola regex alih-alih petunjuk pencarian eksplisit. Perintah ini akan mengecualikan semua baris yang dimulai dengan huruf apa pun di set "ACHT."

 grep -Ev "^ACHT" jabberwocky.txt 

Tidak termasuk file yang dimulai dengan huruf tertentu

Untuk melihat garis yang berisi pola tetapi juga tidak mengandung pola lain, kita dapat menyalurkan grep ke grep . Kami akan mencari semua baris yang mengandung kata "Jabberwock" dan kemudian memfilter setiap baris yang juga mengandung kata "slain".

 grep "Jabberwock" jabberwocky.txt | grep -v "dibunuh" 

Piping grep ke grep untuk menyaring dua kali

Tidak termasuk File

Kita dapat meminta grep untuk mencari string atau pola dalam kumpulan file. Anda dapat membuat daftar setiap file pada baris perintah, tetapi dengan banyak file yang pendekatannya tidak berskala.

 grep "vorpal" ayat-1.txt ayat-2.txt ayat-3.txt ayat-4.txt ayat-5.txt ayat-6.txt 

Mencari melalui daftar file bernama

Perhatikan bahwa nama file yang berisi baris yang cocok ditampilkan di awal setiap baris keluaran.

Untuk mengurangi pengetikan kita bisa menggunakan wildcard. Tapi itu bisa berlawanan dengan intuisi. Ini tampaknya berhasil.

 grep "vorpal" *.txt 

Menggunakan wildcard untuk mencari koleksi file

Namun, di direktori ini ada file TXT lain, yang tidak ada hubungannya dengan puisi. Jika kita mencari kata "pedang" dengan struktur perintah yang sama, kita mendapatkan banyak kesalahan positif.

 grep "pedang" *.txt 

Mencari "pedang" melalui kumpulan file TXT

Hasil yang kita inginkan ditutupi oleh banjir hasil palsu dari file lain yang memiliki ekstensi TXT.

Kumpulan hasil positif palsu yang besar

Kata "vorpal" tidak cocok dengan apa pun, tetapi "pedang" termasuk dalam kata "sandi" sehingga sering ditemukan di beberapa file log palsu.

Kita perlu mengecualikan file-file ini. Untuk melakukannya kita akan menggunakan opsi --exclude . Untuk mengecualikan satu file yang disebut "vol-log-1.txt" kami akan menggunakan perintah ini:

 grep --exclude=vol-log-1.txt "pedang" *.txt

Dalam contoh ini, kami ingin mengecualikan beberapa file log dengan nama yang dimulai dengan "vol." Sintaks yang kita butuhkan adalah:

 grep --exclude=vol*.txt "pedang" *.txt 

Tidak termasuk file dengan wildcard

Saat kita menggunakan opsi -R (dereference-recursive) grep akan mencari seluruh pohon direktori untuk kita. Secara default, itu akan mencari melalui semua file di lokasi tersebut. Mungkin ada beberapa jenis file yang ingin kami kecualikan.

Di bawah direktori saat ini pada mesin uji ini, ada direktori bersarang yang berisi file log, file CSV, dan file MD. Ini semua adalah jenis file teks yang ingin kami kecualikan. Kita dapat menggunakan opsi --exclude untuk setiap jenis file, tetapi kita dapat mencapai apa yang diinginkan secara lebih efisien dengan mengelompokkan jenis file.

Perintah ini mengecualikan semua file yang memiliki ekstensi CSV atau MD, dan semua file TXT yang namanya dimulai dengan "vol" atau "log".

 grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/ 

Menggunakan beberapa --exclude klausa dan pengelompokan nama file

Tidak termasuk Direktori

Jika file yang ingin kita abaikan terdapat dalam direktori dan tidak ada file di direktori yang ingin kita cari, kita dapat mengecualikan seluruh direktori tersebut.

Konsepnya sangat mirip dengan mengecualikan file, kecuali kita menggunakan opsi --exclude-dir dan memberi nama direktori yang akan diabaikan.

 grep -R --exclude-dir=backup "vorpal" /home/dave/data 

Mengecualikan direktori dari pencarian

Kami telah mengecualikan direktori "cadangan", tetapi kami masih mencari melalui direktori lain yang disebut "cadangan2".

Tidak mengherankan jika kita dapat menggunakan opsi --exclude-dir beberapa kali dalam satu perintah. Perhatikan bahwa jalur ke direktori yang dikecualikan harus diberikan relatif terhadap direktori tempat pencarian akan dimulai. Jangan gunakan jalur absolut dari akar sistem file.

 grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data 

Tidak termasuk dua direktori dari pencarian

Kita juga bisa menggunakan pengelompokan. Kita dapat mencapai hal yang sama secara lebih ringkas dengan:

 grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data 

Tidak termasuk direktori dengan pengelompokan

Anda dapat menggabungkan pengecualian file dan direktori dalam perintah yang sama. Jika Anda ingin mengecualikan semua file dari direktori dan mengecualikan jenis file tertentu dari direktori yang dicari, gunakan sintaks ini:

 grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data 

Tidak termasuk jenis file dan direktori dalam perintah yang sama

Terkadang Itu Yang Anda Tinggalkan

Terkadang dengan grep rasanya seperti Anda sedang mencoba mencari jarum di tumpukan jerami. itu membuat perbedaan besar untuk menghapus tumpukan jerami.

TERKAIT: Cara Menggunakan Ekspresi Reguler (regex) di Linux