Tips en Trucs 2017

Zoeken met grep

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.

Zoeken naar tekst in een bestand

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.

Zoeken met jokers

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.

Zoeken naar tekst aan het begin of het einde van een regel

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

Tellen

Als je enkel wilt weten hoeveel overeenkomsten er zijn, gebruik dan de optie -c (count):

dany@main:~> grep Brugge$ voetbalclubs.txt -c
2

Zoeken naar wat niet overeenkomt

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

Zoeken naar lege regels

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:

Zoeken naar hoofd-, kleine letters of cijfers

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)

Zoeken naar zich herhalende patronen

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.

De uitvoer van andere opdrachten filteren

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

Samenvatting

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.