4.8. Flere Unix-kommandoer

I dette appendiks vil vi gennemgå en række Unix/Linux-kommandoer. Gennemgangen er overfladisk, men du kan finde flere oplysninger i programmernes brugsanvisninger. Desuden er http://www.sslug.dk/artikler/begyndertips.html et godt sted at få mere information.

4.8.1. Mere om omdirigering

Linux (som Unix) arbejder med følgende input/output terminologi:



Vi har før været inde på, at stdout kan omdirigeres med >. cat fil1 fil2 > fil3 vil samle indholdet af filerne fil1 og fil2 i filen fil3.

Da måden, du omdirigerer på, er afhængig af valg af kommandofortolker, er det en god idé at undersøge dette nu. Prøv med:


[tyge@hven ~]$  env | grep ^SHELL | cut -d/ -f3

Svaret skulle gerne være bash, zsh, csh eller tcsh. Det kan være, at du anvender en anden skal – der findes mange. Hvis det er tilfældet, kan du se i brugsanvisningen for den aktuelle kommandofortolker (man SKALLENS_NAVN).

Hvis du selv starter en ny skal (enten fra kommandolinjen eller i et program), er det ikke sikkert, at ovenstående metode virker. Prøv derfor at skrive ps. En liste over de kørende processer vil da blive udskrevet til skærmen. Den nederste proces, der ender på "sh", angiver din skal – normalt.

Fælles for Bourne-Again Shell (bash) og C-Shell er følgende: Lad os antage, at filen fil3 indeholder information, vi ønsker at bevare. Vi vil tilføje (append) indholdet af fil1 og fil2 til fil3. Det gøres ved:


[tyge@hven ~]$  cat fil1 fil2 >> fil3

Indholdet af en fil kan også anvendes som argument(er) til en kommando. F.eks. vil følgende kommando sende indholdet af filen megenRos til SSLUG's webmastere:


[tyge@hven ~]$  sendmail www_admin@sslug.dk < megenRos

Linux skelner (som Unix) mellem normale uddata (stdout) og fejluddata (stderr). Til tider kan det være rart kun at omdirigere det ene sæt meddelelser.

Specielt for bash gælder følgende: Omdirigering af stdout (1) og stderr (2) i bash er forholdsvis simpel.

Hvis kun fejlmeddelelserne fra en kommando – her ls - ønskes:


[tyge@hven ~]$   ls  1> /dev/null

Hvis kun stdout ønskes vist og fejlmeddelelserne skal sendes til en fil:


[tyge@hven ~]$  ls 2> fejlfil 

Og endelig, hvis du ønsker at akkumulere fejlmeddelelser i en fil, kan >> anvendes – f.eks.


[tyge@hven ~]$  ls 2>> fejlfil

De to skaller csh og tcsh adskiller sig fra bash på følgende måder. Når du omdirigerer med > eller >>, er det kun stdout, der omdirigeres. Hvis stderr skal med, skal du anvende & efter omdirigeringen. stderr kan ikke omdirigeres alene, men med lidt krumspring lykkedes det alligevel:


[tyge@hven ~]$ ls -l /* | tee >& fil1 | diff fil1 - >fejlFil

Ovenstående kommando sender både stderr og stdout til filen fil1.

4.8.2. Hvem er logget ind?

Hvis du ønsker at vide, hvilke brugere der er logget på samme computer som dig, bruger du kommandoen who. Du vil så få en liste med brugere, der har logget ind, og fra hvilken (virtuel) terminal de er koblet til. Denne kommando har ikke den store værdi, med mindre du arbejder i et flerbruger-system. Arbejder du i et større netværk, kan det være, at rwho virker. rwho viser dig, hvem der er logget ind på hvilke computere i netværket. Dette kræver dog at både klient og server kører rwho-dæmonen.


[tyge@hven ~]$ who
tyge     tty1     Dec 21 17:25
tyge     pts/0    Dec 21 17:26
tyge     pts/1    Dec 21 17:26
tyge     pts/2    Dec 21 17:26
katja    pts/5    Dec 21 17:31 (k5.sslug)

Dette viser at brugeren tyge er logget ind via konsollen tty1, og har sidenhen (kl. 17:26) åbnet tre terminalvinduer – under X. Brugeren katja er også logget ind på maskinen kl. 17:31 fra maskinen "k5.sslug" og har kun et terminal-vindue (pts/5) åbent.

Man kan få mere information end blot antal terminaler ved at skrive

                 
[tyge@hven ~]$ w
  5:35pm  up  7:20,  8 users,  load average: 0.14, 0.15, 0.10
USER  TTY      FROM     LOGIN@  IDLE   JCPU   PCPU  WHAT
tyge  tty1     -        5:25pm  9:40   1.26s  0.03s  /bin/sh /usr/X1
tyge  pts/0    -        5:26pm  7:03   2.50s  2.50s  /usr/bin/pine
tyge  pts/1    -        5:26pm  9:01   0.04s  0.04s  /bin/cat
tyge  pts/2    -        5:26pm  3:48   0.40s  0.40s  -bin/tcsh
katja pts/5    k5.sslug 5:31pm  3:13   0.37s  0.37s  -tcsh
tyge  pts/6    -        5:33pm  1.00s  0.25s  0.04s  w

Man får igen samme information om de to brugere som er logget ind, men der er mere information her. Man kan også se hvor lang tid de enkelte terminalvinduer har været urørte under "IDLE" og under "WHAT" kan man se om der kører et program i den enkelte terminal. I terminalen pts/0 kører der eksempelvis pine – dvs. et e-post program.

En anden vej at udvide information er at skrive


[tyge@hven ~]$ who am i
k6.sslug!tyge     pts/6    Dec 21 17:33

Resultatet er at man får maskin-navnet "k6.sslug" på den maskine man sidder ved og dernæst kommer brugernavnet. Det er meget nyttigt hvis man f.eks. anvender DHCP eller logger meget ind fra en maskine til mange andre over netværket.

Det næste vi ser på er finger, som giver lidt ekstra informationer. Man skriver "finger BRUGERNAVN" for at se information om BRUGERNAVN. Man får information tilbage om brugeren er logget ind på maskinen og man kan også se brugerens rigtige navn under "Name:"-feltet.


[tyge@hven ~]$ finger katja
Login: katja                            Name: Katja B
Directory: /home/katja                  Shell: /bin/tcsh
On since Fri Dec 21 17:31 (CET) on pts/5 from k5.sslug
   11 minutes 9 seconds idle
     (messages off)
No mail.
No Plan.


Hvis man vil have en oversigt over alle der er logget ind på systemet kan det klares ved blot at køre finger uden nogle kommandolinjetilvalg.

Finger læser filerne; ~/.plan og ~/.project. Er man systemadministrator (root) kan last og lastlog også give seneste login information.

Nu har vi set et par forskellige måder til at få information om hvilke brugere som anvender maskinen. En nem måde at få kontakt til en anden bruger på maskinen er at anvende "talk" (dette kræver at talk-dæmonen er installeret og startet). Men "talk BRUGERNAVN" kan man få en ICQ-lignende chat-session i gang hvor skærmen deles i to. Er brugeren logget ind i flere terminaler kan man anføre et ekstra argument til kommandoen "talk BRUGERNAVN TERMINAL", hvor terminal en af de terminaler, som BRUGERNAVN anvender – ovenfor kan brugeren "katja" findes på pty/5.

4.8.3. Søg og du skal finde

find bruges til at finde filer med. Syntaksen er: find hvorfra hvad [handling]. Ikke alle Linux/Unix-varianter kræver 3. argument. Lad os se nærmere på argumenterne.

Som et sødt lille eksempel på hvor smart find er, så kan vi tælle det totale antal af linjer i en række HTML-tekstfiler, der ligger spredt i nogle underbiblioteker.


[tyge@hven ~]$  (find . -name "*.html" -exec cat {} \;) | wc -l

4.8.4. Hvordan ændres datomærkningen?

Kommandoen touch anvendes til at oprette tomme filer eller til at ændre tidspunktet for sidste modifikation.

Lad os antage, at filen minFil eksisterer, og filen minIkkeEksisterendeFil ikke gør, da vil touch minFil sætte tiden for sidste modifikation af filen til det aktuelle klokkeslet. Kommandoen touch minIkkeEksisterendeFil vil oprette en tom fil med navnet minIkkeEksisterendeFil.

4.8.5. Hvilken filtype?

Kommandoen file forsøger at gætte, hvilken filtype der er givet som argument. Hvis file tror, at det er en ascii-fil, vil file læse de 512 første tegn og forsøge at gætte programmeringssproget.

file gætter desværre forkert fra tid til anden og kan f.eks. ikke genkende filer, der indeholder programmer, som er skrevet i Pascal eller Lisp.

4.8.6. Tid og dato

date udskriver den aktuelle dato og det aktuelle klokkeslet.


[tyge@hven ~]$  date
 lør jan 16 17:50:55 CET 1999

cal er en hel lille kalender. Uden argument udskrives kalenderen for den aktuelle måned. Med et argument (tal) regnes argumentet for et årstal. Vær i øvrigt opmærksom på, at cal er År 2000-klar, dvs. cal 99 udskriver kalenderen for år 99, mens cal 1999 skriver kalenderen for 1999.

Med 2 argumenter regnes det første som måned og det andet som årstal. Det er værd at bemærke, at cal antager, at skiftet fra den julianske kalender til den gregorianske kalender skete i september 1752, hvilket passer til engelske forhold (i katolske lande skete det i 1582 og i Danmark i år 1700).

4.8.7. Sortering

sort sorterer en fil linje for linje. sort kan også flette flere filer samtidig med at indholdet sorteres. Omdirigering af sort til en fil er mulig med tilvalget "-o". sort fil1 fil2 > fil1 vil give et pudsigt resultat: Da stdout omdirigeres til fil1, som eksisterer i forvejen, slettes fil1, og en ny, tom fil1 oprettes. Når fil1 og fil2 flettes og sorteres, vil fil1 være tom. Derfor vil kun indholdet af fil2 komme med i fil1 - kryptisk – prøv selv! Husk blot, at sort er den eneste (standard) kommando, hvor stdout omdirigeres med tilvalget "-o".

Men sort kan mere: En fil kan være inddelt i poster, f.eks. filen navne.


[tyge@hven ~]$  cat navne
   poul nyrup 52
   holger beck-nielsen 90
   william gates 55
   torvalds linus ??

Lad os illustrere sort ved en række eksempler. sort +1 navne vil sortere på efternavn (første felt er felt 0). sort +2-n navne vil sortere numerisk på hattestørrelse. sort -r navne vil sortere i omvendt rækkefølge.


[tyge@hven ~]$  sort +2 -n -r navne
  torvalds linus 91.2
  holger beck-nielsen 90
  william gates 55
  poul nyrup 52

4.8.8. diff

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


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

Eksempel 4-3. diff mellem hele katalog-strukturer

Kommandoen diff er faktisk ret smart. Man kan endda få den til at finde alle rettelser lavet mellem to kataloger, hvor der laves rekursiv søgning. Har man f.eks. katalogerne tux-ny og tux og skal vide hvad der er lavet om fra tux til tux-ny, så skriver man


[tyge@hven ~]$  diff -ur --new-file tux tux-ny
diff -ur --new-file tux/README tux-ny/README
--- tux/README    Sun Jan  6 00:24:23 2002
+++ tux-ny/README Sun Jan  6 00:22:13 2002
@@ -1,5 +1,3 @@
-Dette katalog indeholder tekster svarende til
-bogen, hvis vi har ment dette er relevant.

 Seneste bøger kan findes på
 cvs.linuxbog.dk

Parameteren u giver en pænere diff-fil med en rimelig syntaks (unified diff). Parameteren r betyder rekursiv søgning ned i katalog-strukturen og endelig så er --new-file med for at sørge for at nye filer også kommer med.

4.8.9. patch

Vi fortsætter ud fra Eksempel 4-3. Hvad der nu er smart er at en anden bruger tyge, der har den gamle katalog-struktur tux, og denne skal opgraderes med ændringerne fra brugeren tyge. Først gemmer tyge ændringerne i en fil patch_file og sender denne til tyge.


[tyge@hven ~]$ diff -ur --new-file tux tux-ny > patch_file

Brugeren tyge kan derefter tage filen og køre patch for at få opdateret underkataloget tux.


[tyge@hven ~]$ patch -p0 -u < patch_file
patching file tux/README

Nye filer skabes og slettede filer forsvinder automatisk. Det er på denne måde rettelser (patches) til Linux-kernen distribueres.

4.8.10. cat, uniq, wc og cmp

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


[tyge@hven ~]$   cat per3 
  Per
  Per
  Per
[tyge@hven ~]$  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 tilvalg: "-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 | (kanaler), f.eks. vil nedenstående kommando tælle op, hvor mange filer, der er i kataloget /usr/bin


[tyge@hven ~]$  ls /usr/bin | wc -l
  1208

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


[tyge@hven ~]$  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 katalog (eng. »directory«). grep ^d lader kun de linjer, der starter med d passere. wc -l tæller antallet af linjer den modtager.

4.8.11. Hoved og hale af filer

tail – uden tilvalg – 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.


[tyge@hven ~]$  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.
[tyge@hven ~]$  tail -2 sang
    jeg er som den vilde hyrde,
    der genner sit kvæg på græs.

tail har et meget nyttig "f"-tilvalg. 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 med i, 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 tilvalg – udskriver de 10 første linjer af en fil. Tilvalg kan gives som for tail.

4.8.12. "cut" og "paste"

cut tager det, du specificerer i tilvalg, 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 ét 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).


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

4.8.13. 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:


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

4.8.14. xargs

En af de meget nyttige kommandoer er xargs, som kan bruges som kobling mellem en kommando der giver en række filnavne, hvor der skal udføres en speciel kommando på hver af de filer. Som eksempel kan vi prøve at få antal linier i alle filer der ender på .sgml.


[tyge@hven ~]$  ls  *.sgml
indhold.sgml
mandrake.sgml
unix.sgml

Hvis man prøver at pipe filnavnet ind i wc, så går det galt


[tyge@hven ~]$  ls  *.sgml | wc --lines
3

Der der kommer som svar er at der er tre filer i ls-kommandoen. I stedet bruger vi xargs


[tyge@hven ~]$  ls  *.sgml | xargs -i= wc --lines =
 700 indhold.sgml
 232 mandrake.sgml
1232 unix.sgml

Programmet xargs får her filnavnene ind, og kører en kommando for hver af strengene. Argumentet -i= betyder at i den efterfølgende kommandoer skal lig-med (=) erstattes med en af de tekst-strenge (her er det et filnavn). Kommandoen er her wc --lines =, som viser antal linier i filnavnet =, dvs. det som kommer fra ls-kommandoen.

Der der i det nuværende katalog er tre filer, så er det nemt at vise hvad der egentlig bliver udført at ovenstående xargs-kommando:


wc --lines indhold.sgml
wc --lines mandrake.sgml
wc --lines unix.sgml

Det skal nævnes at anvendelsen af lig-med i eksemplet ikke er essentiel. Man kan også anvende et andet special-tegn.

4.8.15. Andre Unix-kommandoer

Tabel 4-6. Oversigt over de mest anvendte andre Unix-kommandoer.

Kommando Forklaring
find Find fil(er). Anvend f.eks. find /usr -name "*.gif" til at finde alle filer under biblioteket /usr, der ender på .gif. Prøv også locate FILNAVN.
whoami Viser hvilket brugernavn-navn der arbejdes under.
who Viser hvem der er logget ind på maskinen.
passwd Skift adgangskode.
su Skift bruger-identitet.
echo Kommandoen echo "TEKST" skriver teksten på skærmen.
chown Ændrer ejerskabet af filer.
date Viser dato og tid.
xhost Anvendes til at tillade/begrænse andre maskiner at koble til maskinens X-server, dvs. om de må vise grafik på skærmen. Anvend xhost + til at tillade alle maskiner at vise grafik på maskinen. Anvend tilsvarende xhost -maskinnavn til at forhindre, at den pågældende maskine viser grafik.
lpr Print ordre. Anvend lpr -Pprinternavn filnavn for at printe på printeren printernavn. De enkelte printere er defineret i filen /etc/printcap. De aktuelle printere kan være såvel lokale som netprintere.
lpq Printerkø forespørgsel. Anvend lpq -Plp til at vise, hvor langt printeren lp er med at printe ud.
lprm Anvendes til at fjerne printjobs, som ikke er skrevet endnu. Se muligheder med man lprm.
tar Anvendes til at pakke flere filer sammen til en. Anvend f.eks. tar cvf tfil.tar fil1 fil2 for at pakke fil1 og fil2 sammen til filen tfil.tar. Tilsvarende kan filen pakkes ud med tar xvf tfil.tar.
compress Pakker filer ind/ud. Anvend compress filnavn til at pakke filen til filnavn.Z. Tilsvarende anvendes uncompress til at pakke ud.
gzip Andet og bedre pakkeprogram, der anvender .gz som slutning af filnavn. Tilsvarende findes gunzip til at pakke ud. Normalt ses også filtypen .tgz, som er en tar fil, hvor der efterfølgende er anvendt gzip.
bzip2 Andet og bedre pakkeprogram, der anvender .bz2 som slutning af filnavn. Tilsvarende findes bunzip2 til at pakke ud. Normalt ses også filtypen .tar.bz2, som er en tar fil, hvor der efterfølgende er anvendt bzip2.
diff Sammenligner to filer og rapporterer forskellene.
free Viser, hvor meget hukommelse der er brugt, og hvor meget der er til rådighed.
df Viser, hvor meget diskplads der er brugt, og hvor meget der er til rådighed på samtlige diske.
du Viser status over, hvor meget diskplads der er brugt under det sted, hvor du står i filtræet.
sort Sorterer en tekstfil.
ssh ssh saltholm.sslug.dk date betyder, at du udfører kommandoen date på maskinen saltholm.sslug.dk, dvs. en anden Unix-maskine. Linux kan udføre kommandoer på andre maskiner og så vise grafik (og tekst) på din egen maskine. Kræver at OpenSSH installeres.