Hoe kan ik grep gebruiken om een woord in een map te vinden?

In Windows zou ik een zoekopdracht hebben uitgevoerd om een woord in een map te vinden. Evenzo wil ik weten of een specifiek woord voorkomt in een map die veel submappen en bestanden bevat. Mijn zoekopdrachten naar grep-syntaxis laten zien dat ik de bestandsnaam moet specificeren, d.w.z. grep string filename.

Nu weet ik de bestandsnaam niet, dus wat moet ik doen?
Een vriend stelde voor om grep -nr stringte gebruiken, maar ik weet niet wat dit betekent en ik kreeg er geen resultaten mee (er is geen antwoord totdat ik een Ctrlgeef + C).


Antwoord 1, autoriteit 100%

grep -nr 'yourString*' .

De punt aan het einde zoekt in de huidige directory. Betekenis voor elke parameter:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' .(Zou MobileAppServlet.javaof MobileAppServlet.classof MobileAppServlet.txt; 'MobileAppASer*.*'is een andere manier om hetzelfde te doen.)

Gebruik de opdracht man grepom meer parameters te controleren.


Antwoord 2, autoriteit 14%

grep -nr string my_directory

Aanvullende opmerkingen: dit voldoet aan de syntaxis grep [options] string filenameomdat in Unix-achtige systemen een directory een soort bestand is (er is een term “normaal bestand” om specifiek naar te verwijzen entiteiten die in Windows gewoon “bestanden” worden genoemd).

grep -nr stringleest de inhoud om te zoeken van de standaardinvoer, daarom wacht het daar gewoon op invoer van u, en stopt hiermee wanneer u op ^C drukt (het zou stoppen op ^D ook, wat de toetsencombinatie is voor het einde van het bestand).


Antwoord 3, autoriteit 7%

GREP: Global Regular Expression Print/Parser/Processor/Program.
U kunt dit gebruiken om de huidige directory te doorzoeken.
U kunt -R specificeren voor “recursief”, wat betekent dat het programma zoekt in alle submappen, en hun submappen, en de submappen van hun submappen, enz.

grep -R "your word" .

-ndrukt het regelnummer af, waar het overeenkomt in het bestand.
-izoekt hoofdletterongevoelig (hoofdletters/niet-hoofdletters).

grep -inR "your regex pattern" .

Antwoord 4, autoriteit 3%

Er is ook:

find directory_name -type f -print0 | xargs -0 grep -li word

maar dat is misschien wat veel voor een beginner.

findis een directory walker/lister voor algemene doeleinden, -type fbetekent “zoek naar gewone bestanden in plaats van naar mappen en benoemde pipes en wat heb je”, -print0betekent “print ze af op de standaarduitvoer met null-tekens als scheidingstekens”. De uitvoer van findwordt verzonden naar xargs -0en pakt de standaardinvoer in brokken (om de lengtebeperkingen van de opdrachtregel te vermijden) met null-tekens als recordscheidingsteken (in plaats van de standaard nieuwe regel) en past vervolgens grep -li wordtoe op elke set bestanden. Op de grepbetekent -l“lijst de bestanden die overeenkomen” en -ibetekent “hoofdlettergevoelig”; je kunt meestal opties voor één teken combineren, zodat je -livaker ziet dan -l -i.

Als je -print0en -0niet gebruikt, zul je problemen tegenkomen met bestandsnamen die spaties bevatten, dus het is een goede gewoonte om ze te gebruiken.


Antwoord 5, autoriteit 3%

grep -nr search_string search_dir

zal een RECURSIVE (dat wil zeggen de directory en al zijn subdirectories) doen zoeken naar de search_string. (zoals correct beantwoord door usta).

De reden dat je geen antwoord kreeg op de suggestie van je vriend voor:

grep -nr string

is omdat er geen map is opgegeven. Als u zich in de directory bevindt waarin u wilt zoeken, moet u het volgende doen:

grep -nr string .

Het is belangrijk om de ‘.’ karakter, omdat dit grep vertelt om in DEZE map te zoeken.


Antwoord 6

Waarom niet recursief zoeken om alle instanties in submappen te vinden:

grep -r 'text' *

Dit werkt als een tierelier.


Antwoord 7

Een andere optie die ik graag gebruik:

find folder_name -type f -exec grep your_text  {} \;

-type f geeft u alleen bestanden en geen mappen

-exec en {} voeren de grep uit op de bestanden die zijn gevonden in de zoekopdracht (de exacte syntaxis is “-exec command {}”).


Antwoord 8

  1. grep -r "yourstring" *
    Vindt “yourstring” in alle bestanden en mappen

Als je nu naar twee verschillende strings tegelijk wilt zoeken, kun je altijd optie E gebruiken en woorden toevoegen voor de zoekopdracht. voorbeeld na de pauze

  1. grep -rE "yourstring|yourotherstring|$" *zoekt naar lijstlocaties waar yourstringof yourotherstringovereenkomt

Antwoord 9

grep -R "string" /directory/

-R volgt ook symbolische links als -r dat niet doet.


Antwoord 10

Het antwoord dat je hebt gekozen is prima, en het werkt, maar het is niet de juiste manier om het te doen, omdat:

grep -nr yourString* .

Dit doorzoekt de tekenreeksen "yourStrin"en "g"0 of vele malen.

Dus de juiste manier om het te doen is:

grep -nr \w*yourString\w* .

Deze opdracht doorzoekt de tekenreeks met een willekeurig teken ervoor en erna in de huidige map.


Antwoord 11

Vergelijkbaar met het antwoord van @eLRuLL, is een eenvoudigere manier om een zoekopdracht op te geven die de woordgrenzen respecteert, door de optie -wte gebruiken:

grep -wnr "yourString" .

Antwoord 12

Voer (terminal) het volgende commando uit in de directory. Het zal ook recursief in submappen controleren.

grep -r 'your string goes here' * 

Antwoord 13

Het volgende voorbeeld ziet er recursief uit voor your search stringin de bestanden *.xmlen *.jsdie zich ergens in de mappen path1, path2en path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Je kunt dus in een subset van de bestanden zoeken naar veel mappen, waarbij je alleen de paden aan het einde geeft.


Antwoord 14

Gebruik geen grep. Download Silver Searcherof ripgrep. Ze zijn allebei uitstekend en veel sneller dan grep of ack met talloze opties.

Other episodes