Ga naar hoofdinhoud

Filtercommando's

Filtercommando's zijn kleine gespecialiseerde programma's die tekst lezen via stdin, transformeren en het resultaat naar stdout schrijven. Ze zijn ontworpen om via pipes gecombineerd te worden. Elk commando doet één ding goed — door ze te combineren los je complexe verwerkingstaken op met één regel.

grep — zoeken in tekst

grep (global regular expression print) filtert regels op basis van een patroon. Elke regel die het patroon bevat, wordt doorgelaten; de rest wordt weggegooid. Het is een van de meest gebruikte commando's in Linux — onmisbaar als je iets wilt terugvinden in logbestanden of configuratiebestanden.

grep "ERROR" logfile.txt # Alle regels met "ERROR"
grep -i "error" logfile.txt # Hoofdletterongevoelig (-i = ignore case)
grep -n "ERROR" logfile.txt # Met regelnummer (-n = line number)
grep -v "DEBUG" logfile.txt # Regels die NIET matchen (-v = invert)
grep -r "TODO" projecten/ # Recursief in alle bestanden van een map
grep -c "ERROR" logfile.txt # Toon alleen het aantal overeenkomsten

Combinatie met een pipe — zoek in de inhoud van een bestand zonder het te openen:

cat /etc/apt/sources.list | grep "ubuntu" # Toon repo-regels met 'ubuntu'
cat namen.txt | grep "^A" # Namen die beginnen met de letter A

sort — sorteren

sort sorteert de regels van zijn invoer. Standaard alfabetisch, maar met vlaggen ook numerisch, omgekeerd, of op een specifieke kolom.

sort namen.txt # Alfabetisch sorteren (A→Z)
sort -r namen.txt # Omgekeerde volgorde (Z→A)
sort -n cijfers.txt # Numerisch sorteren (niet alfabetisch)
sort -rn cijfers.txt # Numerisch én omgekeerd (groot→klein)
sort -u namen.txt # Sorteren én duplicaten verwijderen
sort -k 2 tabel.txt # Sorteren op de tweede kolom

Visueel voorbeeld:

namen.txt na sort namen.txt
────────── ──────────────────
Charlie → Alice
Alice Bob
Bob Charlie
Numerisch vs alfabetisch sorteren

Zonder -n sorteert sort alfabetisch. Dan komt "10" voor "9" (want '1' < '9'). Met -n sorteert het op numerieke waarde: 9 voor 10.

echo -e "10\n9\n100" | sort # 10, 100, 9 (alfabetisch)
echo -e "10\n9\n100" | sort -n # 9, 10, 100 (numerisch)

uniq — duplicaten verwijderen

uniq verwijdert opeenvolgende identieke regels. Omdat het enkel opeenvolgende duplicaten verwijdert, combineer je het altijd eerst met sort — anders mist het duplicaten die niet naast elkaar staan.

sort namen.txt | uniq # Unieke waarden
sort namen.txt | uniq -c # Toon hoe vaak elke waarde voorkomt
sort namen.txt | uniq -d # Toon alleen de duplicaten
sort namen.txt | uniq -u # Toon alleen de unieke waarden (niet-gedupliceerd)

Voorbeeld — tel hoe vaak elk land voorkomt in een lijst:

cat bezoekers.txt
# België
# Nederland
# België
# Frankrijk
# Nederland
# Nederland

sort bezoekers.txt | uniq -c | sort -rn
# 3 Nederland
# 2 België
# 1 Frankrijk

wc — tellen

wc (word count) telt regels, woorden en bytes. Je gebruikt het om snel een idee te krijgen van de omvang van een bestand, of om na te gaan hoeveel resultaten een filter oplevert.

wc -l bestand.txt # Aantal regels
wc -w bestand.txt # Aantal woorden
wc -c bestand.txt # Aantal bytes
wc bestand.txt # Alles tegelijk: regels, woorden, bytes

Combinaties met pipes:

ls | wc -l # Hoeveel bestanden staan hier?
grep "ERROR" logfile.txt | wc -l # Hoeveel ERROR-regels zijn er?

cut — kolommen uitknippen

cut snijdt een specifieke kolom of reeks tekens uit elke regel. Het is ideaal voor het verwerken van CSV-bestanden: je geeft het scheidingsteken op met -d en het kolomnummer met -f.

cut -d ',' -f 1 data.csv # Eerste kolom (gescheiden door komma)
cut -d ',' -f 1,3 data.csv # Eerste én derde kolom
cut -d ':' -f 1 /etc/passwd # Eerste kolom (gebruikersnamen)
cut -c 1-10 bestand.txt # Eerste 10 tekens van elke regel

Visueel voorbeeld — stel je hebt dit CSV-bestand:

naam,leeftijd,stad
Alice,25,Antwerpen
Bob,32,Gent
Charlie,28,Brussel
cut -d ',' -f 1 studenten.csv # Enkel de namen
# naam
# Alice
# Bob
# Charlie

cut -d ',' -f 1,3 studenten.csv # Naam én stad
# naam,stad
# Alice,Antwerpen
# Bob,Gent
# Charlie,Brussel

Alles samen: Zwift-routes analyseren

De kracht van filtercommando's zit in combinaties via pipes. In dit voorbeeld werken we met een dataset van Zwift-routes — de virtuele fietspaden van het bekende trainingsplatform.

Sla dit op als routes.csv:

naam,afstand_km,hoogtemeters
Watopia Figure 8,15.3,174
Watopia Hilly Route,31.6,426
Watopia Mountain Route,21.1,1085
London Loop,14.6,271
New York Central Park,10.3,174
Richmond UCI Worlds,15.3,153
Innsbruck,44.4,876
Alpe du Zwift,12.2,1036
Yorkshire UCI,30.2,484

Alle Watopia-routes:

grep "Watopia" routes.csv
# Watopia Figure 8,15.3,174
# Watopia Hilly Route,31.6,426
# Watopia Mountain Route,21.1,1085

Enkel de routenamen:

cut -d ',' -f 1 routes.csv | grep -v "naam"
# Watopia Figure 8
# Watopia Hilly Route
# ...

De 3 zwaarste routes (meeste hoogtemeters):

tail -n +2 routes.csv | sort -t ',' -k 3 -rn | head -3 | cut -d ',' -f 1,3
# Watopia Mountain Route,1085
# Alpe du Zwift,1036
# Innsbruck,876

Stap voor stap:

  1. tail -n +2 slaat de headerregel over
  2. sort -t ',' -k 3 -rn sorteert numerisch omgekeerd op kolom 3 (hoogtemeters)
  3. head -3 houdt de top 3 over
  4. cut -d ',' -f 1,3 toont naam en hoogtemeters