Hogyan használd a "grep" parancsot a szöveg megtalálására, beleértve az alkönyvtárakat is?

296

Meg akarok találni minden olyan fájlt, amely egy adott szövegszöveget tartalmaz. Agrep parancs működik, de nem tudom, hogyan kell használni minden könyvtárhoz (csak a jelenlegi könyvtáromban tudom megcsinálni). Megpróbáltam olvasniman grep -ot, de nem nyújtott segítséget.

    
készlet Smile.Hunter 01.08.2011 13:38
forrás

11 válasz

378

Jobb lenne használni

grep -rl "string" /path

ahol

  • A (z)-r (vagy--recursive) opció a/path alkönyvtárait is átszeli, míg a
  • A (z)-l (vagy--files-with-matches) beállítás csak a megfelelő fájlok fájlnevének kinyomtatására használható, és nem a megfelelő sorok esetén (ez a sebességet is javíthatja, mivel agrep leállítja a fájl első alkalommal történő lekérését ezzel a beállítással).
válasz adott enzotib 01.08.2011 13:55
forrás
138

Ha a fájlok sorainak illesztését keresi, a kedvenc parancsom:

grep -Hrn 'search term' path/to/files
  • -H okozza a fájlnév kinyomtatását (ha több fájl keresése történik)
  • -r rekurzív keresést végez
  • -n a sorszám kinyomtatását eredményezi

Apath/to/files lehet. keresés az aktuális könyvtárban

További lehetőségek, amelyeket nagyon hasznosnak találok:

  • -I figyelmen kívül hagyja a bináris fájlokat (kiegészítő:-a az összes fájlt szövegként kezeli)
  • -F treatsearch term szó szerinti, nem szabályos kifejezésként
  • -i nem illeszkedik a kis- és nagybetűkre.
  • --color=always ha a színeket még aless csövezés során is érvényesíteni szeretné. Haless támogatja a színeket, akkor használja a-r opciót:

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir hasznos a könyvtárak kizárására, mint a.svn és a.git.

    
válasz adott Lekensteyn 01.08.2011 14:27
forrás
21

Úgy gondolom, használhatsz valami ilyesmit:

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

Magyarázat a megjegyzésekből

Afind olyan parancs, amely lehetővé teszi fájlok és egyéb objektumok, például könyvtárak és hivatkozások lekérését egy adott elérési út alkönyvtárába. Ha nem ad meg olyan maszkot, amelyiknek a fájlneveknek meg kell felelniük, felsorolja az összes könyvtár objektumot.

  • A-type f azt írja elő, hogy csak fájlokat, nem pedig könyvtárakat kell feldolgozni,
  • A-exec grep azt írja elő, hogy minden talált fájlt a grep parancsnak kell futtatnia, a fájlnév argumentumként adja át, a{} helyett a fájlnévvel
válasz adott dmityugov 01.08.2011 13:48
forrás
17

Az alapértelmezett parancsom

grep -Rin string *

Használom az "R" fővárost, mertls rekurzívként használja. Mivel a grep elfogadja mindkettőt, nem indokolja, hogy ne használja.

SZERKESZTÉS: HVNSwebhelyenként, látszólag-R követni fogja a szimbolikus linkeket, ahol-r nem.

    
válasz adott user606723 01.08.2011 16:43
forrás
11

Ha hajlandó kipróbálni valami újat, adj ack egy lövést. Astring aktuális könyvtárának rekurzív kereséséhez:

ack string

A telepítés nagyon egyszerű:

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

(feltéve, hogy már megkaptad a~/bin könyvtárat, és ez előnyös aPATH -ban.)

    
válasz adott Konrad Rudolph 01.08.2011 17:09
forrás
3

Az rgrep parancs erre az igényre van szántva

Ha nem áll rendelkezésre, akkor így kaphatja meg

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

Beállíthatja közvetlenül az alapértelmezett grep opciókat a fent leírtak szerint.

Én személyesen használom

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

kapcsolódó téma: hogyan használd az rgrep-et mindig a színnel

    
válasz adott mnono 02.01.2015 14:58
forrás
2

Frissítés 2:

Afind ésgrep paranccsal végrehajtott parancssor a következő problémát oldja meg:

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

--color=<always or auto> a színes kimenetre:

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

Példa:

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

Egy példa fut az alábbi pillanatképben:

Frissítés 1:

Megpróbálhatja a következő kódot; mint a.bashrc vagy.bash_aliases vagy a szkriptben lévő funkció:

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
}

Használat:wherein /path/to/search/in/ searchkeyword

Például:

$ wherein ~/Documents/ "hello world"

(Megjegyzés: Az @enzotib alábbi megjegyzései szerint ez nem működik fájlokkal / könyvtárakkal, beleértve a nevükben lévő szóközöket is.)

Eredeti hozzászólás

A karakterlánc kereséséhez és a keresési sorhoz tartozó sorral:

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

pl.:

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

A keresési stringet tartalmazó fájlnév megjelenítése:

$ 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;

pl.:

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

Ezt az xargs használatával csinálom, egy nagyon alábecsült parancs

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

find ./ megad egy rekurzív listát az aktuális mappában lévő összes fájlról akkor pipát xargs-ra, amely végrehajtja a grep parancsot mindegyik fájlra

    
válasz adott deadprogrammer 01.08.2011 17:30
forrás
0

Tudom, hogy itt rengeteg válasz van, de itt van egy alternatíva, ha további korlátozásokat szeretne felvenni a fájlok keresésekor:

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

Ez azért működik, mertgrep visszaad 0-t, ha találatot talál, 1 egyébként. Például 1 MB nagy és fájlokat talál, amelyek valamit tartalmaznak:

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

Több követelményhez valószínűleg a GNU grep-ben létező-O optimalizáló jelzőt szeretné használni.

    
válasz adott Ztyx 11.03.2015 14:56
forrás
0

A C, CPP-kódban keresendő szkript (find-in-code):

#!/bin/sh

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

A

find-in-code "search string"
    
válasz adott nvd 11.06.2015 18:49
forrás
0

grep ( GNU vagy BSD )

Agrep eszközzel rekurzív módon keresheti az aktuális mappát a-r paraméterrel, például:

grep -r "pattern" .

Megjegyzés:-r - Rekurzívan kereshet alkönyvtárakat.

Ha bizonyos fájlokba szeretne keresni, használhat globbing szintaxist , mint például:

grep "class foo" **/*.c

Megjegyzés: A globbing opció használatával (**), az összes fájlt rekurzívan, meghatározott kiterjesztéssel vagy mintával vizsgálja. A szintaxis engedélyezéséhez futtassa a következőket: shopt -s globstar . A**/*.* minden fájl (kivéve a rejtett és kiterjesztés nélküli) vagy más mintát.

Ha hiba van, hogy az argumentum túl hosszú, fontolja meg a keresés szűkülését, vagy használja afind szintaxist, mint például:

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

Alternatív megoldásként ripgrep .

ripgrep

Ha nagyobb projekteken vagy nagy fájlokon dolgozik, használjonripgrep -ot, mint például:

rg "pattern" .

A GitHub projektoldalon megtekintheti a dokumentumokat, a telepítési lépéseket vagy a forráskódot.

>

Sokkal gyorsabb, mint bármely más eszköz, mint a GNU / BSD grep , ucg , ag , sift , ack , Rust-regex motor , amely finom automatákat, SIMD-t és agresszív szó szerinti optimalizációkat használ a keresések gyors eléréséhez.

Apt fájlokban megadott figyelmen kívül hagyott mintákat támogatja, így egy fájl elérési útja egyszerre több földgömb mintázatával egyeztethető.

Használhatja a következő paramétereket:

  • .gitignore - Nem érzékeny keresés.
  • -i - A bináris fájlok figyelmen kívül hagyása.
  • -I - Az egész szavak keresése (a részleges szómegfeleltetéssel ellentétben).
  • -w - A meccs vonalának megjelenítése.
  • -n /-C (például--context) - Növeli a kontextust, így látja a környező kódot.
  • -C5 - Jelölje ki a megfelelő szöveget.
  • --color=auto - Megjeleníti a fájl nevét, ahol a szöveg megtalálható.
  • -H - A megfelelő sorok számát jeleníti meg. Kombinálható a-c -kal.
válasz adott kenorb 11.04.2018 13:21
forrás