Android

Grep-opdracht in linux (tekst zoeken in bestanden)

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

Inhoudsopgave:

Anonim

Het grep commando dat staat voor "global regular expression print" is een van de krachtigste en meest gebruikte commando's in Linux.

Grep zoekt in een of meer invoerbestanden naar lijnen die overeenkomen met een bepaald patroon en schrijft elke overeenkomende lijn naar standaarduitvoer. Als er geen bestanden worden opgegeven, leest grep van de standaardinvoer, meestal de uitvoer van een andere opdracht.

In deze zelfstudie laten we u zien hoe u het grep commando kunt gebruiken door praktische voorbeelden en gedetailleerde uitleg over de meest voorkomende GNU grep opties.

Grep Command Syntax

Laten we eerst de basissyntaxis bekijken voordat we ingaan op het gebruik van de opdracht grep .

De grep hulpprogramma-expressies hebben de volgende vorm:

grep PATTERN

De items tussen vierkante haakjes zijn optioneel.

  • OPTIONS - Nul of meer opties. Grep biedt een aantal opties die zijn gedrag bepalen. PATTERN - Zoekpatroon. FILE - Nul of meer invoerbestandsnamen.

Om het bestand te kunnen doorzoeken, moet de gebruiker die de opdracht uitvoert, leestoegang tot het bestand hebben.

Hoe grep te gebruiken om naar een string in bestanden te zoeken

Het meest elementaire gebruik van de opdracht grep is om te zoeken naar een tekenreeks (tekst) in een bestand.

Om bijvoorbeeld de regels uit het bestand /etc/passwd met de string bash geven, kunt u de volgende opdracht gebruiken:

grep bash /etc/passwd

De output zou er ongeveer zo uit moeten zien:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Als de tekenreeks spaties bevat, moet u deze tussen enkele of dubbele aanhalingstekens plaatsen:

grep "Gnome Display Manager" /etc/passwd

Match omkeren (uitsluiten)

Gebruik de optie -v (of - --invert-match ) om de lijnen weer te geven die niet overeenkomen met een patroon.

Om bijvoorbeeld de regels uit het bestand /etc/passwd te geven die niet de string nologin bevatten, kunt u de volgende opdracht gebruiken:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Hoe Grep te gebruiken om naar een tekenreeks in opdrachtuitvoer te zoeken

In plaats van invoerbestanden op te geven, kunt u de uitvoer van een andere opdracht naar grep en vervolgens alleen lijnen weergeven die overeenkomen met een bepaald patroon.

Om bijvoorbeeld te achterhalen welke processen op uw systeem worden uitgevoerd als gebruiker www-data , kunt u de volgende ps opdracht gebruiken:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

U kunt ook meerdere pijpen op commando koppelen. Zoals u in de bovenstaande output kunt zien, is er ook een regel met het grep proces. Als u niet wilt dat die regel wordt weergegeven, geeft u de uitvoer door aan een andere grep instantie, zoals hieronder wordt weergegeven.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Recursief zoeken

Als u recursief naar een patroon wilt zoeken, gebruikt u de optie -r (of --recursive ). Hiermee worden alle bestanden in de opgegeven map doorzocht, waarbij de symlinks worden overgeslagen die recursief worden aangetroffen. Gebruik de optie -R (of --dereference-recursive ) om alle symbolische koppelingen te volgen.

In het volgende voorbeeld zoeken we naar de string linuxize.com in alle bestanden in de map /etc :

grep -r linuxize.com /etc

Met de opdracht worden de overeenkomende regels met het volledige pad naar het bestand afgedrukt.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Als in plaats daarvan -r optie -R , zal grep alle symbolische links volgen:

grep -R linuxize.com /etc

Let op de laatste regel van de uitvoer. Die regel wordt in het bovenstaande voorbeeld niet afgedrukt, omdat bestanden in de directory van de Nginx- sites-enabled symlinks zijn naar configuratiebestanden in de directory die sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Toon alleen de bestandsnaam

Om de standaard grep uitvoer te onderdrukken en alleen de namen van bestanden met het overeenkomende patroon af te drukken, kunt u de optie -l (of --files-with-matches ) gebruiken.

Om bijvoorbeeld alle bestanden te doorlopen die eindigen op .conf in de huidige werkmap en alleen de namen van bestanden af ​​te drukken die de string linuxize.com bevatten:

grep -l linuxize.com *.conf

De uitvoer ziet er ongeveer zo uit:

tmux.conf haproxy.conf

De optie -l wordt meestal gebruikt in combinatie met de recursieve optie -R :

grep -Rl linuxize.com /tmp

Niet hoofdlettergevoelig zoeken

Standaard is de opdracht grep hoofdlettergevoelig. Dit betekent dat de hoofdletters en kleine letters als verschillend worden behandeld.

Gebruik de optie -i (of --ignore-case ) om hoofdletters en kleine letters te negeren tijdens het zoeken.

Wanneer u bijvoorbeeld zonder optie naar Zebra zoekt, geeft het volgende commando geen uitvoer weer, dwz er zijn overeenkomende lijnen:

grep Zebra /usr/share/words

Maar als u een hoofdletterongevoelige zoekopdracht uitvoert met de optie -i , komen deze overeen met zowel hoofdletters als kleine letters:

grep -i Zebra /usr/share/words

Het opgeven van "Zebra" komt overeen met "zebra", "ZEbrA" of een andere combinatie van hoofdletters en kleine letters voor die tekenreeks.

zebra zebra's zebras

Zoeken naar volledige woorden

Bij het zoeken naar "gnu", zal grep ook de lijnen afdrukken waarin "gnu" is ingebed in grotere woorden, zoals "cygnus" of "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Gebruik de optie -w (of --word-regexp ) om alleen die regels terug te geven waarbij de opgegeven tekenreeks een heel woord is (ingesloten door niet-woordtekens).

Woordtekens bevatten alfanumerieke tekens ( az , AZ en 0-9 ) en onderstrepingstekens ( _ ). Alle andere tekens worden beschouwd als niet-woordtekens.

grep -w gnu /usr/share/words

gnu

Toon regelnummers

Gebruik de optie -n (of --line-number ) om het aantal lijnen weer te geven dat een tekenreeks bevat die overeenkomt met een patroon. Wanneer u deze optie gebruikt, drukt grep de overeenkomsten af ​​naar de standaarduitvoer, voorafgegaan door het regelnummer waarop het werd gevonden.

Als u bijvoorbeeld de regels uit het bestand /etc/services met de string bash voorafgegaan door het overeenkomende regelnummer, kunt u de volgende opdracht gebruiken:

grep -n 10000 /etc/services

De onderstaande output toont ons dat de overeenkomsten zijn gevonden op lijnen 10423 en 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Aantal wedstrijden tellen

Gebruik de optie -c (of --count ) om een ​​aantal overeenkomende lijnen af ​​te drukken op standaarduitvoer.

In het onderstaande voorbeeld tellen we het aantal accounts met /usr/bin/zsh als shell.

grep -c '/usr/bin/zsh' /etc/passwd

4

Zoeken naar meerdere tekenreeksen (patronen)

Twee of meer zoekpatronen kunnen worden samengevoegd met de operator OR | .

Standaard interpreteert grep het patroon als een standaard reguliere expressie waarbij de meta-tekens zoals | verliezen hun speciale betekenis en hun backslash-versies moeten worden gebruikt.

In het onderstaande voorbeeld zoeken we alle gevallen van de woorden fatal , error en critical in het Nginx-logbestand met fouten:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Stille modus

De -q (of - --quiet ) vertelt grep om niets naar de terminal te schrijven (standaarduitvoer). Als een overeenkomst wordt gevonden, wordt het commando afgesloten met status 0 . Dit is handig wanneer u grep in shellscripts gebruikt, waarbij u wilt controleren of een bestand een string bevat en een bepaalde actie uitvoert, afhankelijk van het resultaat.

Hier is een voorbeeld van het gebruik van grep in een stille modus als testopdracht in een if opdracht:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Standaard reguliere expressie

GNU Grep heeft twee functiesets voor reguliere expressie, Basic en Extended. Standaard interpreteert grep het patroon als een standaard reguliere expressie.

Bij gebruik in de standaard reguliere expressie-modus zijn alle andere tekens behalve de meta-tekens eigenlijk reguliere expressies die overeenkomen. Hieronder staat een lijst met de meest gebruikte meta-tekens:

  • Gebruik het ^ (caret) symbool om de uitdrukking aan het begin van een regel te matchen. In het volgende voorbeeld komt de tekenreeks ^kangaroo alleen overeen als deze aan het begin van een regel voorkomt.

    grep "^kangaroo" file.txt

    Gebruik het $ (dollar) symbool om de uitdrukking aan het einde van een regel te matchen. In het volgende voorbeeld komt de tekenreeks kangaroo$ alleen overeen als deze aan het einde van een regel voorkomt.

    grep "kangaroo$" file.txt

    Gebruik de . (punt) symbool voor elk willekeurig teken. Als u bijvoorbeeld alles wilt matchen dat begint met kan dan twee tekens heeft en eindigt op de tekenreeks roo , kunt u het volgende patroon gebruiken:

    grep "kan..roo" file.txt

    Gebruik (haakjes) om overeen te komen met elk enkel teken tussen haakjes. Zoek bijvoorbeeld de lijnen die accept of ' accent ' bevatten, u zou het volgende patroon kunnen gebruiken:

    grep "accet" file.txt

    Gebruik (haakjes) om overeen te komen met elk enkel teken tussen haakjes. Het volgende patroon komt overeen met elke combinatie van tekenreeksen die co(any_letter_except_l)a , zoals coca , cobalt , enzovoort, maar komt niet overeen met de lijnen die cola bevatten, grep "coa" file.txt

Gebruik het symbool \ (backslash) om aan de speciale betekenis van het volgende teken te ontsnappen.

Uitgebreide reguliere expressies

Gebruik de optie -E (of --extended-regexp ) om het patroon te interpreteren als een uitgebreide reguliere expressie. Uitgebreide reguliere expressies bevatten alle basis meta-tekens, samen met extra meta-tekens om complexere en krachtigere zoekpatronen te creëren. Hieronder staan ​​enkele voorbeelden:

  • Vergelijk en pak alle e-mailadressen uit een bepaald bestand:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Vergelijk en pak alle geldige IP-adressen uit een bepaald bestand:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

De optie -o wordt gebruikt om alleen de overeenkomende string af te drukken.

Lijnen afdrukken voor een wedstrijd

Gebruik de optie -B (of --before-context ) om een ​​specifiek aantal regels af te drukken voordat de regels overeenkomen.

Als u bijvoorbeeld vijf regels leidende context wilt weergeven voordat regels overeenkomen, gebruikt u de volgende opdracht:

grep -B 5 root /etc/passwd

Lijnen afdrukken na een wedstrijd

Gebruik de optie -A (of --after-context ) om een ​​specifiek aantal regels na overeenkomende regels af te drukken.

Als u bijvoorbeeld vijf regels volgcontext wilt weergeven na overeenkomende regels, gebruikt u de volgende opdracht:

grep -A 5 root /etc/passwd

Conclusie

Met de opdracht grep kunt u zoeken naar een patroon in bestanden. Als een overeenkomst wordt gevonden, drukt grep de lijnen af ​​die het opgegeven patroon bevatten.

Er is nog veel meer te leren over Grep op de gebruikerspagina van Grep.

grep-terminal