4min

Tags in dit artikel

, ,

Globbing en Regex

Belangrijke commands: ls, find, locate, grep, egrep


Het is niet altijd even gemakkelijk om informatie of een bestand terug te vinden in een besturingssysteem. Het is daarom erg prettig om te weten hoe je een zoekopdracht kunt uitvoeren om te vinden wat je nodig hebt. Er zijn verschillende methodes om in het bestandensysteem informatie te vinden. Voordat we daarmee aan de slag gaan, nemen we eerst kennis met twee vormen van zoeken: globbing en regex.

Globbing
Het gebruik van globbing is waarschijnlijk bekender dan het woord zelf. Globbing is afgeleid het unix-command ‘glob’. Letterlijk betekent dit ‘klomp’. Het komt hierop neer dat met ‘klompen’ karakters een patroon gemaakt kan worden, waaraan in de zoekopdracht voldaan moet worden. Dit patroon wordt opgebouwd uit opeenvolgende karakters en ‘wildcards’:

WildcardFunctieVoorbeeld
*Dit is verreweg de bekendste wildcard. Het kan gebruikt worden om een reeks van karakters (string) aan te duiden."*demo*" kan "pandemonium" als resultaat opleveren.
?Het vraagteken lijkt sterk op de asterix, maar hierbij wordt het gebruikt om een enkel karakter weer te geven."d?m?" kan "demo" of "dame" of "dxmy" (etc.) als resultaten opleveren.
[ ]De brackets beperken het aantal mogelijkheden in het patroon, aangegeven door de karakters, die ertussen staan."d[ea]mo" kan alleen "demo" of "damo" als resultaten opleveren.
{ }De accolades doen hetzelfde als de brackets, maar nu kunnen strings, gescheiden door een komma, als treffers worden opgegeven."d{ame,emo}cratie" kan alleen "democratie" of "damecratie" als resultaten opleveren.
^Dit teken wordt niet altijd geaccepteerd als wildcard. Het staat voor het negeren van een patroon"d[^a]me" zal "dame" niet als treffer weergeven. Alle andere treffers uiteraard wel.

De hierboven genoemde voorbeelden zijn simplificaties van wat er allemaal mogelijk is. Wildcards kunnen uiteraard ook in combinatie gebruikt worden:

PHP Code
1
2
d{em*, *am*}
Mogelijke uitkomsten zijn: "demo", "drammer", "democratie", "doorkammen", etc.

Met name ls, locate en find maken gebruik van globbing (hoewel find ook een optie heeft om met regex te werken).

Regular Expressions (Regex)
Met globbing kun je snel informatie vinden in de shell. Veel commands werken echter niet met globbing, maar met Regular Expressions (regex). De meeste mensen kennen een vorm van regex van PHP (bijv. preg_match()). Het is een veel uitgebreidere en krachtigere wijze om informatie te vinden dan met globbing, maar daarmee ook lastiger om onder de knie te krijgen. Hieronder volgt de informatie over het gebruik van regex:

Meta CharacterOmschrijvingVoorbeeld
[ ]Met de brackets kun je aangeven dat op die plaats in het patroon meerdere karakters kunnen voorkomen."d[ae]mo" kan "demo" en "damo" als resultaten opleveren.
( )Met de haken kan een patroon gegroepeerd worden."d(e|a)mo" kan "demo" of "damo" als resultaten opleveren.
{ }De accolades zijn bedoeld om aan te geven hoe vaak het voorgaande patroon mag voorkomen."demo{1,3}" kan "demo" of "demodemo" of "demodemodemo" als resultaten opleveren.
?Het vraagteken is bedoeld om een patroon of karakter aan te duiden, wat 0 of 1 keer voorkomt."bom-?melding" kan "bommelding" of bommelding" als resultaat geven.
+Het plusteken wordt gebruikt om een herhaling van een karakter of patroon aan te geven dat tenminste een keer tot n keer moet voorkomen."d[ma]*e" kan "dame" of "dammammame" (etc) als resultaten opleveren, maar niet "dme".
*De asterix is identiek aan het plusteken, maar met dit verschil, dat het karakter of patroon nul tot n keer moet voorkomen."d[ma]*e" kan "dme", "dame" of "dammammame" (etc) als resultaten opleveren.
.De "dot" staat voor elk willekeurig karakter. Met globbing is het het best te vergelijken met ‘?’."d.mo" kan "demo" of "d2mo" (etc) als resultaten opleveren.
|Hiermee kan een reeks mogelijkheden worden aangegeven: of het een of het ander."d(e|a)mo" kan "demo" of "damo" als resultaten opleveren.
^Dit teken (wel tussen brackets!) is bedoeld om een negatie aan te geven."d[^e]mo" sluit “demo” als resultaat uit.
^Dit teken (niet tussen brackets!) is bedoeld om aan te geven waar een regel mee moet beginnen"^demo" geeft bijv. "democratie", "demografie" of "demo" (etc) als resultaat
$Het dollarteken geeft aan met welk patroon een regel moet eindigen"mo$" kan "demo" of "limo" (etc) als resultaten opleveren.
[backslash]Met de backslash kun je aangeven dat een karakter, wat ook als ‘metacharacter’ bekend staat, als normaal karakter beschouwd moet worden."[backslash]$ 1.25" staat voor "$ 1.25"

Vanzelfsprekend kan met het bovenstaande tabel een enorme verscheidenheid aan patronen gemaakt worden. Het gaat te ver om hier een verdere uitwerking bij te geven. De praktijk leert dat regex op de commandline meestal beperkt wordt tot een paar patronen. Wil je leren om uitgebreide patronen op te stellen (bijvoorbeeld voor procmail, PHP of welke andere toepassing, waar regex zeer bruikbaar is), dan is het aan te raden hier een aparte tutorial voor te zoeken.

Commands als grep en egrep (extended grep) kunnen alleen gebruikt worden met regex. Ook met find -regex kan er met regex gewerkt worden.