Met het grep commando kun je zoeken naar tekst in meerdere bestanden. Laten we eens zoeken naar het woord raspberry in alle bestanden in /var/log die eindigen op log.
cd /var/log grep raspberry *log auth.log:Dec 23 06:25:17 raspberrypi CRON[11738]: pam_unix(cron:session): session closed for user root
Je ziet waarschijnlijk heel veel regels voorbij schieten, waarvan ik er hier maar een laat zien. Aan het begin van iedere regel staat de bestandsnaam waar de tekst raspberry in gevonden is. De rest van de regel is de tekst op de regel in de file waar het woord raspberry in gevonden is.
De zoekterm is hoofdletter gevoelig.
Zoek maar eens op het woord Raspberry, en je zult zien dat er niets gevonden wordt.
Door de -i switch te gebruiken geef je aan dat je grep wilt gebruiken zonder verschil te maken tussen hoofd en kleine letters.
Let ook op dat sommige leestekens, inclusief de spaties, een andere betekenis hebben voor Bash.
Als je dus zoekt op tekst waar bijvoorbeeld een spatie in zit dan moet je de zoekterm omgeven door aanhalingstekens.
Of je moet de leestekens Escapen met het \ symbool.
grep "random time" *log grep random\ time *log
Je kunt meerdere grep commando’s aan elkaar koppelen om je zoekopdracht te verfijnen.
grep raspberry *log | grep root
Dit zoekt naar alle regels in alle bestanden die eindigen op log waar het woord raspberry in voorkomt. Die uitkomst wordt daarna nog eens onderzocht naar regels waar het woord root in voorkomt. Laten we zeggen dat we niet geïnteresseerd bent in regels met het woord close erin. Dan kun je grep ook opdracht geven om omgekeerd te filteren.
grep raspberry *log | grep root | grep -v closed
Dus alle regels waar de zoekterm closed in voorkomt worden genegeerd wanneer de -v switch gebruikt wordt.
Grep is een heel krachtig commando en wordt zeer vaak gebruikt, vooral in Bash scripts. Je kunt bijvoorbeeld ook nog aangeven hoeveel regels je voor of na de gevonden regels nog wilt weergeven. Dus als je naar een bepaald woord zoekt zal niet alleen de regel getoond worden waar het woord in staat wat je zoekt, maar ook het aangegeven regels voor (-B parameter, van Before) of na (-A parameter, van After) die regel. Op die manier kun je heel diep in bestanden gaan zoeken.
Je kunt ook recursief zoeken. Dat wil zeggen dat je ook in subdirectories wilt zoeken. Dat doe je door het geven van de -r switch.
Tegenwoordig kun je ook zoeken met het ag commando. Dit commando is doorgaans niet standaard aanwezig op je systeem. Je zult het dus waarschijnlijk eerst zelf moeten installeren.
sudo apt install silversearcher-ag
Ik weet niet of het klopt, maar ik kan me voorstellen dat ag een afkorting is van Advanced Grep.
En ag is het symbool voor zilver in het periodiek stelsel, vandaar de naam silversearcher.
Zodra ag geïnstalleerd is kun je gewoon gaan zoeken.
ag raspberry *log
De output van ag is iets anders dan die van grep. Er wordt steeds maar een keer aangegeven in welk bestand de gevonden regels in voorkomen. Daarna komen alle gevonden regels in dat bestand, voorzien van een teller.
Een ander groot verschil met grep is dat je niet speciaal aan hoeft te geven dat je recursief wenst te zoeken, dat doet ag namelijk vanzelf al.
Voor de rest kent ag zo’n beetje alle trucjes die ook grep kent.
Vooral in het dagelijkse zoekwerk is ag net even wat handiger, gewoon omdat je niet op hoeft te geven in welke bestanden je wilt zoeken.
En omdat het standaard ook in subdirectories gaat zoeken.
Als je namelijk grep gebruikt, zonder dat je aangeeft in welke bestanden je wilt zoeken, zal grep heel dom staan wachten op dingen die jij intypt.
Pas nadat je dan Ctrl-D indrukt krijg je de regels te zien die de zoekterm bevatten.
Niet heel nuttig.
Het ag commando daarentegen snapt dat je in alle bestanden wilt zoeken als je niet specifiek aangeeft in welke bestanden je wenst te zoeken.
Het find commando is een beetje een raar, maar daarmee wel een heel krachtig commando. Er zijn een paar dingen die find bijzonder maken. Je kunt namelijk niet alleen zoeken naar bestanden, maar ook naar bijvoorbeeld directories. Of je kunt zoeken naar bestanden die recent zijn gewijzigd, of groter zijn dan een bepaald aantal bytes. En je kunt ook nog eens direct commando’s uit laten voeren op de gevonden bestanden.
Wanneer je naar een bestand zoekt met de naam voorbeeld doe je bijvoorbeeld dit:
find ./ -name voorbeeld
Eerst geef je op vanaf waar je wilt zoeken. In dit voorbeeld is dat ./ wat zoveel betekent vanaf hier verder de boom in. Dan geef je op waar je naar zoekt, in dit geval zoek je naar een bestand met een bepaalde naam. Merk op dat dit een lange parameter is, die in dit geval wordt voorafgegaan door slechts 1 steepje, een beetje ongewoon dus. Tenslotte moet je nog de naam opgeven van het bestand wat je wilt zoeken.
Zoals gezegd kan het commando find veel meer dan dit. Maar dat is iets voor een andere keer.