B.3. En række tekstværktøjer

Linux har en række mindre værktøjer til at håndtere af tekstfiler. Vi vil i dette afsnit se lidt nærmere på dem.

diff udskriver forskellen mellem to filer. Lad os se på filerne fil1 og fil2.

[daisy@linux daisy]$  cat fil1 
  Per
  Poul
  Bent
[daisy@linux daisy]$  cat fil2 
  Per
  Bjarne
[daisy@linux daisy]$  diff fil1 fil2 
  2,3c2
  < Poul   (oversat: ud går Poul)
  < Bent   (oversat: ud går Bent)
  > Bjarne (oversat: ind kom Bjarne)

uniq fjerner ens linjer, der kommer efter hinanden, hvilket illustreres nedenfor.

[daisy@linux daisy]$   cat per3 
  Per
  Per
  Per
[daisy@linux daisy]$  uniq per3
  Per

cmp sammenligner filer og stopper læsningen af filerne, når cmp finder en forskel.

wc står for Word Count, og som navnet antyder, tæller den ord i en fil. wc har nogle options: "-l", "-w" og "-c" for Lines, Words og Characters.

Vil du vide, hvor mange linjer en fil indeholder, skriver du wc -l fil. wc er særlig god sammen med andre kommandoer og | (pipe), f.eks. vil nedenstående kommando tælle op, hvor mange filer, der er i kataloget /usr/bin

[daisy@linux daisy]$  ls /usr/bin | wc -l
  1208

Eller hvis du vil vide, hvor mange kataloger der er i /etc

[daisy@linus daisy]$  ls -l /etc | grep ^d | wc -l
  23

Forklaringen er som følger: ls -l giver den lange liste med egenskaberne for filerne med en fil pr. linje. Det allerførste tegn på linjen angiver filtypen. d betyder, at det er et "directory" - et katalog. grep ^d lader kun de linjer, der starter med d, passere. wc -l tæller antallet af linjer, den modtager.

B.3.1. Hoved og hale

tail - uden options - udskriver de 10 sidste linjer af en fil, "-5" vil udskrive de 5 sidste linjer, og "+8" vil udskrive fra og med linje 8 i en fil. Lad os se på et eksempel.

[daisy@linus daisy]$  cat sang
    Jeg bærer med smil min byrde,
    jeg drager med sang mit læs;
    jeg er som den vilde hyrde,
    der genner sit kvæg på græs.
[daisy@linus daisy]$  tail -2 sang
    jeg er som den vilde hyrde,
    der genner sit kvæg på græs.

tail har en meget nyttig "f"-option. Den får tail til løbende at vise de sidste 10 linjer af en fil, f.eks. vil du med tail -f /var/log/messages kunne følge, hvad alle system-dæmoner og lignende rapporterer.

head svarer til tail, men i stedet for slutningen af en fil, er det begyndelsen. head - uden optioner - udskriver de 10 første linjer af en fil. Optioner kan gives som for tail.

B.3.2. cut og paste

cut tager det, du specificerer i options, ud af en linje, dvs. -cx-y: tager fra tegn nr. x til tegn nr. y på hver linje i den specificerede fil. Er der kun et tal, tages kun dette tegn ud. -fx-y er som for c, men her drejer det sig om felter, og -d'X' angiver felt-separatoren.

Vil du se, hvilke brugere der har adgang til systemet, så prøv: cat /etc/passwd | cut -d':' -f1

paste samler filer lodret, hvor cat samler (kan samle) filer vandret. Lad os se på følgende eksempel. Du ønsker nu at samle to filer, navne og iq, således at linje 1 fra navne efterfølges af linje 1 fra iq (uden at dette dog skulle være konkluderende, for såvidt angår de tilfældige sammenstillinger af for- og efternavne samt tal).

[daisy@linus daisy]$  cat navne
      poul nyrup 52
      holger beck-nielsen 90
      william gates 55
      torvald linus ??
[daisy@linus daisy]$  cat iq
      50
      230
      120
      ??
[daisy@linus daisy]$  paste navne iq
      poul nyrup 52 50
      holger beck-nielsen 90 230
      william gates 55 120
      torvald linus ?? ??

B.3.3. Søg og du skal erstatte

tr erstatter det første argument med det andet. tr er en lidt speciel sag. Den forventer, at få input fra stdin. Derfor må du bruge følgende fremgangsmåde, hvis du vil erstatte noget i fil1, og skrive indholdet til fil2. Hvis du ønsker, at alle små tegn skal erstattes med store, skulle følgende kunne lade sig gøre.

[daisy@linus daisy]$  tr '[a-z,æ,ø,å]' '[A-Z,Æ,Ø,Å]' < fil1 > fil2

Det er ikke sikkert, at din distribution eller dit system vil godtage de danske tegn, men vi har afprøvet det på Red Hat 6.0, hvor det virker.