Naar inhoud springen

Ubuntu: Linux voor mensen/Input en output/De output redirection operatoren

Uit Wikibooks

Ubuntu: Linux voor mensen

  1. Eenvoudige redirections
    1. Wat zijn standaard input, output en error?
    2. De output redirection operatoren
    3. Pipes en output redirection combineren
  2. Geavanceerd gebruik van redirection
    1. Het gebruik van descriptoren
    2. Het tee commando
  3. Filters
    1. Output herstructureren
    2. Meer grep toepassingen
    3. Het sort commando
  1. Samenvatting

De > operator

[bewerken]

Gebruik

[bewerken]

Als je de output van een commando wilt opslaan in een bestand, gebruik je de “>” operator na het commando, gevolgd door de naam van het bestand waarin je de output kwijt wilt:

commando opties argumenten > bestandsnaam

Output naar een bestand sturen

willy@ubuntu:~$ date
za jun 29 08:49:41 CEST 2006
willy@ubuntu:~$ date > datum
willy@ubuntu:~$ cat datum
za jun 29 08:49:41 CEST 2006
willy@ubuntu:~$ ls -l > mijn_home_vandaag
willy@ubuntu:~$ cat datum mijn_home_vandaag > mijn_home_20060629

Opdracht

Bekijk het bestand

  1. Wat zit er in het bestand mijn_home_20060629?

We zagen al eerder het gebruik van de zogenaamde backticks. Probeer, in plaats van zelf de datum op te geven, eens het volgende:

De datum in bestandsnamen

willy@ubuntu:~$ cat datum mijn_home_vandaag > mijn_home_`date +%y%m%d`

Overschrijven voorkomen

[bewerken]

Wees voorzichtig als je op deze manier de output van een commando in een bestand stopt. Als de opgegeven bestandsnaam al bestaat, zal de inhoud zonder waarschuwing overschreven worden.

Wil je niet het risico lopen om bestanden te overschrijven, geef dan eerst het volgende commando in:

set -o noclobber

Dit instrueert je shell om een melding te geven wanneer je dreigt een bestaand bestand te overschrijven.

Uitproberen!

  1. Maak een testbestand aan met touch.
  2. Geef de shell de noclobber optie mee.
  3. Probeer de output van het date commando in het testbestand te steken.
  4. Wat gebeurt er?
  5. Open een nieuw terminal venster en probeer daarin het testbestand te overschrijven met de output van het date commando. Wat gebeurt er?

We zullen in het derde lespakket zien hoe we deze optie permanent kunnen maken.

Beknotten van bestanden

[bewerken]

Als we “niets” naar een bestaand bestand sturen, is dat hetzelfde als het bestand leegmaken. Let in het volgende voorbeeld op de grootte van het bestand:

Bestanden leegmaken

willy@ubuntu:~$ ls -l mijn_home_060626
-rw-r--r-- 1 willy willy 877 2006-06-29 08:54 mijn_home_060626
willy@ubuntu:~$ > mijn_home_060626
willy@ubuntu:~$ ls -l mijn_home_060626
-rw-r--r-- 1 willy willy   0 2006-06-29 08:54 mijn_home_060626

Dit beknotten of leegmaken van bestanden noemt men truncating.

De | operator

[bewerken]

Gebruik

[bewerken]

De “|” operator wordt gebruikt om de output van een commando te gebruiken als input voor een tweede commando.

Het verticale streepje noemt men in het Engels een pipe. Vandaar dat dit proces ook wel eens pipen genoemt wordt. De Nederlandse term is pijplijn.

Voorbeeld van een pipe met ps en grep

[bewerken]

In het vorige hoofdstuk zagen we dat proceslijsten vaak heel lang kunnen zijn. Soms zijn ze zo lang, dat je terminalbuffer overstroomt. In dat geval kan je het schuivertje rechts van het venster niet gebruiken om helemaal naar het begin van de output terug te rollen. Bovendien is het sowieso niet handig om telkens te moeten gaan zoeken in zoveel output. Met een pipe en het grep commando kunnen we veel handiger en sneller werken. Bijvoorbeeld om enkel het browserproces te tonen:

Combineer ps en grep

Zorg ervoor dat je eerst de browser gestart hebt, via het icoon in de bovenste taakbalk of via de commandoregel.

willy@ubuntu:~$ ps -ef | grep fire
willy	7871	1 15 09:06 ? 	    00:00:04 /usr/lib/mozilla-firefox/firefox-bin -a firefox
willy 	7902 7296  0 09:07 pts/0    00:00:00 grep fire

Op systemen die weinig belast zijn, krijg je wel eens het grep commando zelf te zien, naast de lijnen die je eigenlijk gevraagd had. Voorbeeld van een pipe met ls en grep

Een lange lijst van alle bestanden in de /etc map werkt niet handig. Stel dat we alle bestanden willen zien die met cron te maken hebben:

Lange lijsten voorkomen

willy@ubuntu:~$ ls -l /etc | grep cron
-rw-r--r--  1 root  root    364 2005-05-03 04:10 anacrontab
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.d
drwxr-xr-x  2 root  root   4096 2006-06-06 14:23 cron.daily
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.hourly
drwxr-xr-x  2 root  root   4096 2006-06-06 14:26 cron.monthly
-rw-r--r--  1 root  root    651 2005-05-03 01:09 crontab
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.weekly

Noteer dat ls de lijnen alfabetisch sorteert. Het enige dat grep doet, is de lijnen met de gevraagde string eruithalen en op het scherm zetten. Bijgevolg is ook deze output alfabetisch gesorteerd.

Voorbeeld van een pipe met ls en less

[bewerken]

Wil je toch alles zien in een lange lijst die niet op het scherm kan, gebruik dan het volgende commando:

Voorbeeld code om na te doen

ls -l map | less

Gebruik de normale toetsen om binnen het less commando te navigeren.

Voorbeeld met twee pipes

[bewerken]

Nemen we weer het voorbeeld van de paragraaf “Voorbeeld van een pipe met ls en grep”. Als we nu uit deze output enkel de lijnen willen die de string “crontab” niet bevatten, dan maken we de pijplijn wat langer, door de output van het grep commando te gebruiken voor een tweede grep:

Twee pipes

willy@ubuntu:~$ ls -l /etc | grep cron | grep -v crontab
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.d
drwxr-xr-x  2 root  root   4096 2006-06-06 14:23 cron.daily
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.hourly
drwxr-xr-x  2 root  root   4096 2006-06-06 14:26 cron.monthly
drwxr-xr-x  2 root  root   4096 2006-06-06 14:20 cron.weekly

De >> operator

[bewerken]

De >> operator wordt gebruikt om output van een commando aan een bestaand bestand te hangen, zonder de inhoud te overschrijven. Neem er nog even de oefening van de paragraaf “Gebruik” bij. Daarin maakten we twee bestanden aan, datum en mijn_home_vandaag, die we later samenvoegden tot één enkel bestand. Dit kan ook in één stap:

Doe mee Dit is een goede oefening om het gebruik van de shell in de vingers te krijgen.

willy@ubuntu:~$ date > mijn_home_`date+%y%m%d` ; ls -l >> mijn_home_`date+%y%m%d`

Met echo zijn er ook vele mogelijkheden:

willy@ubuntu:~$ echo "meer geld" > verlanglijstje
willy@ubuntu:~$ echo "minder werk" >> verlanglijstje
willy@ubuntu:~$ date >> verlanglijstje
willy@ubuntu:~$ cat verlanglijstje
meer geld
minder werk
za jun 29 09:36:12 CEST 2006

De < operator

[bewerken]

Iets moeilijker om te begrijpen is de input redirection. De operator is “<” en wordt gebruikt om bijvoorbeeld een bestand als input te gebruiken voor een commando dat in normale omstandigheden geen bestanden als input zou aanvaarden. Input redirection leest moeilijker dan output redirection, het komt doorgaans niet natuurlijk over en wordt daarom enkel gebruikt door gevorderden.

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.