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
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:
tail -n +2slaat de headerregel oversort -t ',' -k 3 -rnsorteert numerisch omgekeerd op kolom 3 (hoogtemeters)head -3houdt de top 3 overcut -d ',' -f 1,3toont naam en hoogtemeters