Tips en Trucs 2011

Zoeken met grep

Elke Linux gebruiker hoort vroeg of laat over de kracht van grep. De eerste pogingen om grep te gebruiken, draaien meestal uit op teleurstellingen. Om grep correct te kunnen gebruiken, moet je reguliere expressies kunnen gebruiken en op de hoogte zijn van de grep opties. Deze constatatie mag echter geen reden zijn om grep niet te gebruiken. Een beginnende gebruiker die basisopdrachten als ls en grafische zoekopdrachten gebruikt, kan meestal niet inschatten welke mogelijkheden grep heeft. Grep betekent "global regular expression print". M.a.w. kennis van reguliere expressies is noodzakelijk om grep te kunnen gebruiken. Moet een beginner dan wachten tot zijn kennis van reguliere expressies is toegenomen? Helemaal niet. Dit zou de gebruiker afschrikken, waardoor ze grep nooit meer gebruiken. Enkele eenvoudige opdrachten liggen in eenieders bereik.

De volgende opdracht toont de bestanden (geen mappen) in de huidige map:
grep -l ".*" *

Deze opdracht is geen typisch voorbeeld van een grep opdracht, maar bewijst wel dat iedereen grep kan gebruiken. De opdracht om de inhoud van een map te tonen, is vanzelfsprekend ls. Laten we grep inzetten voor iets wat ls niet kan. De volgende opdracht zoekt bestanden waarin de tekst desktop voorkomt:
grep -l "desktop" *

Om inclusief de submappen te doorzoeken, voeg je de optie r (resursief) toe:
grep -lr "desktop" *

De optie l zorgt ervoor dat enkel de bestandsnaam van de gevonden bestanden getoond wordt, m.a.w. de volgende opdracht toont naast de bestandsnaam ook de regel waarin de tekst gevonden werd:
grep -r "desktop" *

Verder naar het eerste niveau

Om meer uit grep te halen, moet je reguliere expressies gebruiken. Een stap voor stap aanpak lijkt me beter dan een zelfstudie voor reguliere expressies. De zelfstudies voor reguliere expressies zijn meestal zeer technisch waardoor je vlug de draad kwijt kunt raken, met alle gevolgen van dien. Het volgende voorbeeld kan dienen als eerste opdracht waarbij een reguliere expressie gebruikt wordt. Daar de opdracht sterkt lijkt op vorige opdrachten merkt een doorsnee gebruiker waarschijnlijk niet eens een verschil. De kleine aanpassing zorgt echter voor enorme verschillen. de volgende opdracht zoekt naar bestanden die zowel de tekst linus als linux bevatten:
grep "linu[sx]" *

Als je deze opdracht in uw Persoonlijke map uitvoert, is de kans groot dat grep niets vindt. Om de kans op resultaten te vergroten voer je deze en de volgende opdrachten beter uit in de map /etc/. Met de opdracht cd /etc open je de map /etc/. Daar je als gewone gebruiker niet alle rechten hebt, staan tussen de resultaten ook regels met niet onderzochte bestanden. Deze niet onderzochte bestanden herken je aan de melding Toegang geweigerd (wegens geen leesrecht).

Verder naar het tweede niveau

Grep werd door de kleine aanpassing een stuk krachtiger. Grep wordt nog krachtiger door het toevoegen van de tekens "^" en "$". De volgende opdracht zoekt bestanden waarin regels staan die met de letter a beginnen:
grep "^a" *

De volgende opdracht zoekt naar bestanden waarin regels staan die met de letter d eindigen:
grep "d$" *

Door beide opdrachten te combineren, kun je zoeken naar bestanden waarin regels staan die met de letter a beginnen en met de letter d eindigen:
grep "^a.*d$" *

De punt tussen de twee onderdelen zorgt ervoor dat er tussen de letter a en d om het even wat mag staan.

Verder naar het derde niveau

Door gebruikt te maken van de voordien reeds gebruikte rechte haken, kun je zoeken naar meerdere tekens door ze tussen rechte haken te plaatsen. Om bijvoorbeeld te zoeken naar regels die starten met de letters a, e, i, o of u gebruikt je de volgende opdracht:
grep "^[aeiou]" *

Deze opdracht zoekt naar regels die starten met een klinker. Door te combineren zoekt de volgende opdracht naar regels die beginnen met de letters a of b en eindigen met de letters d of s:
grep "^[ab].*[ds]$" *

De expressies tussen de rechte haken kunnen we nog verder uitbreiden door gebruik te maken van bereiken of groepen

Door gebruik te maken van bovenstaande bereiken, kun je met de volgende opdracht zoeken naar regels die starten met een letter en eindigen met een cijfer:
grep "^[A-Za-z].*[0-9]$" *

Deze voorbeelden moeten volstaan om elke linux gebruiker de kracht van grep te laten ervaren. Om grep helemaal te beheersen, raadpleeg je best de man of info pagina's van grep en geavanceerde zelfstudies (tutorials op het internet) over grep of regex (over reguliere expressies).