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:
Laatst herzien op 18-12-2006
|