Terug naar hoofdinhoud

Linux commando: cat

07 juli 2026

Bijna iedereen die Linux gebruikt, grijpt binnen het eerste uur naar cat. Je typt het om een configuratiebestand te lezen, om een log te bekijken, of om een kort script op het scherm te dumpen. Het voelt als "het commando dat een bestand toont". Dat klopt, maar het is niet het hele verhaal, en het is niet eens wat de naam betekent. De echte taak van cat is om bestanden samen te voegen, en zodra je dat inziet, valt er veel van Unix op zijn plaats.

1. De basis

De taak van cat is om een of meer bestanden samen te voegen (concatenate) en het resultaat naar de standaarduitvoer te sturen, meestal je terminal. Geef je het een enkel bestand, dan toont het dat bestand. Geef je het meerdere bestanden, dan drukt het ze na elkaar af, aan elkaar geplakt. Een enkel bestand tonen is gewoon het eenvoudigste geval van bestanden samenvoegen: een lijst van een.

Twee ideeen maken cat bijzonder. Ten eerste schrijft het naar standaarduitvoer, niet naar een vaste plek. Dat betekent dat het resultaat naar je scherm kan gaan, naar een ander commando via een pipe, of naar een nieuw bestand via een omleiding. cat maakt het niet uit waar de uitvoer terechtkomt; de shell bepaalt dat. Ten tweede is cat een klein, eerlijk gereedschap dat precies een ding doet. Het pagineert niet, het breekt geen regels af, en het stopt niet onderaan het scherm. Die eenvoud is een kracht, en de grenzen ervan kennen hoort bij het goed gebruiken ervan.

Het commando waar iedereen aan denkt als "een bestand tonen". Achter die drie letters schuilt het echte doel, samenvoegen, en een heldere les in hoe Unix-commando's invoer lezen en uitvoer schrijven.

Dit artikel begint met de eenvoudigst mogelijke toepassing en bouwt op naar omleiding, here-documents, lezen van standaardinvoer, en het beroemde "useless use of cat". Aan het einde weet je niet alleen hoe je een bestand toont, maar ook wanneer cat het verkeerde gereedschap is en welk commando het dan overneemt.

Het juiste denkmodel: cat is een pipe met een naam. Het leest zijn invoer op volgorde, voegt die samen tot een stroom, en giet die stroom in de standaarduitvoer. Al het andere is alleen maar waar die stroom heen wijst.

Naar boven

2. Waar komt de naam vandaan?

De naam cat is een afkorting van concatenate, wat "aan elkaar rijgen" betekent. Het heeft niets met het dier te maken.

cat  =  conCATenate

De naam vertelt je precies het oorspronkelijke doel. In het vroege Unix draaide je cat part1 part2 part3 als je drie bestanden tot een wilde samenvoegen, en je ving de gecombineerde uitvoer op. Een enkel bestand op het scherm tonen was een gelukkig bijverschijnsel: een bestand samenvoegen en het resultaat op de terminal laten vallen.

Zoals de meeste vroege Unix-commando's is de naam bewust kort gehouden. Het vroege Unix werd getypt op trage teletype-terminals die elk teken op papier afdrukten, dus korte namen bespaarden zowel tijd als papier. Daarom is het cat en niet "concatenate".

Naar boven

3. Een korte geschiedenis

Het commando cat is een van de oudste Unix-gereedschappen die nog dagelijks worden gebruikt. Het werd geleverd met Unix 1st Edition bij Bell Labs in 1971 en is sindsdien aanwezig op elk Unix-achtig systeem: Linux, macOS, de BSD's, Solaris en AIX. Het verving een paar oudere, meer gespecialiseerde commando's voor het kopieren en afdrukken van bestanden, en vouwde hun taken samen in een klein programma.

PeriodeMijlpaal
1971 cat wordt geleverd met Unix 1st Edition bij Bell Labs
Jaren 70-80 Wordt een bouwsteen van de Unix-stijl van "pipes en filters"
Jaren 80 BSD voegt opties toe zoals -v om niet-afdrukbare tekens zichtbaar te maken
Vandaag De GNU coreutils-versie van cat draait op de meeste Linux-distributies

Er zijn twee versies die je in de praktijk tegenkomt. De meeste Linux-systemen draaien de GNU coreutils-versie van cat. macOS en de BSD's leveren de BSD-versie. Ze zijn het eens over het kerngedrag en over de korte opties zoals -n, -b en -s. Het belangrijkste verschil is dat GNU lange opties toevoegt (bijvoorbeeld --number) en de gecombineerde optie -A, die BSD niet heeft. Dit artikel gebruikt de GNU-versie, die je op vrijwel elke Linux-server aantreft.

Een commando van ruim vijftig jaar oud, dat nog steeds elke dag wordt getypt en in essentie onveranderd is, bewijst dat een gereedschap dat een ding goed doet nooit uit de mode raakt.

Naar boven

4. Eenvoudige toepassingen

4.1 De eenvoudigst mogelijke toepassing

Geef cat een bestandsnaam en het toont dat bestand op het scherm. In de voorbeelden hieronder is de regel die begint met $ wat je typt, en de regels eronder zijn wat het systeem terug afdrukt.

$ cat notes.txt
Buy milk
Call the dentist
Finish the report

Het hele bestand wordt in een keer naar de terminal gestuurd. Dat is ideaal voor korte bestanden: een configuratiebestand, een klein script, een notitie. Voor lange bestanden is het het verkeerde gereedschap, en sectie 7 legt uit waarom.

4.2 Meerdere bestanden samenvoegen: de oorspronkelijke taak

Geef cat meer dan een bestand en het drukt ze op volgorde af, het ene na het andere, zonder scheiding ertussen. Dit is de samenvoeging die de naam belooft:

$ cat chapter1.txt chapter2.txt chapter3.txt
(de volledige tekst van hoofdstuk 1)
(de volledige tekst van hoofdstuk 2)
(de volledige tekst van hoofdstuk 3)

Op zichzelf overspoelt dit alleen het scherm. Het wordt nuttig zodra je de gecombineerde stroom ergens heen stuurt, en dat brengt ons bij omleiding.

4.3 Het resultaat opslaan in een nieuw bestand

De shell-operator > leidt de standaarduitvoer om naar een bestand in plaats van naar het scherm. Combineer die met cat om bestanden echt tot een nieuw bestand samen te voegen:

$ cat chapter1.txt chapter2.txt chapter3.txt > book.txt

Nu bevat book.txt de drie hoofdstukken, op volgorde, als een bestand. Deze ene regel is de reden dat cat bestaat. Merk op dat het samenvoegen door cat gebeurt, maar het opslaan door de > van de shell, niet door cat zelf.

Een nuttig onderscheid: cat produceert een stroom, de shell bepaalt waar de stroom heen gaat. > schrijft die naar een nieuw bestand, >> voegt die toe aan een bestaand bestand, en een pipe | geeft die door aan het volgende commando.

4.4 Lezen vanaf het toetsenbord

Draai cat helemaal zonder bestandsnaam en het leest van standaardinvoer, wat standaard je toetsenbord is. Het echoot elke regel die je typt terug totdat je op Ctrl-D drukt, de toets die "einde van invoer" betekent:

$ cat
hello
hello
this is a test
this is a test
[Ctrl-D]

Combineer dat met een omleiding en je hebt de klassieke, snelle manier om een kort bestand te maken zonder een editor te openen:

$ cat > shopping.txt
milk
eggs
bread
[Ctrl-D]
$ cat shopping.txt
milk
eggs
bread

Je typt de regels, drukt op Ctrl-D, en de tekst belandt in shopping.txt. Het is geen editor, dus je kunt niet terug om een regel hierboven te verbeteren, maar voor drie regels is het sneller dan wat dan ook.

Naar boven

5. Gemiddelde toepassingen

5.1 Regels nummeren: -n en -b

De optie -n (kort voor number) zet een regelnummer voor elke regel. Dat is handig als iemand verwijst naar "de fout op regel 42":

$ cat -n config.ini
     1	[database]
     2	host = localhost
     3	port = 5432

De verwante optie -b (kort voor number nonblank) nummert alleen de regels die tekst bevatten en slaat lege regels over. Dat is prettiger voor het lezen van proza of code met lege regels tussen de blokken:

$ cat -b poem.txt
     1	Roses are red

     2	Violets are blue

5.2 Lege regels samenknijpen: -s

De optie -s (kort voor squeeze-blank) knijpt reeksen van meerdere lege regels samen tot een enkele lege regel. Dat is nuttig voor bestanden met grote verticale gaten:

$ cat -s spaced-out.txt      # veel lege regels worden er een

5.3 Het onzichtbare zien: -E, -T en -A

Sommige van de lastigste bugs komen door tekens die je niet kunt zien: een spatie aan het einde, een tab waar je spaties verwachtte, of Windows-regeleindes. cat kan die zichtbaar maken.

OptieKort voorWat het toont
-E show-ends Een $ aan het einde van elke regel
-T show-tabs Tabs als ^I in plaats van witruimte
-v show-nonprinting Andere stuurtekens in ^- en M--notatie
-A show-all Alles hierboven tegelijk (gelijk aan -vET)

Kijk wat -A onthult in een bestand dat op het scherm volkomen normaal lijkt:

$ cat -A messy.txt
name:^Ipeter $
city:^Iutrecht$

Nu zie je dat het gat na de dubbele punt een tab (^I) is en dat de eerste regel een verborgen spatie aan het einde heeft, vlak voor de $. Dit is de snelste manier om de vraag "waarom komt deze regel niet overeen?" te beantwoorden wanneer een script zich vreemd gedraagt.

Naar boven

6. Gevorderde toepassingen

6.1 Toevoegen en bestanden opbouwen

Met >> voeg je toe aan het einde van een bestand in plaats van het te overschrijven. Zo bouw je een bestand stukje bij beetje op:

$ cat header.txt > page.html      # begin opnieuw (overschrijft)
$ cat body.txt >> page.html       # voeg toe aan het einde
$ cat footer.txt >> page.html     # voeg opnieuw toe aan het einde

Wees voorzichtig met de enkele >: die maakt het doelbestand eerst leeg voordat er wordt geschreven. Een veelgemaakte en pijnlijke fout is cat a.txt > a.txt, die het bestand leegt voordat cat het ooit leest. Om een bestand met andere samen te voegen op zijn eigen plek, schrijf je eerst naar een nieuwe naam.

6.2 Het streepje: bestanden en standaardinvoer mengen

Een enkel streepje - staat voor standaardinvoer in de lijst met bestanden, zodat je doorgesluisde gegevens tussen echte bestanden kunt invoegen. Dit voorbeeld plaatst een kop, dan wat een ander commando stuurt, dan een voettekst:

$ echo "=== start ===" | cat header.txt - footer.txt

Hier drukt cat header.txt af, dan de tekst die op standaardinvoer binnenkomt (de regel van echo), dan footer.txt. Het streepje is een kleine functie die cat in een flexibele stroom-samenvoeger verandert.

6.3 Here-documents: een betere manier om een blok te schrijven

De truc met toetsenbord en Ctrl-D uit sectie 4 heeft een nettere neef die een here-document heet. Je geeft de shell een markeerwoord, en alles tot aan dat woord wordt de invoer. Dit is de professionele manier om een blok tekst in een bestand te schrijven, zeker in scripts:

$ cat > config.yml <<EOF
server: web01
port: 8080
debug: false
EOF

Alles tussen <<EOF en de afsluitende EOF wordt aan cat gevoerd, dat het naar config.yml schrijft. De markering mag elk woord zijn; EOF is gewoon de gebruikelijke afspraak. Als je de markering aanhaalt als <<'EOF', laat de shell $variabelen ongemoeid in plaats van ze uit te breiden, wat van belang is wanneer het blok dollartekens bevat.

6.4 cat als bouwsteen in pipes

Omdat cat gewoon tekst afdrukt, sluit het naadloos aan op de rest van de Unix-gereedschapskist via een pipe:

$ cat access.log | wc -l           # tel de regels
$ cat *.txt | sort | uniq          # samenvoegen, sorteren, dubbele weghalen
$ cat notes.md | grep TODO         # zoek overeenkomende regels

Het middelste voorbeeld is waar cat echt uitblinkt: veel bestanden (*.txt) samenvoegen tot een enkele stroom voordat die aan sort wordt doorgegeven. Dat is echte samenvoeging die echt werk verzet. Het eerste en laatste voorbeeld zijn echter een valkuil die sectie 7 uitlegt.

6.5 tac: cat achterstevoren

GNU levert een metgezel die tac heet, wat cat achterstevoren gespeld is en precies dat doet: het drukt een bestand af met de regels in omgekeerde volgorde, de laatste regel eerst.

$ tac notes.txt
Finish the report
Call the dentist
Buy milk

Het is echt nuttig voor logs, waar de nieuwste regels onderaan staan. tac error.log | head toont je de meest recente regels eerst.

Naar boven

7. Iets wat de meeste gebruikers niet weten

7.1 De "useless use of cat"

Dit is de gewoonte die een beginner verraadt, en de oplossing die iemand kenmerkt die Unix begrijpt. Veel mensen schrijven:

$ cat file.txt | grep error       # werkt, maar verspillend

Dit start cat alleen maar om grep via een pipe te voeden. Maar grep kan, net als bijna elk Unix-filter, een bestand rechtstreeks lezen. De cat en de pipe voegen niets toe:

$ grep error file.txt             # doet hetzelfde, een proces

Dit anti-patroon komt zo vaak voor dat Randal Schwartz in de jaren 90 op Usenet een schertsende "Useless Use of Cat Award" begon uit te delen. De vuistregel: als een commando direct na cat | zelf een bestandsnaam kan aannemen, laat dan de cat weg en geef het bestand aan dat commando. Bewaar cat voor wanneer je echt meerdere bestanden samenvoegt, of wanneer je werkelijk niets anders hebt om de invoer te lezen.

Gebruik cat om bestanden samen te voegen, niet om een enkel bestand aan een ander commando te voeren. Een bestand plus een pipe is bijna altijd een commando te veel.

7.2 cat is geen pager

Wanneer je cat op een groot bestand draait, dumpt het het hele ding zo snel mogelijk naar de terminal. Het scherm scrolt voorbij in een waas en je blijft achter, starend naar de laatste pagina, niet in staat om verder terug te scrollen dan de buffer van de terminal. cat heeft geen idee hoe hoog je scherm is; dat is niet zijn taak.

Voor alles wat langer is dan een scherm, gebruik je een pager, die een pagina tegelijk toont en je laat scrollen en zoeken:

$ less big.log        # scroll met pijltjes, zoek met /, stop met q
$ head big.log        # alleen de eerste 10 regels
$ tail big.log        # alleen de laatste 10 regels
$ tail -f big.log     # volg een log terwijl die groeit

7.3 cat op een binair bestand kan je terminal breken

Een klassieke verrassing: draai cat op een niet-tekstbestand, zoals een programma of een afbeelding, en je prompt kan daarna in wartaal veranderen. Het bestand bevat stuurbytes, en sommige daarvan zijn escape-reeksen die de terminal herconfigureren, bijvoorbeeld door hem over te schakelen naar een grafische tekenset.

$ cat /bin/ls         # niet doen; de terminal kan raar worden

Als het gebeurt, typ dan reset en druk op Enter, zelfs als je niet kunt lezen wat je typt. Dat herstelt de terminal naar een gezonde toestand. Gebruik om een binair bestand veilig te bekijken een gereedschap dat daarvoor gemaakt is, zoals xxd, hexdump of strings. Merk op dat cat -v de stuurtekens ook zichtbaar maakt in plaats van ernaar te handelen.

7.4 Onder de motorkap: bytes en de drie stromen

Onder de motorkap is cat bijna het eenvoudigste programma dat kan bestaan. Voor elk bestand draait het een kleine lus van systeemaanroepen: open() het bestand, read() een blok bytes, write() die bytes naar standaarduitvoer, en herhaal tot het einde van het bestand, dan close(). Het kijkt nooit naar wat de bytes betekenen. Platte tekst, een afbeelding of een gecompileerd programma zijn allemaal hetzelfde voor cat: een stroom bytes om onaangeroerd door te kopieren.

Omdat het niets interpreteert, reproduceert cat een bestand exact. cat photo.jpg > copy.jpg maakt een byte-voor-byte identiek bestand. Het werkt, maar voor echt kopieren kun je beter cp gebruiken, dat ook rechten en tijdstempels behoudt en snellere kernel-kopieerpaden kan gebruiken.

Dit is ook de duidelijkste plek om de drie standaardstromen te ontmoeten waarmee elk Unix-proces wordt geboren. Elk ervan heeft een nummer, een bestandsdescriptor genaamd:

StroomNummerStandaard
standaardinvoer (stdin) 0 Het toetsenbord
standaarduitvoer (stdout) 1 De terminal
standaardfout (stderr) 2 De terminal, bewust apart gehouden

Alles in sectie 4 is gewoon het ergens heen wijzen van deze stromen. cat leest van stdin (0) wanneer je geen bestandsnaam geeft, schrijft zijn resultaat altijd naar stdout (1), en stuurt fouten zoals "No such file" naar stderr (2), zodat een verkeerde bestandsnaam niet stilletjes het bestand vervuilt dat je aan het opbouwen bent. Die descriptornummers zijn ook waarom je later 2>&1 tegenkomt, wat betekent "stuur stroom 2 naar waar stroom 1 heen gaat".

7.5 Weten waar cat stopt

Deel van expertise is weten wanneer een gereedschap het verkeerde is. cat leest en voegt samen; op het moment dat je wilt bekijken, zoeken of selecteren, doet een ander commando het beter:

BehoefteGebruikWaarom
Een lang bestand lezen less Pagineert, scrolt en zoekt in plaats van het scherm te overspoelen
Alleen het begin of einde head / tail Toont de eerste of laatste regels zonder de rest
Overeenkomende regels vinden grep Leest het bestand rechtstreeks, geen cat nodig
Een stroom opslaan en zien tegelijk tee Schrijft in een keer naar een bestand en naar het scherm
Een binair bestand bekijken xxd / strings Toont bytes veilig in plaats van de terminal te beschadigen

Leer cat toch eerst. Het is geinstalleerd op elke machine waarop je ooit inlogt, ook in een kale container of een reddingsshell, en het is de helderste illustratie van hoe Unix-commando's invoer lezen en uitvoer schrijven.

Naar boven

8. Best practices

  • Gebruik cat waar het naar vernoemd is. Grijp ernaar wanneer je meerdere bestanden samenvoegt. Voor een enkel bestand dat een ander commando voedt, geef je dat commando rechtstreeks de bestandsnaam.
  • Draai cat niet op een groot bestand. Gebruik less om het te lezen, of head en tail voor de uiteinden. Zo spaar je je terminalbuffer en je geduld.
  • Leid nooit een bestand naar zichzelf om. cat a > a leegt het bestand. Schrijf naar een nieuwe naam en hernoem die daarna zo nodig.
  • Maak verborgen tekens zichtbaar als een match mislukt. Als een script zich niet gedraagt, draai dan cat -A om tabs, spaties aan het einde en verdwaalde regeleindes bloot te leggen.
  • Grijp zonder aarzelen naar de handleiding. De gewoonte die beginners van professionals onderscheidt, is niet het uit het hoofd kennen van elke optie; het is het typen van man cat op het moment dat er een vraag opkomt.
$ man cat                            # de volledige handleiding
$ cat --help                         # een snel overzicht van de opties (GNU)
$ info coreutils 'cat invocation'    # de uitgebreide GNU-handleiding
Naar boven

9. Veelgemaakte fouten

9.1 Drie veelvoorkomende mythes

MytheWerkelijkheid
"cat betekent een bestand tonen." Het betekent samenvoegen (concatenate). Een bestand tonen is gewoon een lijst van een samenvoegen.
"cat file | grep x is normaal." Het is een useless use of cat. Schrijf in plaats daarvan grep x file.
"cat is de manier om elk bestand te lezen." Voor alles wat langer is dan een scherm is less het juiste gereedschap.

9.2 Andere valkuilen om te vermijden

  • Overschrijven met een enkele >. cat x > out vervangt out volledig. Gebruik >> wanneer je bedoelt toe te voegen.
  • Inlezen naar hetzelfde bestand. cat a b > a vernietigt a voordat het wordt gelezen. Leid altijd om naar een nieuwe bestandsnaam.
  • Een binair bestand cat-en. Het kan je terminal in de war brengen. Draai reset om te herstellen, en gebruik xxd of strings om binaire bestanden te bekijken.
  • Een scheiding tussen bestanden verwachten. cat a b plakt de bestanden zonder iets ertussen. Als a niet op een regeleinde eindigt, loopt de laatste regel ervan rechtstreeks door in b.
  • cat gebruiken om te tellen of te zoeken. Gereedschappen zoals wc en grep nemen zelf een bestandsnaam aan. De extra cat voegt alleen een proces toe.
Naar boven

10. Samenvatting

Het commando cat lijkt triviaal, maar het is een heldere les in hoe Unix invoer leest en uitvoer schrijft.

  • cat betekent "concatenate" (samenvoegen). Zijn echte taak is bestanden samenvoegen en het resultaat naar standaarduitvoer sturen; een bestand tonen is het eenvoudige geval.
  • Het stamt uit Unix in 1971 en draait, onveranderd in essentie, vandaag op elk Unix-achtig systeem.
  • cat a b c > out voegt bestanden samen tot een nieuw bestand. > overschrijft, >> voegt toe, en een pipe | geeft de stroom door aan het volgende commando.
  • Zonder bestandsnaam leest cat het toetsenbord tot Ctrl-D. Een here-document (<<EOF) is de nettere manier om een blok tekst te schrijven.
  • Nuttige opties: -n en -b nummeren regels, -s knijpt lege regels samen, en -A onthult tabs, regeleindes en verborgen tekens.
  • Het streepje - betekent standaardinvoer, zodat je doorgesluisde gegevens tussen echte bestanden kunt invoegen. tac drukt een bestand achterstevoren af.
  • Vermijd de "useless use of cat": als het volgende commando zelf een bestand kan lezen, sla dan cat en de pipe over.
  • Onder de motorkap is cat een kleine lus van read() en write() over de drie standaardstromen: stdin (0), stdout (1) en stderr (2). Het kopieert bytes zonder ze te interpreteren.
  • Weet waar cat stopt: less om lange bestanden te lezen, head en tail voor de uiteinden, grep om te zoeken, tee om tegelijk op te slaan en te tonen, en xxd of strings voor binaire bestanden.
  • Bij twijfel, typ man cat.

Dit is de snelle referentie die het bewaren waard is:

cat file             toon een bestand
cat a b c            voeg bestanden samen, op volgorde, naar het scherm
cat a b c > out      voeg bestanden samen tot een nieuw bestand
cat f1 >> f2         voeg f1 toe aan het einde van f2
cat > file           typ tekst, eindig met Ctrl-D
cat -n file          druk af met regelnummers
cat -A file          toon tabs, regeleindes en stuurtekens
cat -s file          knijp herhaalde lege regels samen
grep x file          NIET cat file | grep x
less file            lees een lang bestand op de juiste manier
tee file             sla een stroom op in een bestand EN op het scherm
tac file             druk een bestand achterstevoren af
Naar boven
Linux commando: cat
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.