Grep ile Desenler, Dosyalar ve Dizinler Nasıl Dışlanır

Yayınlanan: 2022-06-29
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

1974'ten beri, Linux grep komutu, insanların dosyalarda dizeleri bulmasına yardımcı oluyor. Ancak bazen grep çok kapsamlıdır. İşte grep farklı şeyleri görmezden gelmesini söylemenin birkaç yolu.

grep Komutu

grep komutu, komut satırında sağladığınız arama kalıplarıyla eşleşen dizeleri arayan metin dosyalarını arar. grep gücü, düzenli ifadeleri kullanmasında yatar. Bunlar, aradığınızı açıkça tanımlamanız yerine tanımlamanıza izin verir.

grep doğuşu Linux'tan önce gelir. 1970'lerin başında Unix'te geliştirildi. Adını ed satırı düzenleyicisindeki g/re/p tuş dizisinden alır (bu arada, "ee-dee" olarak telaffuz edilir). Bu, küresel, düzenli ekspres arama, baskı eşleştirme satırları anlamına geliyordu.

grep ünlü -belki de herkesin bildiği gibi- kapsamlı ve kararlıdır. Bazen, zamanını boşa harcamamasını tercih edeceğiniz dosyaları veya dizinleri arar, çünkü sonuçlar ağaçların içini görememenize neden olabilir.

Linux'ta grep Komutu Nasıl Kullanılır
İLGİLİ Linux'ta grep Komutu Nasıl Kullanılır

Elbette, grep'i hüküm sürmenin yolları var. Ona kalıpları, dosyaları ve dizinleri yok saymasını söyleyebilirsiniz, böylece grep aramalarını daha hızlı tamamlar ve anlamsız yanlış pozitiflerle boğulmazsınız.

Desenler Hariç

grep ile arama yapmak için, buna cat gibi başka bir işlemden girdi aktarabilir veya son komut satırı parametresi olarak bir dosya adı sağlayabilirsiniz.

Lewis Carroll'ın Jabberwocky şiirinin metnini içeren kısa bir dosya kullanıyoruz. Bu iki örnekte, "Jabberwock" arama terimiyle eşleşen satırları arıyoruz.

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

Aynı metin dosyasında grep ile arama yapmanın iki farklı yolu

Arama ipucuyla eşleşen satırlar, her satırda eşleşen öğe kırmızıyla vurgulanarak bizim için listelenir. Bu basit arama. Peki ya “Jabberwock” kelimesini içeren satırları hariç tutmak ve gerisini yazdırmak istiyorsak?

Bunu -v (eşleşmeyi ters çevir) seçeneği ile başarabiliriz. Bu, arama terimiyle eşleşmeyen satırları listeler.

 grep -v "Jabberwock" jabberwocky.text 

-v ters çevrilmiş arama seçeneğini grep ile kullanma

“Jabberwock” içermeyen satırlar terminal penceresine listelenir.

Jabberwock kelimesini içermeyen tüm satırlar

İstediğimiz kadar terimi hariç tutabiliriz. “Jabberwock” içeren tüm satırları ve “ve” içeren tüm satırları filtreleyelim. Bunu başarmak için -e (ifade) seçeneğini kullanacağız. Kullandığımız her arama modeli için kullanmamız gerekiyor.

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

Grep ile birden çok arama yan tümcesi kullanma

Çıktıdaki satır sayısında buna karşılık gelen bir düşüş var.

Her iki arama terimiyle de eşleşmeyen metindeki satırlar

-E (genişletilmiş normal ifadeler) seçeneğini kullanırsak, arama kalıplarını “ | “, bu bağlamda bir boruyu belirtmez, mantıksal OR operatörüdür.

 grep -Ev "Jabberwock|ve" jabberwocky.txt 

Mantıksal VEYA operatörünü grep ile kullanma

Önceki, daha uzun soluklu komutla yaptığımız çıktının tam olarak aynısını elde ederiz.

Her iki arama terimiyle de eşleşmeyen metindeki satırlar

Açık bir arama ipucu yerine bir normal ifade kalıbı kullanmak istiyorsanız, komutun biçimi aynıdır. Bu komut, "ACHT" kümesindeki herhangi bir harfle başlayan tüm satırları hariç tutacaktır.

 grep -Ev "^ACHT" jabberwocky.txt 

Belirli harflerle başlayan dosyaları hariç tutma

Bir desen içeren ancak başka bir desen içermeyen satırları görmek için grep grep . "Jabberwock" kelimesini içeren tüm satırları arayacağız ve ardından "öldürüldü" kelimesini içeren satırları filtreleyeceğiz .

 grep "Jabberwock" jabberwocky.txt | grep -v "öldürüldü" 

İki kez filtrelemek için grep'i grep'e borulama

Dosyaları Hariç Tutma

grep bir dosya koleksiyonunda bir dize veya desen aramasını isteyebiliriz. Her dosyayı komut satırında listeleyebilirsiniz, ancak birçok dosyada bu yaklaşım ölçeklenmez.

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

Adlandırılmış dosyalar listesinde arama yapma

Eşleşen satırı içeren dosyanın adının her çıktı satırının başında görüntülendiğini unutmayın.

Yazmayı azaltmak için joker karakterler kullanabiliriz. Ama bu mantıksız olabilir. Bu işe yarıyor gibi görünüyor.

 grep "vorpal" *.txt 

Bir dosya koleksiyonunu aramak için joker karakterleri kullanma

Ancak, bu dizinde şiirle ilgisi olmayan başka TXT dosyaları var. Aynı komut yapısıyla “kılıç” kelimesini arattığımızda birçok yanlış pozitif çıkıyor.

 grep "kılıç" *.txt 

TXT dosyaları koleksiyonunda "kılıç" aranıyor

İstediğimiz sonuçlar, TXT uzantısına sahip diğer dosyalardan gelen yanlış sonuçların baskınıyla maskeleniyor.

Yanlış pozitiflerden oluşan büyük bir sonuç seti

“Vorpal” kelimesi hiçbir şeyle eşleşmedi, ancak “kılıç” “parola” kelimesine dahil edildi, bu yüzden bazı sahte günlük dosyalarında birçok kez bulundu.

Bu dosyaları hariç tutmamız gerekiyor. Bunu yapmak için --exclude seçeneğini kullanacağız. “vol-log-1.txt” adlı tek bir dosyayı hariç tutmak için şu komutu kullanırdık:

 grep --exclude=vol-log-1.txt "kılıç" *.txt

Bu örnekte, adları "vol" ile başlayan birden çok günlük dosyasını hariç tutmak istiyoruz. İhtiyacımız olan sözdizimi:

 grep --exclude=vol*.txt "kılıç" *.txt 

Joker karakterli dosyaları hariç tutma

-R (referans-özyinelemeli) seçeneğini kullandığımızda grep bizim için tüm dizin ağaçlarını arayacaktır. Varsayılan olarak, bu konumlardaki tüm dosyaları arayacaktır. Dışlamak istediğimiz birden çok dosya türü olabilir.

Bu test makinesindeki geçerli dizinin altında, günlük dosyaları, CSV dosyaları ve MD dosyalarını içeren iç içe dizinler vardır. Bunların tümü, hariç tutmak istediğimiz metin dosyalarıdır. Her dosya türü için bir --exclude seçeneği kullanabilirdik, ancak dosya türlerini gruplayarak istediğimizi daha verimli bir şekilde elde edebiliriz.

Bu komut, CSV veya MD uzantılarına sahip tüm dosyaları ve adları "vol" veya "log" ile başlayan tüm TXT dosyalarını hariç tutar.

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

Birden çok --exclude yan tümcesi ve dosya adı gruplaması kullanma

Dizinler Hariç

Yoksaymak istediğimiz dosyalar dizinlerde bulunuyorsa ve bu dizinlerde aramak istediğimiz hiçbir dosya yoksa, bu dizinlerin tamamını hariç tutabiliriz.

Konsept, --exclude-dir seçeneğini kullanmamız ve yoksayılacak dizinleri adlandırmamız dışında, dosyaları hariç tutmaya çok benzer.

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

Aramadan bir dizini hariç tutma

"Yedekleme" dizinini hariç tuttuk, ancak hala "yedekleme2" adlı başka bir dizini arıyoruz.

--exclude-dir seçeneğini tek bir komutta birden çok kez kullanabilmemiz şaşırtıcı olmayacaktır. Dışlanan dizinlerin yolunun, aramanın başlayacağı dizine göre verilmesi gerektiğini unutmayın. Dosya sisteminin kökünden gelen mutlak yolu kullanmayın.

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

Aramadan iki dizin hariç tutulması

Gruplandırmaları da kullanabiliriz. Aynı şeyi daha özlü bir şekilde şu şekilde başarabiliriz:

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

Gruplandırmalı dizinleri hariç tutma

Dosya ve dizin dışlamalarını aynı komutta birleştirebilirsiniz. Tüm dosyaları bir dizinden hariç tutmak ve belirli dosya türlerini aranan dizinlerden hariç tutmak istiyorsanız, bu sözdizimini kullanın:

 grep -R --exclude=*.{csv,md} --exclude-dir=yedekleme/arşiv "frumious" /home/dave/data 

Aynı komutta dosya türleri ve dizinleri hariç tutma

Bazen Dışarıda Bıraktığın Şeydir

Bazen grep ile samanlıkta iğne bulmaya çalışıyormuşsunuz gibi hissedebilirsiniz. samanlığı kaldırmak büyük bir fark yaratır.

İLGİLİ: Linux'ta Normal İfadeler (regex'ler) Nasıl Kullanılır