Grep ile Desenler, Dosyalar ve Dizinler Nasıl Dışlanır
Yayınlanan: 2022-06-29 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.
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
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
“Jabberwock” içermeyen satırlar terminal penceresine listelenir.
İ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
Çıktıdaki satır sayısında buna karşılık gelen bir düşüş var.
-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
Önceki, daha uzun soluklu komutla yaptığımız çıktının tam olarak aynısını elde ederiz.
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
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ü"
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
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
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
İstediğimiz sonuçlar, TXT uzantısına sahip diğer dosyalardan gelen yanlış sonuçların baskınıyla maskeleniyor.
“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
-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/
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
"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
Gruplandırmaları da kullanabiliriz. Aynı şeyi daha özlü bir şekilde şu şekilde başarabiliriz:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
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
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