Valid HTML 4.01! Valid CSS
Anybrowser

Navigatie:


Home - Linux beginners - tekstgereedschappen

logo

.



Home
Printbaar

Nieuws

Nieuwe distributie
Onlangs zijn we overgestapt op een nieuwe Linux-distributie, nl. Pardus Linux

Dit lijkt ons een prima distributie, zowel voor beginners als experts.



14. Tekstgereedschappen

In dit artikel behandelen we in sneltreinvaart een flink aantal Linux opdrachten, waarmee je tekst (en vaak ook andere) bestanden kunt bewerken in de ruimste zin des woords.

Voor de oefeningen in dit hoofdstuk is het handig als je met vi een bestand met de naam test aanmaakt met wat korte regels tekst. De inhoud van dat bestand zou bv. kunnen zijn:

   Heel gewoon
   Twintig piepers
   Een boek
   Kijk daar
   Sint Nicolaas
   Tube tandpasta
   Lekker dropje
   Vieze vent
   Kan koffie

cat en tac

Als je weet, dat een bepaald bestand alleen maar tekst bevat, kun je de inhoud van dat bestand natuurlijk bekijken met vi. Zeker als het om een klein tekstbestandje gaat, is dat zoiets als schieten met een kanon op een vlieg. Er bestaat een veel elegantere manier, nl. met de opdracht cat.

Als je bv. de inhoud van test wilt bekijken, kun je de opdracht cat test geven, en, voila: daar staat de boel op je beeldscherm.

De opdracht tac doet hetzelfde als cat, maar dan achterstevoren (vandaar dat de opdracht achterstevoren geschreven staat: Linux programmeurs hebben vaak een uitmuntend gevoel voor humor...). Als je dus de opdracht tac test geeft, komt de laatste regel van dat bestand bovenaan te staan (en de eerste regel dus onderaan, maar dat had je al verwacht).

nl

Een wat minder vaak gebruikte opdracht, maar soms toch erg handig, is nl, die ongeveer hetzelfde doet als cat, maar dan alle regels voorziet van regelnummers. Probeer maar uit: nl test.

wc

Een andere makkelijke Linux opdracht is wc, wat staat voor "word count". Het geeft, naast het aantal woorden in een bestand, ook het aantal letters en het aantal regels:

   [jan@gnodde linux]$ wc test
        10      18     113 test
   [jan@gnodde linux]$

10 regels, 18 woorden en 113 letters. Nu zul je denken: het zijn toch maar 9 regels? Die tiende regel is ontstaan, doordat wij in ons test-bestand na het laatste woord nog een enter gegeven hebben, en dus een tiende (lege) regel hebben gemaakt. Als de werking van wc je maar duidelijk is!

sort

De opdracht sort wordt gebruikt om de inhoud van een bestand te (je raadt het al) sorteren. Als deze opdracht gebruikt wordt zonder meer, sorteert hij op het eerste teken van iedere regel:

   [jan@gnodde linux]$ sort test
   Een boek
   Heel gewoon
   Kan koffie
   Kijk daar
   Lekker dropje
   Sint Nicolaas
   {enz., enz.}

Je ziet: alles netjes op alfabetische volgorde.
Het is ook mogelijk te sorteren op het tweede woord in de regel. Denk er wel aan, dat het eerste woord woordnr. 0 is. Dus moet je sort +1 test gebruiken om op het tweede woord te sorteren. Probeer maar uit.

Deze opdracht verandert trouwens niets aan je bestand: hij sorteert en zet de uitkomst op het beeldscherm. Het originele bestand blijft dus origineel. Hoe je de uitkomst in een bestand kunt zetten, vertellen we in een volgend artikel.

cut

Hiermee snijd je een gedeelte uit een bestand. Met de optie -f kun je het veld opgeven, dat je wilt behouden. Hier begint het tellen trouwens wel bij één. Om uit ons bestand van elke regel alleen het tweede woord op het scherm te zetten zou je de opdracht cut -f2 test kunnen gebruiken, maar dat werkt niet. Dat komt, omdat cut ervan uitgaat, dat de woorden in een regel van elkaar gescheiden zijn door een "Tab", en wij gebruiken gewoon een spatie. Dus zul je dat duidelijk moeten maken aan cut:

   [jan@gnodde linux] $ cut -d' ' -f2 test
   gewoon
   piepers
   boek
   daar
   {enz., enz.}

Met de optie -d kun je aangeven, wat het scheidingsteken moet zijn (d staat voor "delimiter"). Er bestaan nog meer opties, maar daarvoor verwijzen we je maar weer eens naar de man-pages.
Ook hier is er aan het originele bestand niets veranderd!

split

Deze opdracht kun je gebruiken om een bestand te splitsen in een aantal kleinere bestanden, met ieder een bepaalde maximum grootte. Je kunt bv. het maximum aantal tekens of aantal woorden per resultaatbestand opgeven. Als je test op wilt delen in meerdere bestanden met maximaal 2 regels per bestand, geef je de opdracht: split -l2 test. Wees niet bang: het originele bestand blijft behouden. Je kunt met ls zien, dat er een aantal bestanden bijgekomen is, met vreemde namen als xaa, xab, xac, enz. Ieder van die bestandjes bevat (maximaal) 2 regels van het originele bestand. Je kunt het controleren met cat xaa en je zult zien, dat het de eerste twee regels van test bevat.

De mogelijkheden zijn veel uitgebreider dan hier omschreven. Kijk dus maar even in de man- of infopages.

fmt

De opdracht fmt staat voor "format": je kunt ermee tekst een bepaald format mee geven. Een fmt test zal het je duidelijk maken:

   Heel gewoon Twintig piepers Een boek Kijk daar Sint Nicolaas Tube
   tandpasta Lekker dropje Vieze vent Kan koffie

De tekst is dus opnieuw opgemaakt. Met de optie -w kun je de maximale regelbreedte opgeven:

   [jan@gnodde linux]$ fmt -w 20 test
   Heel gewoon Twintig
   piepers Een boek
   Kijk daar Sint
   Nicolaas Tube
   tandpasta Lekker
   dropje Vieze vent
   Kan koffie
   [jan@gnodde linux]$

Nu is het bestand opgemaakt met een regellengte van maximaal 20 tekens.
Ook nu verwijzen we je voor nog meer opties naar de man- en/of infopages.

paste

Hiermee kun je twee bestanden samenvoegen, en wel zodanig, dat de eerste regel van het tweede bestand wordt toegevoegd aan de eerste regel van het eerste bestand, idem voor de beide tweede regels, enz.. Dat klinkt ingewikkeld, maar we zullen het verduidelijken met een voorbeeld:

Bestand1 bevat de volgende tekst:

   1 2
   5 6
   9 10

En bestand2 het volgende:

   3 4
   7 8
   11 12

De opdracht paste bestand1 bestand2 levert dan op:

   1 2 3 4
   5 6 7 8
   9 10 11 12

Duidelijk? Kijk voor meer opties en mogelijkheden van fmt (en dat zijn er niet al te veel) bij de man/infopages.

join

Nog ingewikkelder, maar met een voorbeeld duidelijk te maken, is de opdracht join. Hij verbindt twee bestanden op basis van het eerste veld. De regels waarvan het eerste veld gelijk is, worden samen afgebeeld. En dan nu het voorbeeld: bestand1 heeft de volgende inhoud:

   heel apart geval
   vreemde hoge bomen
   stijve lederen riemen
   kleine glazen flessen

En bestand2:

   hele harde noten
   vreemde woorden
   gek geworden computer
   stijve benen

En dan de uitkomst van join bestand1 bestand2:

   vreemde hoge bomen woorden
   stijve lederen riemen benen

Het lijkt een vreemde opdracht, waarvan het nut niet echt duidelijk is, maar je weet maar nooit... Lees voor alle zekerheid toch de manpages maar!

tr

Deze afkorting staat voor "transform", vrij vertaald: "vervangen". Je kunt ermee bepaalde tekens in een bestand vervangen door andere. Of je kunt bepaalde tekens verwijderen, met de optie -d.

Misschien wil je alle letters "a" vervangen door "x"?:

   [jan@gnodde linux]@ tr 'a' 'x' < test
   Heel gewoon
   Twintig piepers
   Een boek
   Kijk dxxr
   Sint Nicolxxs
   Tube txndpxstx
   Lekker dropje
   Vieze vent
   Kxn koffie
   [jan@gnodde linux]$

D.m.v. de notatie < test geef je aan, dat het bestand test als invoer dient voor de opdracht tr. Dit heet "redirection" en wordt in een volgend artikel uitgebreider behandeld.

Voor het verwijderen van de letter "a" zou je de opdracht:

   tr -d 'a' < test

geven. Ook bij deze opdracht verander je het oorspronkelijke bestand niet.

more en less

Om met deze opdrachten wat te oefenen, moeten we eerst ons test-bestand wat groter gaan maken. Dat doen we als volgt (met weer een beetje redirection):

   [jan@gnodde linux]$ cat test >> test2
   cat test2 >> test
   cat test >> test2
   cat test2 >> test
   cat test >> test2
   cat test2 >> test

Hiermee moet het bestand test flink groter geworden zijn. Dat kun je controleren door een cat test te geven. Je zult zien, dat het bestand te groot geworden is voor je beeldscherm: het rolt er voor een groot deel af.

En daar hebben ze de opdracht more voor uitgevonden. Hiermee kun je de inhoud van een bestand per scherm bekijken. Geef maar eens de opdracht

   more test

Door op de spatiebalk te drukken krijg je het volgende scherm te zien en met de b-toets kun je een scherm terug. De enter-toets kun je gebruiken om slechts 1 regel op te schijven.

Met de opdracht less kun je meer dan met more (weer zo'n humoristische programmeur...). Met

   less test

verschijnt weer een scherm tekst, maar dit keer kun je door de tekst heen en weer bladeren met de pijltjestoetsen. Ook de PgUp en PgDn toetsen zijn te gebruiken. Met de q verlaat je less en door op de h-toets te drukken krijg je een help-scherm. Ook kun je in de tekst zoeken, met de slash (/) en het vraagteken (?). Voor meer informatie en veel meer opties: zie man/info-pages

tail en head

Deze opdrachten doen hetzelfde, maar dan andersom: met tail kun je het laatste, met head het eerste stuk van een bestand bekijken. Normaal gesproken geven deze opdrachten de laatste c.q. eerste 10 regels weer, maar met de -n optie kun je zelf een ander aantal regels aangeven: tail -n 5 test

Een andere handige optie bij alleen tail is -f: hiermee wordt het laatste deel van een bestand getoond, maar het programma tail blijft doorlopen. Zodra er iets aan het bekeken bestand wordt toegevoegd, zie je dat direct. Handig voor het in de gaten houden van bepaalde log-bestanden. Je kunt het dan trouwens stoppen met Ctrl-C.

Er zijn dus wel wat verschillen in opties en mogelijkheden tussen tail en head, maar die vind je snel terug in de man-pages.

grep

Dit is een zeer krachtige opdracht. Je kunt er een bestand mee doorzoeken op het voorkomen van bepaalde tekst. De regel, waarin die tekst voorkomt, wordt dan weergegeven. De zoektekst kan hierbij zeer ingewikkelde vormen aannemen. Daarop zullen we hier niet ingaan. Later zullen we dat beschrijven in een artikel over zgn. reguliere expressies.

Maar ook in de meest simpele vorm is grep al zeer bruikbaar:

   [jan@gnodde linux]$ grep daa test
   Kijk daar
   Kijk daar
   Kijk daar
   {enz., enz.}

De tekst daa komt in dit geval in meerdere regels voor. Dan is het wel eens lastig zoeken. Je kunt de regels echter ook laten nummeren met de optie -n:

   [jan@gnodde linux]$ grep -n daa test
   4:Kijk daar
   14:Kijk daar
   24:Kijk daar
   {enz., enz.}

Als je alleen geïnteresseerd bent in het aantal keren, dat een bepaalde tekst in een bestand voorkomt, kun je de optie -c (van "count") gebruiken:

   [jan@gnodde linux]$ grep -c daa test
   13
   [jan@gnodde linux]$

En als het je niet uitmaakt of de tekst in hoofd- of in kleine letters geschreven is, gebruik je de optie -i.
Er zijn nog meer opties, maar je weet waar je die kunt vinden...

sed

Deze afkorting staat voor "streaming editor": sed bewerkt tekst terwijl deze voorbij stroomt. Je kunt sed wel zien als een zeer uitgebreide vorm van tr. En uitgebreid zijn de mogelijkheden van sed zeker, zelfs tè uitgebreid voor dit artikel. We gaan hier dus maar sumier in op enkele mogelijkheden.

sed moet altijd gebruikt worden met één of meer opdrachten. Deze opdrachten kunnen in een (script-)bestand staan, maar kunnen met de optie -e ook direct gegeven worden. Laten we sed maar eens gebruiken om wat letters in een bestand te veranderen:

   sed -e 's/a/x' test
   Heel gewoon
   Twintig piepers
   Een boek
   Kijk dxar
   Sint Nicolxas
   Tube txndpasta
   Lekker dropje
   Vieze vent
   Kxn koffie
   {enz., enz.}

De tekst tussen de enkele aanhalingstekens (s/a/x/ vorm de feitelijke opdracht voor sed. De s staat voor "substitute", oftewel "vervang", dus de tekst betekent hier: vervang "a" door "x" (vergeet de laatste slash (/) niet...).

Een klein verschil met ons tr-voorbeeld: alleen de eerste "a" van elk woord wordt veranderd in een "x". Zou je elke letter "a" willen vervangen, dan zou je dat kunnen doen met de y i.p.v. de s, waar trouwens nog veel meer mee mogelijk is.

De mogelijkheden van sed zijn te uitgebreid voor dit artikel en zijn een apart artikel waard. Wellicht kun je dat in de toekomst op deze site vinden. Voorlopig moet je het doen met de man-pages...

Slot

We hebben weer veel Linux-opdrachten behandeld in dit artikel. Het is zeker stof, die het waard is om mee te oefenen en je verder in te verdiepen.

Tot slot nog even alle behandelde commando's op een rijtje:

cat tac nl wc sort
cut split fmt paste join
tr more less tail head
grep sed


Laatst herzien op 18-12-2006