Cara Mengecualikan Pola, File, dan Direktori Dengan grep
Diterbitkan: 2022-06-29
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.
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
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
Baris yang tidak berisi "Jabberwock" terdaftar di jendela terminal.
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
Ada penurunan yang sesuai dalam jumlah baris dalam output.
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
Kami mendapatkan output yang persis sama seperti yang kami lakukan dengan perintah sebelumnya yang lebih panjang lebar.
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
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"

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
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
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
Hasil yang kita inginkan ditutupi oleh banjir hasil palsu dari file lain yang memiliki ekstensi TXT.
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
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/
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
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
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
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
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