1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
|
<chapter id="commands-chapter"><title>Krachtige kleine programma's</title>
<sect1 id="commands-unixpower"><title>De kracht van &unix;</title>
<para>
De kracht van &unix; is verborgen in kleine opdrachten die niet nuttig lijken
wanneer ze op zichzelf worden gebruikt, maar wanneer gecombineerd met andere
opdrachten (direct of indirect) een systeem produceren dat veel krachtiger
en flexibeler is dan de meeste andere besturingssystemen.
De opdrachten waar ik het in dit hoofdstuk over ga hebben zijn onder andere
<command>sort</command>, <command>grep</command>, <command>more</command>, <command>cat</command>, <command>wc</command>, <command>spell</command>,
<command>diff</command>, <command>head</command>, en <command>tail</command>.
Helaas is het op het moment niet geheel intuïtief wat deze namen betekenen.
</para>
<para>
Laten we deze utility's afzonderlijk behandelen en dan zal ik een aantal
voorbeelden geven hoe ze gecombineerd te gebruiken.<footnote><para>De beknopte
samenvattingen van opdrachten in dit hoofstuk zijn niet zo uitgebreid.
Kijk alsjeblieft in de manpagina van de opdracht als je iedere optie wilt
kennen.</para></footnote>
</para>
</sect1>
<sect1 id="commands-editingfiles"><title>Bewerkingen op bestanden</title>
<para>
In aanvulling op de opdrachten zoals <command>cd</command>, <command>mv</command>, en <command>rm</command> die je
in <xref linkend="shell-chapter"/> leerde, zijn er nog andere opdrachten die
slechts bewerkingen op bestanden, maar niet op de inhoud van die bestanden
uitvoeren. Dit zijn onder andere <command>touch</command>, <command>chmod</command>, <command>du</command>, en
<command>df</command>. Bij al deze bestanden doet het er niet toe wat er
<emphasis>in</emphasis> het bestand staat. Ze wijzigen alleen wat van hetgeen
&unix; zich kan herinneren van het bestand.
</para>
<para>
Deze opdrachten manipuleren onder andere:
<itemizedlist>
<listitem><para>
De datumstempel
<indexterm><primary>datumstempel</primary></indexterm>. Aan elk bestand
zijn drie datums verbonden.<footnote><para>Oudere bestandssystemen in Linux bewaarden
slechts één datum, aangezien ze van Minix waren afgeleid. Heb je
één van deze bestandssystemen, dan zal een deel van de informatie
gewoon niet beschikbaar zijn, de werking is voor het overgrote deel
hetzelfde.</para></footnote>
De drie datums zijn de aanmaaktijd (wanneer het bestand werd aangemaakt), de
laatste modificatiedatum (wanneer het bestand voor het laatst werd gewijzigd),
en de laatste toegangstijd (wanneer het bestand voor het laatst werd ingelezen).
</para></listitem>
<listitem><para>
De eigenaar. Ieder bestand onder &unix; behoort toe aan een gebruiker.
</para></listitem>
<listitem><para>
De groep. Ieder bestand behoort ook toe aan een groep gebruikers.
De meest gebruikelijke groep voor gebruikersbestanden wordt
<literal>users</literal>
genoemd, welke gewoonlijk wordt gedeeld door alle gebruikersaccounts op
het systeem.
</para></listitem>
<listitem><para>
De permissies
<indexterm><primary>permissies</primary></indexterm>.
Aan ieder bestand zijn permissies
toegekend (soms ook wel "privileges" genoemd) waarmee aan &unix; wordt
aangegeven wie dat bestand mag benaderen, wijzigen of in het geval van
programma's, mag uitvoeren. Deze permissies van de eigenaar, de groep en
alle andere gebruikers kunnen ieder apart worden aan- of uitgezet.
</para></listitem>
</itemizedlist>
<cmdsynopsis>
<command>touch</command>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>touch</primary></indexterm>
Met <command>touch</command> zullen de datumstempels van de bestanden die
zijn opgegeven op de opdrachtregel worden gewijzigd in de huidige tijd.
Als een bestand niet voorkomt, zal <command>touch</command> het aanmaken.
Het is ook mogelijk de tijd op te geven waarop <command>touch</command> de
bestanden in zal stellen. Raadpleeg de manpagina van <command>touch</command>.
<cmdsynopsis>
<command>chmod</command>
<arg>-Rfv</arg>
<arg><replaceable>modus</replaceable></arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>chmod</primary></indexterm>
<indexterm><primary>bestand</primary><secondary>permissies</secondary></indexterm> De opdracht die wordt gebruik om de permissies
van een bestand te wijzigen wordt <command>chmod</command> genoemd,
als afkorting van <emphasis>ch</emphasis>ange
<emphasis>mod</emphasis>e (wijzig modus).
Laten we voor ik er op inga hoe de opdracht toe te passen is, bespreken
welke permissies er in &unix; zijn. Met ieder bestand is een groep permissies
geassocieerd. Deze permissies vertellen &unix; of het bestand kan worden
ingelezen, beschreven, of uitgevoerd als het om een programma gaat.
(In de volgende paar paragrafen, zal ik het over gebruikers hebben die
iets doen op het systeem. Alle programma's die een gebruiker uitvoert,
kunnen hetzelfde doen als een gebruiker.
Het kan een beveiligingsprobleem zijn als je niet weet
wat een bepaald programma doet.)
</para>
<para>
&unix; herkent drie verschillende typen mensen: als eerste, de eigenaar van
het bestand (en de persoon die <command>chmod</command> op dat bestand mag toepassen).
Ten tweede, de "groep". De groep van de meeste van je bestanden
zou heel goed "users" kunnen zijn, in de betekenis van gewone gebruikers van
het systeem. (Gebruik <command>ls -l bestand</command>.) om achter de groep
van een bepaald bestand te komen. Dan zijn er nog alle anderen, die geen
eigenaar en geen deelnemer van een groep zijn, toepasselijk "other"
(anderen) genoemd.
</para>
<para>
Dus een bestand kan lees- en schrijfpermissies hebben voor de eigenaar,
leespermisies voor de groep en geen permissies voor alle anderen.
Of om wat voor reden dan ook, een bestand kan schrijf-/leespermissies
hebben voor de groep en anderen, maar <emphasis>geen</emphasis>
permissies voor de eigenaar!
</para>
<para>
Laten we met behulp van <command>chmod</command> eens proberen een paar
permissies te wijzigen. Maak als eerste een nieuw bestand aan
met behulp van <command>cat</command>, <command>emacs</command>, of enig ander programma. Standaard
kun je dit bestand lezen en beschrijven. (De permissies gegeven aan andere
mensen zullen afhankelijk van hoe het systeem en je account zijn ingesteld
variëren.) Verzeker je ervan dat je het bestand met <command>cat</command>
kunt lezen. Laten we nu je leesprivilege afnemen door gebruik te maken
van de opdracht <command>chmod u-r bestandsnaam</command>.
(De parameter <parameter>u-r</parameter> komt neer op "gebruiker min lezen".)
Als je nu het bestand probeert te lezen, krijg je een
<errorname>Permission denied</errorname> foutmelding! Voeg de leesprivileges weer toe met
behulp van <command>chmod u+r bestandsnaam</command>.
<indexterm><primary>bestand</primary><secondary>privileges</secondary>
<see>bestand, permissies</see></indexterm>
<indexterm><primary>beveiliging</primary><see>bestand, permissies</see>
</indexterm>
</para>
<para>
Directorypermissies
<indexterm><primary>directory</primary><secondary>permissies</secondary></indexterm> gebruiken dezelfde drie
ideeën: lezen, schrijven, en uitvoeren, maar fungeren net iets anders. De
leesprivilege staat de gebruiker (of groep of anderen) toe de directory
te lezen. Het weergeven van de namen van bestanden. De schrijfpermissie
staat de gebruiker (of groep of anderen) toe bestanden toe te voegen of te
verwijderen. De uitvoerpermissie staat de gebruiker toe de bestanden in
de directory of enige subdirectory's te benaderen.
(Als een gebruiker geen uitvoerpermissies heeft voor een directory,
kan die gebruiker zelfs <command>cd</command> er niet op uitvoeren!).
</para>
<para>
Vervang met behulp van <command>chmod</command> de
<literal>modus</literal> met datgene waarop de
bewerking moet worden toegepast, of <emphasis>u</emphasis>ser (gebruiker),
<emphasis>g</emphasis>roup (groep), <emphasis>o</emphasis>ther (anderen),
of <emphasis>a</emphasis>ll (allen), en wat
daarmee te doen. (Dat wil zeggen, gebruik een plusteken om het toevoegen van
een privilege aan te geven of een minteken om aan te geven er één
weg te nemen. Of een is-gelijk-teken waarmee de exacte permissies zullen worden
aangegeven.) De mogelijke toe te voegen permissies zijn
<emphasis>r</emphasis>ead (lezen), <emphasis>w</emphasis>rite (schrijven),
en <emphasis>e</emphasis>xecute (uitvoeren).
</para>
<para>
De vlag <option>R</option> van <command>chmod</command> zal de permissies van een directory
en alle bestanden in die directory en alle subdirectory's, neerwaarts
de lijn (in alle subdirectory's) wijzigen.
(De `R' staat voor recursief.) De <option>f</option> vlag dwingt
<command>chmod</command> te trachten permissies te wijzigen, zelfs als
de gebruiker niet de eigenaar is van het bestand. (Als aan
<command>chmod</command> de <option>f</option> vlag
wordt opgegeven, zal het geen foutmelding weergeven wanneer het er niet
in slaagt de permissies van een bestand te wijzigen).
De vlag <option>v</option> maakt <command>chmod</command> verbose (breedsprakig), het zal
rapporteren wat het aan het doen is.
</para>
</sect1>
<sect1 id="commands-systemstatistics"><title>Systeemstatistieken</title>
<para>
Opdrachten in deze sectie zullen statistieken over het besturingssysteem
of een deel van het besturingssysteem laten zien.
<indexterm><primary>du</primary></indexterm>
<cmdsynopsis>
<command>du</command>
<arg>-abs</arg>
<arg><replaceable>pad1 pad2 ... padN</replaceable></arg>
</cmdsynopsis>
<command>du</command> staat voor <emphasis>d</emphasis>isk
<emphasis>u</emphasis>sage (diskverbruik).
Het zal de hoeveelheid diskruimte in een gegeven directory
<emphasis>en alle subdirectory's</emphasis> tellen die het op de disk in beslag neemt.
<command>du</command> op zichzelf zal een lijst retourneren waarin
staat vermeld hoeveel ruimte elke subdirectory van de huidige directory
in beslag neemt, en geheel onderaan, hoeveel ruimte de huidige directory
(plus alle voorheen getelde subdirectory's) gebruiken.
Als je één of twee parameters opgeeft, zal het de hoeveelheid
gebruikte ruimte die door die bestanden of directory's worden gebruikt
tellen in plaats van van de huidige directory.
</para>
<para>
De <option>a</option> vlag toont een telling van bestanden, als ook van
directory's. De optie <option>b</option> zal in plaats van kilobytes
(1024 tekens) het totaal in bytes afbeelden. Een byte is het equivalente van
een letter in een tekstdocument. En de vlag <option>s</option> toont slechts
de op de opdrachtregel opgegeven directory's en <emphasis>niet</emphasis> de
subdirectory's.
<cmdsynopsis>
<command>df</command>
</cmdsynopsis>
<indexterm><primary>df</primary></indexterm>
<command>df</command> is een afkorting van "disk filling" (diskvulling):
het geeft een samenvatting van de hoeveelheid in gebruik zijnde diskruimte.
Voor elk bestandssysteem (denk eraan, verschillende bestandssystemen
bevinden zich op verschillende stations of partities) toont het de
hoeveelheid diskruimte, de gebruikte hoeveelheid, de beschikbare hoeveelheid
en de totale capaciteit van het bestandssysteem dat wordt gebruikt.
</para>
<para>
Iets vreemds wat je zou kunnen tegenkomen is dat het mogelijk is
over de 100% van de capaciteit te gaan, of dat de gebruikte plus
beschikbare capaciteit niet gelijk is aan het totaal. Dit komt
doordat &unix; op elk bestandssysteem wat ruimte reserveert voor
<literal>root</literal>. Op die manier zal het systeem nog steeds wat
ruimte hebben om in te kunnen blijven werken als een gebruiker
per ongeluk de disk opvult.
</para>
<para>
Voor de meeste mensen heeft <command>df</command> geen bruikbare opties.
<cmdsynopsis>
<command>uptime</command>
</cmdsynopsis>
<indexterm><primary>uptime</primary></indexterm>
Het programma <command>uptime</command> doet exact wat men er van
zou verwachten. Het
drukt de hoeveelheid tijd dat het systeem "in de lucht" is af, d.w.z.
de hoeveelheid tijd vanaf de laatste &unix; boot.
</para>
<para>
<command>uptime</command> geeft ook de huidige tijd en het gemiddelde van de
systeembelasting.<indexterm><primary>gemiddelde belasting</primary></indexterm>
De gemiddelde belasting is het gemiddelde aantal
taken wachtend om uitgevoerd te worden in een bepaalde hoeveelheid tijd.
<command>uptime</command> laat de gemiddelde belasting van de laatste minuut,
vijf minuten en tien minuten zien. Een gemiddelde belasting vrijwel gelijk
aan nul geeft aan dat het systeem relatief inactief is. Een gemiddelde
belasting vrijwel gelijk aan één geeft aan dat het systeem bijna
volledig wordt benut, maar nergens teveel. Hoge gemiddelde
belastingen zijn het resultaat van de gelijktijdige uitvoering van
verscheidene programma's.
</para>
<para>
Verbazingwekend genoeg is <command>uptime</command> één
van de weinige &unix;-programma's <emphasis>zonder</emphasis> opties!
<cmdsynopsis>
<command>who</command>
</cmdsynopsis>
<indexterm><primary>who</primary></indexterm>
<command>who</command> toont de huidige gebruikers op het systeem en
wanneer zij zijn ingelogd. Als de parameters <literal>am i</literal>
(als in: <command>who am i</command>) worden opgegeven, toont het de
huidige gebruiker.
<cmdsynopsis>
<command>w</command>
<arg>-f</arg>
<arg><replaceable>gebruikersnaam</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>w</primary></indexterm>
Het programma <command>w</command> toont de huidige gebruikers van het
systeem en wat ze aan het doen zijn. (Het combineert in wezen de
functionaliteit van <command>uptime</command>
<indexterm><primary>uptime</primary></indexterm> en <command>who</command>. De kopregel van
<command>w</command> is exact hetzelfde als die van <command>uptime</command>, en op elke regel wordt
een gebruiker getoond, wanneer ze inlogde
(en hoelang ze niet actief zijn geweest).
<literal>JCPU</literal> is de totale hoeveelheid
door die gebruiker gebruikte CPU-tijd, terwijl
<literal>PCPU</literal> de totale hoeveelheid CPU-tijd is die wordt gebruikt door
de huidige taak.
</para>
<para>
Als aan <command>w</command> de optie <option>f</option> wordt gegeven,
toont het 't remote systeem van waaraf ze zijn ingelogd, als dit zo is.
De optionele parameter <option>w</option> beperkt de uitvoer tot het tonen van alleen de
gebruikersnaam.
</para>
</sect1>
<sect1 id="commands-in-file"><title>Wat staat er in het bestand?</title>
<para>
Voor het weergeven van bestanden worden er onder &unix; twee
belangrijke opdrachten gebruikt, <command>cat</command> en
<command>more</command>.
Beiden zijn besproken in <xref linkend="shell2-chapter"/>.
<cmdsynopsis>
<command>cat</command>
<arg>-nA</arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>cat</primary></indexterm>
<command>cat</command> is geen gebruiksvriendelijke opdracht. Het
wacht niet dat je
het bestand kunt lezen, en het wordt vooral in combinatie met pipes gebruikt.
<command>cat</command> heeft echter een aantal nuttige opdrachtregelopties.
<option>n</option> zal bijvoorbeeld alle regels in het bestand nummeren, en
<option>A</option> zal stuurtekens als normale tekens tonen in plaats van dat
het (mogelijk) vreemde dingen uithaalt met je scherm.
(Onthoud dat om de vreemdere en misschien "minder nuttige" opties
te bekijken, je de opdracht <command>man</command> kunt gebruiken:
<command>man cat</command>.) <command>cat</command> accepteert invoer van stdin als er op
de opdrachtregel geen bestanden worden opgegeven.
<cmdsynopsis>
<command>more</command>
<arg>-l</arg>
<arg>+<replaceable>regelnummer</replaceable></arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>more</primary></indexterm>
<command>more</command> is veel bruikbaarder, en het is de opdracht die
je wellicht wilt gebruiken als je ASCII tekstbestanden door wilt bladeren. De
enige van belang zijnde optie is <option>l</option>, wat <command>more</command> zal vertellen
dat je bent geïnteresseerd in het behandelen van het teken
<keycap>Ctrl-L</keycap> als een "new page" teken. <command>more</command>
zal beginnen op een opgegeven regelnummer.
Aangezien <command>more</command> een interactieve opdracht is, heb ik
de belangrijkste interactieve opdrachten hieronder samengevat:
<variablelist>
<varlistentry><term>[<keycap>Spatiebalk</keycap>]</term>
<listitem><para>
Ga naar het volgende scherm met tekst.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>d</keycap>]</term>
<listitem><para>
Scroll 11 regels verder, of ongeveer de helft van een
normaal 25-regelig scherm.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>/</keycap>]</term>
<listitem><para>
Zoek naar een reguliere expressie. Ondanks dat een reguliere
expressie heel gecompliceerd kan zijn, kun je ook gewoon een tekststring
intikken om naar te laten zoeken. Met bijvoorbeeld
<literal>/toad</literal> <keycap>return</keycap> zoek
je in het huidige bestand naar de volgende string "toad". Met een slash
gevolgd door een return wordt gezocht naar de volgende tekenreeks waar je
als laatste naar zocht.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>n</keycap>]</term>
<listitem><para>
Hiermee zal ook worden gezocht naar de volgende tekst
die overeenkomt met je reguliere expressie.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>:</keycap><keycap>n</keycap>]</term>
<listitem><para>
Als je meer dan één regel opgaf op de
opdrachtregel, zal hiermee naar het volgende bestand worden gegaan.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>:</keycap><keycap>p</keycap>]</term>
<listitem><para>
Hiermee zal naar het voorgaande bestand worden gegaan.
</para></listitem>
</varlistentry>
<varlistentry><term>[<keycap>q</keycap>]</term>
<listitem><para>
Beëindig <command>more</command>.
</para></listitem>
</varlistentry>
</variablelist>
<cmdsynopsis>
<command>head</command>
<arg>-<replaceable>regels</replaceable></arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>head</primary></indexterm>
<command>head</command> zal de eerste tien regels tonen van de opgegeven
bestanden, of
de eerste tien regels van stdin als er geen bestanden op de opdrachtregel
werden opgegeven. Elke numerieke optie zal worden opgevat als het aantal
weer te geven regels, dus <command>head -15 frog</command> zal de eerste
vijftien regels van het bestand <filename>frog</filename> weergeven.
<cmdsynopsis>
<command>tail</command>
<arg>-<replaceable>regels</replaceable></arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>tail</primary></indexterm>
Net als <command>head</command>, zal <command>tail</command> slechts een fractie van het bestand
laten zien. Natuurlijk zal <command>tail</command> het einde van het bestand laten zien,
of de laatste tien regels die binnenkomen via stdin. <command>tail</command> accepteert ook
het opgeven van het aantal regels.
<cmdsynopsis>
<command>file</command>
<arg><replaceable>bestand1 bestand2 ... bestand</replaceable></arg>
</cmdsynopsis>
De opdracht <command>file</command> probeert te achterhalen in welke opmaak een bepaald
bestand is weggeschreven. Aangezien niet alle bestanden extensies hebben of
andere eenvoudig te identificeren markeringen, voert de opdracht
<command>file</command> een aantal elementaire controles uit om te trachten erachter
zien te komen wat het exact bevat.
Wees echter voorzichtig omdat het heel goed mogelijk is dat
<command>file</command> een slechte indicatie geeft.
</para>
</sect1>
<sect1 id="commands-informative"><title>Informatieve opdrachten</title>
<para>
In deze sectie worden opdrachten besproken waarmee bestanden worden
aangepast, opdrachten die een bepaalde bewerking op het bestand uitvoeren,
of statistieken over het bestand leveren.
<cmdsynopsis>
<command>grep</command>
<arg>-nvwx</arg>
<arg>-<replaceable>nummer</replaceable></arg>
<arg choice="plain">expressie</arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>grep</primary></indexterm>
Eén van de handigste opdrachten in &unix; is <command>grep</command>, de
<emphasis>g</emphasis>eneralized <emphasis>r</emphasis>egular <emphasis>e</emphasis>xpression <emphasis>p</emphasis>arser. Dit is
een chique naam voor een utility dat alleen een tekstbestand kan
doorzoeken. De eenvoudigste manier om <command>grep</command> te gebruiken
gaat als volgt:</para>
<para>
<screen>
/home/larry# cat animals
Animals are very interesting creatures. One of my favorite animals is
the tiger, a fearsome beast with large teeth.
I also like the lion---it's really neat!
/home/larry# grep iger animals
the tiger, a fearsome beast with large teeth.
/home/larry#
</screen>
</para>
<para>
Alhoewel het alle regels toont waarin het woord voorkomt, is een nadeel hiervan
dat het je niet aangeeft waar in het bestand te zoeken, geen regelnummer.
Afhankelijk van wat je aan het doen bent, kan dit prima zijn.
Als je bijvoorbeeld op zoek bent naar fouten in de uitvoer van een programma,
zou je <command>a.out | grep error</command> kunnen proberen, waarbij
<application>a.out</application> de naam is van het programma.
Als je er in bent geïnteresseerd waar de overeenkomsten zich bevinden,
gebruik je de <option>n</option> switch van <command>grep</command> om het te vertellen
regelnummers af te drukken. Gebruik de
switch <option>v</option> als je alle regels wilt zien die <emphasis>niet</emphasis> overeenkomen
met de opgegeven expressie.
Een andere feature van <command>grep</command> is dat het alleen
zoekt naar delen van een woord, zoals mijn voorbeeld hierboven waar
<literal>iger</literal> overeenkwam met <literal>tiger</literal>. Om
<command>grep</command> te vertellen alleen overeenkomsten te zoeken op hele woorden,
gebruik je de <option>w</option>, en de <option>x</option> switch vertelt grep alleen
overeenkomsten te zoeken met gehele regels.
Als je geen bestanden opgeeft, zal <command>grep</command> stdin onderzoeken.
<cmdsynopsis>
<command>wc</command>
<arg>-clw</arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>wc</primary></indexterm>
<command>wc</command> staat voor <emphasis>w</emphasis>ord <emphasis>c</emphasis>ount. Het telt eenvoudigweg
het aantal woorden, regels en tekens in (het) bestand(en). Worden er geen
bestanden in de opdrachtregel opgegeven, dan voert het de bewerking uit op
stdin. De drie parameters, <option>clw</option>, staan respectievelijk voor
<emphasis>c</emphasis>haracter (teken), <emphasis>l</emphasis>ine (regel), en <emphasis>w</emphasis>ord (woord), en
vertellen <command>wc</command> welke van deze drie te tellen. Dus
<command>wc -cw</command> zal
het aantal tekens en woorden tellen, maar niet het aantal regels.
<command>wc</command> telt standaard alles: woorden, regels en tekens.
</para>
<para>
Een aardig gebruik van <command>wc</command> is uit te zoeken hoeveel bestanden er
in de huidige directory aanwezig zijn:
<command>ls | wc -w</command>. Probeer <command>ls *.c | wc -w</command>
als je wilt
zien hoeveel bestanden er eindigen op <literal>.c</literal>.
<cmdsynopsis>
<command>spell</command>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>spell</primary></indexterm>
<command>spell</command> is een zeer simpel &unix; spellingsprogramma, gewoonlijk voor
Amerikaans Engels.<footnote><para>Ondanks dat hier versies zijn voor
verscheidene andere Europese talen, is de kopie op je Linux machine
zeer waarschijnlijk voor Amerikaans-Engels.</para></footnote><command>spell</command> is een filter, zoals
de meeste andere programma's waar we het over hebben gehad, die een
ASCII-tekstbestand als invoer neemt en alle woorden als uitvoer geeft
die het als onjuist gespeld aanmerkt.
<command>spell</command> werkt op de bestanden die op de opdrachtregel worden opgegeven,
of als die er niet zijn, op stdin.
</para>
<para>
Een geraffineerder spellingsprogramma, <command>ispell</command>
<indexterm><primary>ispell</primary></indexterm> is
waarschijnlijk ook beschikbaar op je machine. <command>ispell</command> biedt je
een mogelijk correcte spelling aan en een fraaie menu-interface als op de
opdrachtregel een bestandsnaam werd opgegeven of zal als een op
filter-lijkend programma worden uitgevoerd als er geen bestanden werden
opgegeven.
</para>
<para>
Ondanks dat de werking van <command>ispell</command> tamelijk
vanzelfsprekend is, zou je de man page kunnen raadplegen als je
meer hulp nodig hebt.
<cmdsynopsis>
<command>cmp</command>
<arg choice="plain"><replaceable>bestand1</replaceable></arg>
<arg><replaceable>bestand2</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>cmp</primary></indexterm>
<command>cmp</command> <emphasis>c</emphasis>o<emphasis>m</emphasis>pares (vergelijkt) twee bestanden.
De eerste moet op de opdrachtregel worden opgegeven, terwijl de tweede
als de tweede parameter kan worden opgegeven of van standaardinvoer wordt
ingelezen. <command>cmp</command> is erg simpel, en vertelt je louter waar de twee
bestanden voor het eerst verschillen.
<cmdsynopsis>
<command>diff</command>
<arg choice="plain"><replaceable>bestand1 bestand2</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>diff</primary></indexterm>
Een van de meest gecompliceerde &unix; standaardopdrachten is
<command>diff</command>. De GNU
<indexterm><primary>GNU Project</primary></indexterm> versie van
<command>diff</command> kent meer dan twintig opdrachtregelopties!
Het is een veel krachtiger variant van <command>cmp</command> en het toont
je de verschillen in plaats van dat het je louter aangeeft waar het
eerste verschil zich voordoet.
</para>
<para>
Aangezien het hebben over zelfs een goed deel van <command>diff</command>
buiten het kader van dit boek valt, zal ik het gewoon hebben over de
basiswerking van <command>diff</command>. Samengevat accepteert <command>diff</command> twee parameters en
toont het de verschillen tussen deze parameters op een regel-voor-regel
basis. Bijvoorbeeld:
</para>
<para>
<screen>
/home/larry# cat frog
Animals are very interesting creatures. One of my favorite animals is
the tiger, a fearsome beast with large teeth.
I also like the lion---it's really neat!
/home/larry# cp frog toad
/home/larry# diff frog toad
/home/larry# cat dog
Animals are very nteresting creatures. One of my favorite animals is
the tiger, a fearsome beast with large teeth.
I also like the lion---it's really neat!
/home/larry# diff frog dog
1c1,2
< Animals are very interesting creatures. One of my favorite animals is
---
> Animals are very nteresting creatures. One of my favorite animals is
>
3c4
< I also like the lion---it's really neat!
---
> I also like the lion---it's really neat!
/home/larry#
</screen>
</para>
<para>
Zoals je kunt zien, geeft <command>diff</command> niets als uitvoer als de twee bestanden
identiek zijn. Daarna vergeleek ik twee verschillende bestanden,
het had een sectiekop, <literal>1c1,2</literal> aangevend dat het regel 1 van het
linkerbestand aan het vergelijken was <filename>frog</filename>, met regels 1--2 van <filename>dog</filename>
en welke verschillen het opmerkte.
Toen vergeleek het regel 3 van <filename>frog</filename> met regel 4 van
<filename>dog</filename>.
Ondanks dat het in eerste instantie vreemd over kan komen dat er twee
verschillende regelnummers worden vergeleken, is het veel efficiënter
dan iedere enkele regel weer te geven als er zich eerder in een bestand
een extra return bevindt.
<cmdsynopsis>
<command>gzip</command>
<arg>-v#</arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
<sbr/>
<command>gunzip</command>
<arg>-v</arg>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
<sbr/>
<command>zcat</command>
<arg><replaceable>bestand1 bestand2 ... bestandN</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>gzip</primary></indexterm>
<indexterm><primary>gunzip</primary></indexterm>
<indexterm><primary>zcat</primary></indexterm>
Deze drie programma's worden gebruikt om gegevens te
comprimeren
<indexterm><primary>comprimeren</primary></indexterm> en decomprimeren
<indexterm><primary>decomprimeren</primary></indexterm>.
<command>gzip</command>, van GNU Zip, is het programma dat de originele bestanden
inleest en bestanden als uitvoer geeft die kleiner zijn.
<command>gzip</command> verwijdert de bestanden die op de opdrachtregel werden opgegeven
en vervangt ze door bestanden met identieke naam behalve dat er
"<literal>.gz</literal>" aan is toegevoegd.
<cmdsynopsis>
<command>tr</command>
<arg choice="plain"><replaceable>string1</replaceable></arg>
<arg choice="plain"><replaceable>string2</replaceable></arg>
</cmdsynopsis>
<indexterm><primary>tt</primary></indexterm>
De opdracht "translate characters" werkt op standaardinvoer. Het
accepteert als parameter geen bestandsnaam.
In plaats daarvan zijn de twee parameters willekeurige strings.
Het vervangt alle voorkomens van <literal>string1</literal> in de invoer door
<literal>string2</literal>. In aanvulling op
relatief simpele opdrachten zoals
<command>tr frog toad</command>, kan <command>tr</command> gecompliceerdere
opdrachten accepteren. Hier is bijvoorbeeld een snelle manier om
kleine tekens om te zetten in hoofdletters:
</para>
<para>
<screen>
<prompt>/home/larry# </prompt><userinput>tr [:lower:] [:upper:]</userinput>
dit is een VREEMDE zin.
DIT IS EEN VREEMDE ZIN.
</screen>
</para>
<para>
<command>tr</command> is tamelijk complex en het wordt gewoonlijk in kleine
shell-programma's gebruikt.
</para>
</sect1>
</chapter>
<!--
% Local Variables:
% mode: latex
% TeX-master: \"guide\"
% End: -->
|