Grep staat voor Global Regular Expression Printer en wordt gebruikt om tekstinvoer te filteren. We bekijken enkele praktische toepassingen waarvoor je deze opdracht kunt gebruiken.
We beginnen met een tekst met de volgende kinderboeken:
Robin Hood Roodkapje Peter Pan Goudlokje en de drie beren Sneeuwwitje en de Zeven Dwergen Pinocchio De kat in de hoed De drie kleine biggetjes De Gruffalo Sjakie en de chocoladefabriek
Om alle boeken met het woord de in de titel te zoeken, gebruik je de volgende opdracht:
dany@laptop:~> grep de kinderboeken.txt
Goudlokje en de drie beren
Sneeuwwitje en de Zeven Dwergen
De kat in de hoed
Sjakie en de chocoladefabriek
Het opgezochte woord wordt in de uitvoer geaccentueerd weergeven.
Merk op dat grep standaard hooftlettergevoelig zoekt, met een extra optie schakel je de hoofdlettergevoeligheid uit:
dany@laptop:~> grep de kinderboeken.txt --ignore-case
Goudlokje en de drie beren
Sneeuwwitje en de Zeven Dwergen
De kat in de hoed
De drie kleine biggetjes
De Gruffalo
Sjakie en de chocoladefabriek
De optie --ignore-case
kan je ook verkort schrijven als -i
.
Grep is een krachtige opdracht die met patronen kan werken. We kunnen dit gebruiken om te zoeken met jokertekens.
We gebruiken een testbestand met Schotse steden:
aberdeen aberystwyth aberlour inverurie inverness newburgh new deer new galloway glasgow edinburgh
Om de steden te vinden met inver in de naam, gebruik je de volgende opdracht:
dany@laptop:~> grep inver* Schotse\ steden.txt
inverurie
inverness
Het * staat voor geen of meerdere willekeurige tekens. Een andere joker is de punt (.) waarmee je één willekeurig teken kunt voorstellen.
dany@laptop:~> grep inver.r Schotse\ steden.txt
inverurie
De punt joker is handig maar kan voor problemen zorgen als er een punt in de te zoeken tekst voorkomt. Beschouw de volgende lijst met domeinnamen:
linux.pindanet.be raspberry.pindanet.be netwerk.pindanet.be webdesign.pindanet.be javascript.pindanet.be php.pindanet.be cloud.pindanet.be macos.pindanet.be socnet.pindanet.be windows.pindanet.be google.be snt.be belnet.be
Om alle pindanet.be domeinen te zoeken, gebruik je:
dany@laptop:~> grep pindanet domeinen.txt
linux.pindanet.be
raspberry.pindanet.be
netwerk.pindanet.be
webdesign.pindanet.be
javascript.pindanet.be
php.pindanet.be
cloud.pindanet.be
macos.pindanet.be
socnet.pindanet.be
windows.pindanet.be
Maar mocht er toevallig een URL zoals wikipedia.be/pindanet tussenstaan, dan zou die ook in de zoekresultaten voorkomen. Je kunt dan de volgende opdracht proberen:
dany@laptop:~> grep pindanet.be domeinen.txt
linux.pindanet.be
raspberry.pindanet.be
netwerk.pindanet.be
webdesign.pindanet.be
javascript.pindanet.be
php.pindanet.be
cloud.pindanet.be
macos.pindanet.be
socnet.pindanet.be
windows.pindanet.be
Maar deze opdracht zou ook pindanetebe weergeven. Om zeker te zijn dat je enkel de pindanet.be domeinen krijgt, moet grep de punt als een teken en niet als een joker interpreteren. Dit kan door er een backslash voor te plaatsen (escapen):
dany@laptop:~> grep pindanet\.be domeinen.txt
linux.pindanet.be
raspberry.pindanet.be
netwerk.pindanet.be
webdesign.pindanet.be
javascript.pindanet.be
php.pindanet.be
cloud.pindanet.be
macos.pindanet.be
socnet.pindanet.be
windows.pindanet.be
De joker ? staat voor geen of één willekeurig teken:
dany@main:~> grep ?ber Schotse\ steden.txt --extended-regexp
aberdeen
aberystwyth
aberlour
De --extended-regexp
optie gebruik je om grep duidelijk te maken dat je uitgebreide zoekpatronen gebruikt.
Deze optie kan je verkort als -E
schrijven.
Het teken ^ staat voor het begin van de regel, $ voor het einde van de regel.
Beschouw een bestand met de volgende voetbalclubs:
Standaard Luik Club Brugge Club Luik KSC Lokeren OV KSC Eendracht Aalst Cercle Brugge KSC Hasselt
Om alle voetbalclubs te vinden die beginnen met Club, gebruik je de opdracht:
dany@main:~> grep ^Club voetbalclubs.txt
Club Brugge
Club Luik
Alle clubs die eindigen op Brugge:
dany@main:~> grep Brugge$ voetbalclubs.txt
Club Brugge
Cercle Brugge
Als je enkel wilt weten hoeveel overeenkomsten er zijn, gebruik dan de optie -c
(count):
dany@main:~> grep Brugge$ voetbalclubs.txt -c
2
We gebruiken een bestand met steden en het land waarin ze liggen:
Brugge België Gent België Antwerpen België Groningen Nederland Amsterdam Nederland Rotterdam Nederland Rijsel Frankrijk Parijs Frankrijk
Om alle Belgische steden op te zoeken, gebruik je:
dany@main:~> grep België$ stad-land.txt
Brugge België
Gent België
Antwerpen België
Om alle niet Belgische steden op te zoeken, gebruik je:
dany@main:~> grep België$ stad-land.txt -v
Groningen Nederland
Amsterdam Nederland
Rotterdam Nederland
Rijsel Frankrijk
Parijs Frankrijk
Het bestand met steden en landen wordt als volgt aangepast:
Brugge België Gent België Antwerpen België Groningen Nederland Amsterdam Nederland Rotterdam Nederland Rijsel Frankrijk Parijs Frankrijk
Lege regels zoek je met:
dany@main:~> grep ^$ stad-land.txt
Het enige dat je met deze opdracht krijgt, zijn onzichtbare lege regels, niet zo erg handig. Als test tel je het aantal lege regels met:
dany@main:~> grep ^$ stad-land.txt -c
2
Om de regelnummers van de lege regels op te sporen (bijvoorbeeld om ze later te verwijderen), gebruik je:
dany@main:~> grep ^$ stad-land.txt -n
4:
8:
We gebruiken de volgende lijst met noodnummers:
Ambulance / Brandweer 112 Amnesty Int. Vlaanderen 03 / 271 16 16 Anonieme Alcoholisten 03 / 239 14 15 Antigif Centrum 070 / 245 245 Awel 102 Brandwonden Centra 02 / 268 62 00 Card Stop 070 / 344 344 Child focus 116000 +32 2 475 44 99 (buitenland)
Welke regels bevatten hoofdletters?
dany@main:~> grep '[A-Z]' noodnummers.txt
Ambulance / Brandweer 112
Amnesty Int. Vlaanderen 03 / 271 16 16
Anonieme Alcoholisten 03 / 239 14 15
Antigif Centrum 070 / 245 245
Awel 102
Brandwonden Centra 02 / 268 62 00
Card Stop 070 / 344 344
Child focus 116000
Welke regels bevatten kleine letters?
dany@main:~> grep '[a-z]' noodnummers.txt
Ambulance / Brandweer 112
Amnesty Int. Vlaanderen 03 / 271 16 16
Anonieme Alcoholisten 03 / 239 14 15
Antigif Centrum 070 / 245 245
Awel 102
Brandwonden Centra 02 / 268 62 00
Card Stop 070 / 344 344
Child focus 116000
+32 2 475 44 99 (buitenland)
Welke regels bevatten letters?
dany@main:~> grep '[a-zA-Z]' noodnummers.txt
Ambulance / Brandweer 112
Amnesty Int. Vlaanderen 03 / 271 16 16
Anonieme Alcoholisten 03 / 239 14 15
Antigif Centrum 070 / 245 245
Awel 102
Brandwonden Centra 02 / 268 62 00
Card Stop 070 / 344 344
Child focus 116000
+32 2 475 44 99 (buitenland)
Welke regels bevatten cijfers?
dany@main:~> grep '[0-9]' noodnummers.txt
Ambulance / Brandweer 112
Amnesty Int. Vlaanderen 03 / 271 16 16
Anonieme Alcoholisten 03 / 239 14 15
Antigif Centrum 070 / 245 245
Awel 102
Brandwonden Centra 02 / 268 62 00
Card Stop 070 / 344 344
Child focus 116000
+32 2 475 44 99 (buitenland)
Om te zoeken naar Belgische noodnummers vanuit het buitenland (beginnen met + gevold door twee cijfers voor het landnummer):
dany@main:~> grep '+[0-9][0-9]' noodnummers.txt
+32 2 475 44 99 (buitenland)
Dit kan je korter noteren door gebruik te maken van accolades met daartussen het aantal keer dat het vorige teken moet voorkomen:
dany@main:~> grep '+[0-9]\{2\}' noodnummers.txt
+32 2 475 44 99 (buitenland)
Let op het escapen van de accolades. Deze zoekactie toont alle regels met minstens twee cijfers na het plus teken. Met de volgende zoekactie worden alle regels opgezocht waarin getallen met drie tot zes cijfers aan het einde van de regel voorkomen:
dany@main:~> grep '[0-9]\{3,6\}' noodnummers.txt
Ambulance / Brandweer 112
Antigif Centrum 070 / 245 245
Awel 102
Card Stop 070 / 344 344
Child focus 116000
Het eerste getal tussen de accolades geeft dus het minimum aantal weer, het tweede getal het maximum aantal.
Met de opdracht ps -ef
kan je een lange lijst met actieve processen weergeven.
Als je op zoek bent of een bepaald proces actief is, gebruik je:
dany@main:~> ps -ef | grep firefox
dany 2464 2453 14 11:26 ? 00:38:42 /usr/lib64/firefox/firefox https://duckduckgo.com/?q=linux+tips+trucs
dany 24724 7309 0 15:56 pts/1 00:00:00 grep --color=auto firefox --color=always
De grep opdracht is een basis Linux opdracht die je vast en zeker moet leren gebruiken. Het maakt het leven een stuk eenvoudiger bij het doorzoeken van tekstbestanden en processen op de terminal.