Filters

Output herstructureren

Een filter is een programma dat input verwerkt op een bepaalde logische manier, en dat het resultaat van die operaties naar de standaard output stuurt. Het meest algemene gebruik van filters is om output te herstructureren. Hierna bestuderen we enkele van de belangrijkste filters.

Meer grep toepassingen

Nog even herhalen

Zoals we reeds zagen in de paragraaf “Tekst zoeken in een bestand”, scant het grep programma de output lijn per lijn, op zoek naar bepaalde patronen. Alle lijnen die het patroon bevatten, worden op de standaard output gezet. Dit gedrag kan omgekeerd worden met de -v, wanneer die toegepast wordt, worden enkel lijnen die het opgegeven patroon niet bevatten, op de standaard output gezet.

Daarnaast zagen we ook al hoe we hoofdletterongevoelig kunnen zoeken. Met de -c kunnen we tellen hoeveel keer het opgegeven patroon voorkomt in de output.

Meer interessante opties

Bijzonder handig, bijvoorbeeld als de output veel lijnen telt of als de lijnen lang zijn (langer dan 1 terminal lijn), is de --colour optie van grep. Het gezochte patroon wordt dan in het rood getoond. Bijvoorbeeld:

Handeling met de muis.

willy@ubuntu:~$ grep --colour willy /etc/*

Het spreekt vanzelf dat deze optie niet combineerbaar is met de -v optie.

Ook goed om weten is dat in de GNU grep die op onze Linux draait, de opties -A en -B geldig zijn: “after context” en “before context”. Hiermee kan je een op te geven aantal lijnen voor en/of na het voorkomen van een bepaald patroon in een text laten afdrukken. Je ziet met andere woorden de context waarin het zoekpatroon voorkomt. Dit kan handig zijn als je bijvoorbeeld enkele lijnen uit een tekst moet filteren, je weet niet juist welke maar je weet dat in de buurt van elke lijn die je wilt, een bepaald patroon voorkomt. Een voorbeeld zal dit verduidelijken:

We hebben een primitief adressenboek gemaakt in een bestand adresboek. De inhoud bestaat uit blokken van drie lijnen in de volgende stijl:

Willy Willems
Zoostraat 14
2000 Antwerpen

Ann Willems
Reebokstraat 23
3000 Leuven

Gerty De Bakker
Mussenstraat
3500 Hasselt

Als we uit deze lijst het adres van Ann willen halen, gebruiken we grep als volgt:

willy@ubuntu:~$ grep -A 2 Ann adresboek
Ann Willems
Reebokstraat 23
3000 Leuven

Het grep stuurt dus niet enkel de lijn met de zoekstring naar de standaard output, maar ook de twee lijnen die volgen op de lijn waarin de zoekstring voorkomt. De -B optie doet net het omgekeerde en geeft het opgegeven aantal lijnen die voorafgingen aan de lijn waarin de zoekstring voorkomt.

Al deze grep opties kunnen natuurlijk perfect volgen op een grep die input leest van een pipe.

Het sort commando

Eenvoudig gebruik

Het sort commando sorteert output alfabetisch. Bijvoorbeeld om alle accounts op het systeem alfabetisch te sorteren, zou je dit commando kunnen gebruiken:

[Belangrijk]Gebruikersnamen sorteren
willy@ubuntu:~$ cat /etc/passwd | sort

Of korter:

willy@ubuntu:~$ sort /etc/passwd

Numeriek sorteren

Getallen sorteren van klein naar groot doe je met de optie -n.

[Belangrijk]Getallen sorteren

Maak met behulp van het echo commando en de >> operator een bestand aan waarin je een aantal willekeurige getallen zet, één per lijn. Gebruik sort om de getallen te ordenen.

Uniek sorteren

Dubbels, lijnen die twee of meer keer voorkomen in een tekst, haal je uit de output door de -u optie bij sort te gebruiken.

[Belangrijk]Dezelfde lijnen weglaten

Voeg aan de lijst met getallen een paar getallen toe die al voorkwamen. Controlleer het resultaat van sort -u.

Werken met kolommen

Het vervelende van sort is dat het enkel naar het begin van de lijn kijkt. Om het commando te instrueren dat het naar de Nde kolom moet kijken en die moet gebruiken als maatstaf voor het sorteren, gebruik je de -k. In het voorbeeld hieronder worden de opties -k en -n gecombineerd om bestanden in je home map te sorteren op grootte. Het kleinste bestand komt eerst, het grootste laatst:

Handeling met de muis.

willy@ubuntu:~$ ls -l | sort -nk 5