9.Linux для Начинающих - Комманда grep и Регулярные Выражения
Inhoudsopgave:
- Grep Command Syntax
- Hoe
grep
te gebruiken om naar een string in bestanden te zoeken - Match omkeren (uitsluiten)
- Hoe Grep te gebruiken om naar een tekenreeks in opdrachtuitvoer te zoeken
- Recursief zoeken
- Toon alleen de bestandsnaam
- Niet hoofdlettergevoelig zoeken
- Zoeken naar volledige woorden
- Toon regelnummers
- Aantal wedstrijden tellen
- Zoeken naar meerdere tekenreeksen (patronen)
- Stille modus
- Standaard reguliere expressie
- Uitgebreide reguliere expressies
- Lijnen afdrukken voor een wedstrijd
- Lijnen afdrukken na een wedstrijd
- Conclusie
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
:
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.
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).
az
,
AZ
en
0-9
) en onderstrepingstekens (
_
). Alle andere tekens worden beschouwd als niet-woordtekens.
grep -w gnu /usr/share/words
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
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 tekenreekskangaroo$
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 metkan
dan twee tekens heeft en eindigt op de tekenreeksroo
, kunt u het volgende patroon gebruiken:grep "kan..roo" file.txt
Gebruik
accept
of 'accent
' bevatten, u zou het volgende patroon kunnen gebruiken:grep "accet" file.txt
Gebruik
co(any_letter_except_l)a
, zoalscoca
,cobalt
, enzovoort, maar komt niet overeen met de lijnen diecola
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:
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:
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-terminalZoeken naar tekst in gescande bestanden met Recollect Desktop
Dit programma gaat waar andere zoekprogramma's dat niet doen: e-mail, PDF's, gescand documenten, en meer.
Snel zoeken naar bestanden: zoek uw bestanden supersnel op in Windows
Snel zoeken naar bestanden is een freeware die uw bestanden doorzoekt in een kwestie van slechts enkele seconden, waarmee u uw wachttijd en inspanningen bespaart. Werkt op alle Windows.
Uploader voor bestanden en afbeeldingen: upload bestanden naar meerdere hostwebsites voor bestanden
Gratis bestands- en afbeeldinguploader wordt automatisch aangepast, upload 1 of meer bestanden naar een enkele of meerdere bestandshostingwebsites met slechts een enkele klik.