Tips en Trucs 2011

Reguliere expressies en grep

GNU grep ondersteunt uitgebreide reguliere expressies en is in elke distributie standaard geïnstalleerd. We gebruiken de grep terminal opdracht om informatie op een computer of server op te sporen.

Reguliere expressies

Een reguliere expressie is een patroon waaraan een ingevoerde regel moet voldoen. Dit patroon is een opeenvolging van karakters. Een paar voorbeelden:
^w1
w1|w2
[^ ]

Voorbeelden van reguliere expressies met grep

Zoeken naar 'daemon' in /etc/passwd:
grep daemon /etc/passwd

Levert bijvoorbeeld de volgende uitvoer:
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
avahi:x:103:106:User for Avahi:/var/run/avahi-daemon:/bin/false
daemon:x:2:2:Daemon:/sbin:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
ntp:x:74:104:NTP daemon:/var/lib/ntp:/bin/false
pulse:x:105:108:PulseAudio daemon:/var/lib/pulseaudio:/sbin/nologin
sshd:x:101:102:SSH daemon:/var/lib/sshd:/bin/false
statd:x:106:65534:NFS statd daemon:/var/lib/nfs:/sbin/nologin
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
usbmux:x:107:65534:usbmuxd daemon:/var/lib/usbmuxd:/sbin/nologin

Zoek hoofdletterongevoelig naar 'daemon' in /etc/passwd:
grep -i -w daemon /etc/passwd

Zoek in /etc/passwd hoofdletterongevoelig naar 'daemon' of 'nobody':
grep -E -i -w 'daemon|nobody' /etc/passwd

Het patroon in het laatste voorbeeld gebruikt een uitgebreide reguliere expressie.

Ankers

Je kunt ^ of $ gebruiken in reguliere expressies het begin of het einde van een regel aan te duiden. Het volgende voorbeeld toont enkel regels die beginnen met daemon:
grep ^daemon /etc/passwd

Zoek in /etc/passwd naar regels die eindigen op login:
grep 'login$' /etc/passwd

Zoek in /etc/filesystems naar regels die enkel het woord vfat bevatten:
grep '^ntfs$' /etc/filesystems

Zoek in /etc/filesystems naar lege regels:
grep '^$' /etc/filesystems

Klassen met tekens

Zoek in /etc/services naar echo of Echo:
grep '[eE]cho' /etc/services

Of:
grep '[eE][cC][hH][oO]' /etc/services

Zoek in /etc/services naar twobase gevolgd door 2 cijfers:
grep 'twobase[0-9][0-9]' /etc/services

Dit is niet beperkt tot cijfers, zoek in /etc/services naar regels die beginnen met een letter:
grep '^[A-Aa-z]' /etc/services

Zoek in /etc/services naar regels die eindigen op w of q:
grep '[wq]$' /etc/services

Binnen [[: en :]] kun je een naam van een klasse opgeven. De standaard klassen met tekens zijn:

Zoek naar in /etc/services naar regels die beginnen met een hoofdletter:
grep '^[[:upper:]]' /etc/services

Jokers

Je kunt een punt gebruiken om een enkel teken voor te stellen. Het voorbeeld zoekt in /etc/services naar woorden met drie letters die beginnen met a en eindigen op i:
grep '\<a.i\>' /etc/services

Daarbij staat de expressie \< voor het begin van een woord en \> voor het einde van een woord.

Zoek in /etc/services naar regels die uit juist vier tekens bestaan:
grep '^....$' /etc/services

Zoek in /etc/services naar regels die eindigen op een cijfer en een punt:
grep '[0-9]\.$' /etc/services

Punten (letterlijk) zoeken

De volgende reguliere expressie om het IP adres 192.219.82.71 in /etc/services te zoeken, werkt niet altijd zoals het hoort:
grep '192.219.82.71' /etc/services

De drie punten moet je escapen (letterlijk en niet als joker gebruikt worden):
grep '192\.219\.82\.71' /etc/services

De volgende opdracht zoekt in /etc/services naar IP adressen:
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/services

Zoeken naar patronen die beginnen met een - teken

Gebruik de optie -e om te zoeken naar '-https'. Zonder de -e optie beschouwt grep -https als een optie voor grep zelf en niet een op te sporen patroon:
grep -e '-https' /etc/services

Of gebruiken met grep

Om in /etc/services zowel naar het woord server als naar het woord client te zoeken, gebruik je de opdracht:
grep -E 'server|client' /etc/services

En gebruiken met grep

Om in /etc/services naar regels te zoeken die zowel het woord server en het woord vnc bevatten, gebruik je de opdracht:
grep 'server' /etc/services | grep 'vnc'

Een reeks tekens zoeken

Gebruik de volgende schrijfwijzen om een reeks van dezelfde tekens te definiëren:
{N}
{N,}
{min,max}

In /etc/services zoeken naar twee t's:
egrep 't{2}' /etc/services

Zoek in /etc/services naar de woorden bos en boos:
egrep 'bo{1,2}s' /etc/services

Zoek in /etc/services naar minstens drie opeenvolgende cijfers 8:
egrep '8{3,}' /etc/services

Het volgende voorbeeld zoekt naar het woord RFC gevolgd door vier cijfers:
grep "RFC[[:digit:]]\{4\}" /etc/services

Zoekwoorden laten oplichten (highlight)

Zoek naar het woord server in /etc/services en geef de gevonden woorden benadrukt weer:
grep --color 'server' /etc/services

Reguliere expressie operatoren

Regex operator Betekenis
. Stelt één teken voor.
? Het voorafgaande onderdeel is facultatief en mag ten hoogste één keer voorkomen.
* Het voorafgaande onderdeel mag niet of verschillende keren voorkomen.
+ Het voorafgaande onderdeel moet minstens één keer voorkomen.
{N} Het voorafgaande onderdeel moet exact N keer voorkomen.
{N,} Het voorafgaande onderdeel moet minstens N keer voorkomen.
{N,M} Het voorafgaande onderdeel moet minstens N keer, maar niet meer dan M keer voorkomen.
- Wordt in een bereik van een lijst tussen het begin- en het eindonderdeel geplaatst.
^ Stelt het begin van een regel voor of tekens die niet in het bereik van een lijst voorkomen.
$ Stelt het einde van een regel voor.
\b Stelt een lege tekenreeks bij het uiteinde van een woord voor.
\B Stelt een lege tekenreeks voor die geen uiteinde van een woord is.
\< Stelt een lege tekenreeks voor aan het begin van een woord.
\> Stelt een lege tekenreeks aan het einde van een woord voor.

Grep versus egrep

De opdracht egrep is hetzelfde als grep -E. Het interpreteert het patroon als een uitgebreide reguliere expressie.

Vervolmaken

Raadpleeg de handleidingen (man-pagina's) van grep en regex om alle mogelijkheden van zowel grep als het gebruik van reguliere expressies onder de knie te krijgen.