Alt dizinler dahil olmak üzere metin bulmak için “grep” komutu nasıl kullanılır?

289

Belirli bir metin dizesini içeren tüm dosyaları bulmak istiyorum. % Co_de% komutu çalışır, ancak her dizin için bunu nasıl kullanacağımı bilmiyorum (yalnızca geçerli dizim için yapabilirim). % Co_de% okumayı denedim, ancak herhangi bir yardım almadı.

    
sordu Smile.Hunter 01.08.2011 13:38

11 cevap

373

Kullanmak daha iyi olurdu

grep -rl "string" /path

burada

  • -r (veya --recursive ) seçeneği, /path 'nin tüm alt dizinlerini de çaprazlamak için kullanılır.
  • -l (veya --files-with-matches ) seçeneği sadece eşleşen dosyaların dosya adlarını yazdırmak için kullanılır ve eşleşen satırları değil (bu, grep öğesinin bu seçenekle ilk karşılaşmada bir dosya okumayı durdurması durumunda da hızını artırabilir).
verilen cevap enzotib 01.08.2011 13:55
136

Dosyalarla eşleşen satırları arıyorsanız, favori komutum:

grep -Hrn 'search term' path/to/files
  • -H dosya adının yazdırılmasına neden olur (birden fazla dosya arandığında ima edilir)
  • -r yinelemeli bir arama yapıyor
  • -n , satır numarasının yazdırılmasına neden oluyor

path/to/files , geçerli dizinde aramak için . olabilir

Çok yararlı bulduğum diğer seçenekler:

  • -I ikili dosyaları yoksay (tamamlayıcı: -a tüm dosyaları metin olarak kabul eder)
  • -F , search term değerini normal ifade değil, normal ifade olarak ele alır
  • -i büyük / küçük harfe duyarsız arama yapıyor
  • --color=always yoluyla boruları koparken bile renkleri zorlamak için% p_de%. % Co_de% destek rengini yapmak için less seçeneğini kullanmanız gerekir:

    grep -Hrn search . | less -r
    
  • less , -r ve --exclude-dir=dir gibi dizinleri hariç tutmak için kullanışlıdır.

    
verilen cevap Lekensteyn 01.08.2011 14:27
21

Bunun gibi bir şey kullanabileceğine inanıyorum:

find /path -type f -exec grep -l "string" {} \;

Yorumlardan açıklama

find , belirli bir yolun alt dizinlerindeki dizinleri ve bağlantıları gibi dosyaları ve diğer nesneleri bulmanızı sağlayan bir komuttur. Dosya adlarının karşılaması gereken bir maske belirtmezseniz, tüm dizin nesnelerini numaralandırır.

  • -type f , yalnızca dizinleri değil, dosyaları işleyeceğini belirtir.
  • -exec grep , bulunan her dosya için, grep komutunu, dosya adını bir argüman olarak ileterek, {} dosyasının dosya adı ile değiştirilmesi gerektiğini belirtir.
verilen cevap dmityugov 01.08.2011 13:48
17

Varsayılan komutum

grep -Rin string *

Bir capitol 'R' kullanıyorum çünkü ls bunu yinelemeli olarak kullanıyor. Grep her ikisini de kabul ettiğinden, kullanmamak için bir sebep yok.

DÜZENLEME: HVNSweetleme başına, görünen -R , -r değerinin olmayacağı yer olan symlinks'i takip edecektir.

    
verilen cevap user606723 01.08.2011 16:43
11

Yeni bir şey denemek istiyorsanız, bir çekim yapın. % Co_de% için geçerli dizini yinelemeli olarak arama komutu:

ack string

Kurulum oldukça basit:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(% co_de dizinini zaten girdiyseniz ve bu, tercihen ack öğenizde bulunuyorsa.)

    
verilen cevap Konrad Rudolph 01.08.2011 17:09
3

rgrep komutu bu ihtiyaç için ayrılmıştır

Mevcut değilse, şunun gibi alabilirsiniz

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

Yukarıda açıklanan varsayılan grep seçeneklerinizi doğrudan ayarlayabilirsiniz.

Ben şahsen kullanıyorum

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

ilgili konu: rgrep'in rengin her zaman nasıl kullanılacağı

    
verilen cevap mnono 02.01.2015 14:58
2

2 Güncellemesi:

find ve grep komutlarını kullanan bu komut satırı, sorunu düzeltir:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

Renkli çıktı için --color=<always or auto> :

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

Örnek:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Aşağıdaki örnekte bir örnek çalıştırın:

1 Güncellemesi:

Aşağıdaki kodu deneyebilirsiniz; .bashrc veya .bash_aliases veya bir komut dosyasında bir işlev olarak:

wherein () 
{ 
    for i in $(find "" -type f 2> /dev/null);
    do
        if grep --color=auto -i "" "$i" 2> /dev/null; then
            echo -e "3[0;32mFound in: $i 3[0m\n";
        fi;
    done
}

Kullanım: wherein /path/to/search/in/ searchkeyword

örnek:

$ wherein ~/Documents/ "hello world"

(Not: Aşağıdaki yorumlarda @enzotib tarafından önerildiği gibi, bu, adlarında boşluk bulunan dosya / dizinlerle çalışmaz.)

Orijinal gönderi

Dizgiyi aramak ve sadece arama dizgisi olan satırı bulmak için:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

örn.

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

Arama dizesini içeren dosya adını görüntülemek için:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

örn.

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
    
verilen cevap precise 25.01.2014 12:11
1

Bunu xargs kullanarak yapıyorum, çok az kullanılan bir komut

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./, geçerli bir klasördeki tüm dosyaların bir tekrar listesini verir. daha sonra bu dosyaların her birinde grep komutunu çalıştıran xargs dosyasına aktarın

    
verilen cevap deadprogrammer 01.08.2011 17:30
0

Burada çok sayıda yanıt olduğunu biliyorum, ancak dosyaları ararken diğer kısıtlamaları eklemek isterseniz bir alternatif:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Bu, grep öğesinin bir sonuç bulması durumunda 0, aksi takdirde 1 döndüreceği için çalışır. Örneğin, bir dosya içeren 1 MB büyük ve dosyaları bulabilirsiniz:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Birden fazla gereksinim için, muhtemelen, GNU grep'te bulunan optimizer bayrağı -O değerini kullanmak istersiniz.

    
verilen cevap Ztyx 11.03.2015 14:56
0

C, CPP kodunda aramak için bir kod (kod içinde bul):

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""

Kullanım:

find-in-code "search string"
    
verilen cevap nvd 11.06.2015 18:49
0

grep ( GNU veya BSD )

grep aracını, geçerli klasörü -r parametresiyle yinelemeli olarak aramak için kullanabilirsiniz:

grep -r "pattern" .

Not: -r - Alt dizinleri tekrarlı arama.

Belirli dosyalarda aramak için, aşağıdaki gibi bir globbing sözdizimini kullanabilirsiniz.

grep "class foo" **/*.c

Not: globbing seçeneğini kullanarak ( ** ), özel uzantı veya desenle tüm dosyaları yinelemeli olarak tarar. Bu sözdizimini etkinleştirmek için şunu çalıştırın: shopt -s globstar . Ayrıca, **/*.* değerini de kullanabilirsiniz. tüm dosyalar (gizli ve uzantısız hariç) veya başka bir desen.

Bağımsız değişkeninizin fazla uzun olması durumunda aramanızı daraltmayı düşünün veya bunun yerine find sözdizimini kullanın:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Alternatif olarak, ripgrep kullanın.

ripgrep

Daha büyük projeler veya büyük dosyalar üzerinde çalışıyorsanız, bunun yerine ripgrep kullanmalısınız:

rg "pattern" .

GitHub proje sayfasındaki dokümanları, yükleme adımlarını veya kaynak kodunu kontrol edin.

GNU / BSD grep , ucg , ag , sift , ack , pt veya benzerleri, Rust ifadesinin üstüne yerleştirildiğinden son derece otomatik arama, SIMD ve agresif basit optimizasyonlar kullanan motoru çok hızlı bir şekilde aramak için.

.gitignore dosyasında belirtilen desenleri yok saymayı destekler, böylece tek bir dosya yolu aynı anda birden fazla glob desenine karşı eşleştirilebilir.

Aşağıdaki gibi ortak parametreleri kullanabilirsiniz:

  • -i - Duyarsız arama.
  • -I - İkili dosyaları yoksay.
  • -w - Tüm kelimeleri arayın (kısmi kelime eşleşmesinin tersine).
  • -n - Eşleme şeklinizi gösterin.
  • -C / --context (ör. -C5 ) - Bağlamı artırır, böylece çevreleyen kodu görürsünüz.
  • --color=auto - Eşleşen metni işaretleyin.
  • -H - Metnin bulunduğu dosya adını görüntüler.
  • -c - Eşleşen satırların sayısını görüntüler. % Co_de% ile birleştirilebilir.
verilen cevap kenorb 11.04.2018 13:21

Etiketlerdeki diğer soruları oku