Patronen, bestanden en mappen uitsluiten met grep

Patronen, bestanden en mappen uitsluiten met grep
fatmawati achmad zaenuri/Shutterstock.com

Sinds 1974 is de Linux grep command heeft mensen geholpen om strings in bestanden te vinden. Maar soms grep is gewoon te grondig. Hier zijn verschillende manieren om te vertellen grep verschillende dingen te negeren.

Het grep-commando

De grep command doorzoekt tekstbestanden op zoek naar tekenreeksen die overeenkomen met de zoekpatronen die u op de opdrachtregel opgeeft. De kracht van grep ligt in het gebruik van reguliere expressies. Hiermee kunt u beschrijven waarnaar u op zoek bent, in plaats van het expliciet te definiëren.

De geboorte van grep dateert van vóór Linux. het werd begin jaren zeventig op Unix ontwikkeld. Het ontleent zijn naam aan de g/re/p-toetsenreeks in de ed regeleditor (overigens uitgesproken als “ee-dee”). Dit stond voor globaal, met betrekking totgular express zoeken, print bijpassende lijnen.

grep is beroemd – misschien berucht – grondig en doelbewust. Soms doorzoekt het bestanden of mappen waaraan u liever geen tijd verspilt, omdat u door de resultaten door de bomen het bos niet meer kunt zien.

Hoe het grep-commando op Linux te gebruiken

VERWANTHoe het grep-commando op Linux te gebruiken

Natuurlijk zijn er manieren om grep te beheersen. Je kunt het vertellen patronen, bestanden en mappen te negeren, zodat grep zijn zoekopdrachten sneller voltooit en je niet wordt overspoeld met zinloze valse positieven.

Exclusief patronen

Zoeken met grep je kunt er invoer naartoe leiden vanuit een ander proces, zoals: cat of u kunt een bestandsnaam opgeven als de laatste opdrachtregelparameter.

We gebruiken een kort bestand dat de tekst van het gedicht bevat Jabberwocky, door Lewis Carroll. In deze twee voorbeelden zoeken we naar regels die overeenkomen met de zoekterm ‘Jabberwock’.

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

Twee verschillende manieren om hetzelfde tekstbestand te doorzoeken met grep

De regels die overeenkomsten met de zoeksleutel bevatten, worden voor ons weergegeven, waarbij het overeenkomende element in elke regel rood is gemarkeerd. Dat is rechttoe rechtaan zoeken. Maar wat als we regels willen uitsluiten die het woord “Jabberwock” bevatten en de rest willen afdrukken?

Dat kunnen we bereiken met de -v (overeenkomst omkeren) optie. Hiermee worden de regels weergegeven die niet overeenkomen met de zoekterm.

grep -v "Jabberwock" jabberwocky.text

De -v omgekeerde zoekoptie gebruiken met grep

De regels die geen “Jabberwock” bevatten, worden weergegeven in het terminalvenster.

Alle regels die het woord jabberwock niet bevatten

We kunnen zoveel termen uitsluiten als we willen. Laten we alle regels die “Jabberwock” bevatten en alle regels die “en” bevatten eruit filteren. Om dit te bereiken gebruiken we de -e (uitdrukking) optie. We moeten het gebruiken voor elk zoekpatroon dat we gebruiken.

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

Meerdere zoekzinnen gebruiken met grep

Er is een overeenkomstige daling van het aantal regels in de uitvoer.

De regels uit de tekst die met geen van beide zoektermen overeenkomen

Als we de gebruiken -E (uitgebreide regexes) optie, kunnen we de zoekpatronen combineren met “|“, wat in deze context niet duidt op een pijp, het is de logische OR exploitant.

grep -Ev "Jabberwock|and" jabberwocky.txt

De logische OR-operator gebruiken met grep

We krijgen precies dezelfde uitvoer als met de vorige, langerdradige opdracht.

De regels uit de tekst die met geen van beide zoektermen overeenkomen

De indeling van de opdracht is hetzelfde als u een regex-patroon wilt gebruiken in plaats van een expliciete zoekaanwijzing. Met deze opdracht worden alle regels uitgesloten die beginnen met een letter in de set “ACHT”.

grep -Ev "^ACHT" jabberwocky.txt

Bestanden uitsluiten die met bepaalde letters beginnen

Om lijnen te zien die een patroon bevatten maar die ook geen ander patroon bevatten, kunnen we pipe grep naar binnen grep . We zoeken naar alle regels die het woord “Jabberwock” bevatten en filteren vervolgens alle regels die ook het woord “geslacht” bevatten.

grep "Jabberwock" jabberwocky.txt | grep -v "slain"

Greep in grep om tweemaal te filteren

Bestanden uitsluiten

We kunnen het vragen grep om te zoeken naar een string of patroon in een verzameling bestanden. Je zou elk bestand op de opdrachtregel kunnen vermelden, maar bij veel bestanden schaalt die benadering niet.

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

Door een lijst met benoemde bestanden zoeken

Merk op dat de naam van het bestand met de overeenkomende regel wordt weergegeven aan het begin van elke regel met uitvoer.

Om typen te verminderen kunnen we jokertekens gebruiken. Maar dat kan contra-intuïtief zijn. Dit blijkt te werken.

grep "vorpal" *.txt

Jokertekens gebruiken om een ​​verzameling bestanden te doorzoeken

In deze map staan ​​echter andere TXT-bestanden, die niets met het gedicht te maken hebben. Als we zoeken naar het woord ‘zwaard’ met dezelfde opdrachtstructuur, krijgen we veel valse positieven.

grep "sword" *.txt

Zoeken naar "zwaard" via een verzameling TXT-bestanden

De resultaten die we willen worden gemaskeerd door de stortvloed aan valse resultaten van de andere bestanden met de TXT-extensie.

Een grote reeks valse positieven

Het woord “vorpal” kwam met niets overeen, maar “zwaard” is opgenomen in het woord “wachtwoord”, dus het werd vaak gevonden in sommige pseudo-logbestanden.

We moeten deze bestanden uitsluiten. Om dat te doen gebruiken we de --exclude keuze. Om een ​​enkel bestand genaamd “vol-log-1.txt” uit te sluiten, zouden we deze opdracht gebruiken:

grep --exclude=vol-log-1.txt "sword" *.txt

In dit geval willen we meerdere logbestanden uitsluiten met namen die beginnen met ‘vol’. De syntaxis die we nodig hebben is:

grep --exclude=vol*.txt "sword" *.txt

Bestanden met jokertekens uitsluiten

Wanneer we de gebruiken -R (dereferentie-recursieve) optie grep zal hele mappenbomen voor ons doorzoeken. Standaard doorzoekt het alle bestanden op die locaties. Er kunnen meerdere soorten bestanden zijn die we willen uitsluiten.

Onder de huidige map op deze testmachine bevinden zich geneste mappen met logbestanden, CSV-bestanden en MD-bestanden. Dit zijn allemaal typen tekstbestanden die we willen uitsluiten. We kunnen een gebruiken --exclude optie voor elk bestandstype, maar we kunnen efficiënter bereiken wat we willen door de bestandstypen te groeperen.

Deze opdracht sluit alle bestanden uit die CSV- of MD-extensies hebben, en alle TXT-bestanden waarvan de naam begint met “vol” of “log”.

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

Meerdere --exclude-clausules en bestandsnaamgroeperingen gebruiken

Exclusief mappen

Als de bestanden die we willen negeren zich in mappen bevinden en er zijn geen bestanden in die mappen die we wel willen doorzoeken, kunnen we die hele mappen uitsluiten.

Het concept lijkt erg op dat van het uitsluiten van bestanden, behalve dat we de . gebruiken --exclude-dir optie en noem de mappen die u wilt negeren.

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

Een directory uitsluiten van de zoekopdracht

We hebben de map ‘backup’ uitgesloten, maar we zoeken nog steeds in een andere map met de naam ‘backup2’.

Het zal geen verrassing zijn dat we de --exclude-dir optie meerdere keren in één opdracht. Merk op dat het pad naar uitgesloten mappen relatief moet worden gegeven ten opzichte van de map waarin de zoekopdracht zal starten. Gebruik niet het absolute pad vanaf de hoofdmap van het bestandssysteem.

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

Twee mappen uitsluiten van de zoekopdracht

We kunnen ook groepen gebruiken. Hetzelfde kunnen we beknopter bereiken met:

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

Directory's met groepering uitsluiten

U kunt bestands- en directory-uitsluitingen combineren in dezelfde opdracht. Als u alle bestanden uit een map wilt uitsluiten en bepaalde bestandstypen wilt uitsluiten van de mappen die: zijn gezocht, gebruik deze syntaxis:

grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data

Bestandstypen en mappen in dezelfde opdracht uitsluiten

Soms is het wat je weglaat

soms met grep het kan voelen alsof je een speld in een hooiberg probeert te vinden. het maakt een groot verschil om de hooiberg te verwijderen.

Nieuwste artikelen

Gerelateerde artikelen