Hopp til innhold

Boken Om Linux/Kapittel 13

Fra Wikibøker – frie læremidler

13: Linux-verktøy

[rediger]

Jeg kaller programmer som produserer et resultat for et verktøy. Det finnes to verktøytyper:

   * spesifikke verktøyprogrammer
   * fleksible verktøyprogrammer 

Videre i dette kapitlet skal vi se på de fleksible verktøyprogrammene. Disse kan utføre mange oppgaver som ligner hverandre. Verktøyprogrammene har et stort utvalg av opsjoner og kan brukes i forskjellige kombinasjoner. Ved å kombinere forskjellige verktøyprogrammer kan du utføre mange komplekse oppgaver.

De fleste verktøyprogrammene arbeider med tekst. En viktig egenskap er at verktøyprogrammene kan brukes som filtre.

I dette kapitlet har jeg tatt med noen eksempler på de mest populære verktøyprogrammene.

Innholdet i en fil – more

[rediger]

Linux-kommandoen more gjør nesten det samme som cat-kommandoen, med den forskjell at more stopper for hvert nytt skjermbilde og venter på at du skal gi en kommando for å gå videre. Kommandoen more er ikke noe fleksibelt verktøyprogram, men brukes i mange tilfeller sammen med forskjellige andre verktøyprogrammer.

Kommandoen more innhold i fil(er)
Kommando: more [-an.l] [opsjon] [+linjenr] [+/<mønster>] fil …
Funksjon: Se på innholdet i én eller flere filer
-an.l (an.l = antall linjer) setter antall linjer i skjerm-bildet; dette er det samme som vindustørrelse
Linjenr: (linjenr = linjenummer) Her definerer du fra hvilken linje utskrivingen til skjermen skal begynne.
Fil: Kan være filer eller kataloger
Opsjoner: Se også Linux-man-sidene.
-c Forhindrer skrolling på skjermen, fjerner gammel linje når det skrives over med en ny linje

Når du bruker more, vil det etter utskriving av et skjermbilde stå “more" nederst på skjermen. Kommandoen more venter da på en kommando fra brukeren. Ønsker du å rulle skjermbildet videre, kan du trykke på mellomromstasten.

Nedenfor har jeg en oversikt over de mest brukte kommandoene i more:

Kommandoer i more Beskrivelse
h viser et hjelpebilde
mellomromstasten viser neste bilde
Enter-tasten viser neste linje
"<n>f" hopper n skjermbilder framover
"<n>s" hopper n linjer framover
/<mønster> søker etter teksten mønster
!<kommando> utfører Linux-kommando (starter et skall)
q går ut av more

Eksempler:

[david@nittedal david]$ more /etc/termcap

Viser innholdet av filen /etc/termcap med ett skjermbilde om gangen. Ved å trykke på mellomromstasten, får du se det neste skjermbildet.

[david@nittedal david]$ more *.c

Viser alle filene som har endelse .c.

[david@nittedal david]$ ps ex | more

Viser prosessoversikt, med ett skjermbilde om gangen.

[david@nittedal david]$ more -12 /etc/passwd

Viser innholdet av filen /etc/passwd. Skjermen er satt til en vindustørrelse på 12 linjer.

[david@nittedal david]$ more +15 /etc/hosts

Her får jeg en utskrift av filen /etc/host fra linje 15.

[david@nittedal david]$ more -12 +25 datafil

Her vil utskriften begynne fra linje 25 i filen datafil, og vindustørrelse på hvert skjermbilde er satt til 12 linjer.

[david@nittedal david]$ more +/vt220 /etc/termcap

Her vil utskrivingen starte 2 linjer før linjen med teksten vt220 dukker opp første gang i filen /etc/termcap.

Alternativ til more – less

[rediger]

Et annet Linux-filter som er en variant av more, er less. Denne kommandoen gjør det samme som more, men har noen flere opsjoner.

Kommandoen less innhold av fil (er)
Kommando: less -h [-p tekstmønster] fil …
Funksjon: Se på innholdet av én eller flere filer
Fil: Kan være én eller flere filer
Opsjoner: Se også Linux-man-sidene.
--help less' hjelpeside
-p tekstmønster Viser deg filen fra det spesifiserte tekstmønstret

Eksempler:

[david@nittedal david]$ less -p Linux operativsystem_rapport

Her vil less vise siden hvor den finner første referanse til tekststrengen Linux i filen operativsystem_rapport.

[david@nittedal david]$ less --help

Her vil less gi deg en oversikt over alle opsjoner.

Sortere data – sort

[rediger]

Hver linje som skal sorteres, kan bestå av tall, enkeltord eller en hel serie med ord og tall. Linjen er delt opp i felt som er atskilt med mellomrom, eller med andre tegn som du selv velger.

Sorteringen kan være i stigende eller synkende rekkefølge. Du kan fritt velge om sorteringen skal være numerisk eller alfanumerisk. Du bestemmer sorteringsfelt og hvilke felter sorteringen skal baseres på. Fordi det finnes mange opsjoner, krever sort-kommandoen en del øvelse før du blir godt kjent med den.

Kommandoen sort sortering av tekst/data
Kommando: sort [-m] [-o fil] [-dfrnu] [-t separator] [+posisjon.1] [-posisjon.2] [filliste]

eller forenklet sort [opsjon] filnavn

Funksjon: Sorterer innholdet i én eller flere filer
Opsjoner: Se også Linux-man-sidene.
-m Samsortering av inngående filer
-d Bare bokstaver, tall, mellomrom og tabulator er signifikante; alfanumerisk sortering.
-f Ingen forskjell på små og store bokstaver; med denne opsjonen blir det ikke noe forskjell mellom Kong Olav og kong olav.
-n Sorterer de spesifiserte feltene numerisk
-r Sorterer i synkende (reverse) rekkefølge
-t Omdefinerer feltseparatoren til et annet tegn, for eksempel definerer -t: kolon som feltseparator.
-u Overser gjentatte linjer
-o fil Brukes hvis du ønsker å angi en resultat-fil


Eksempler:

[david@nittedal david]$ who | sort

david tty1 Jul 11 06:15

vigdis tty2 Jul 11 06:16

root ttyp0 Jul 11 06:15

Her blir resultatet av who-kommandoen sortert alfabetisk etter brukernavnet. Hvordan sort ordner rekkefølgen på bokstaver og tall, avhenger av tegnsettet på maskinen din.

Jeg lager en datafil for å vise mer bruk av sort-kommandoen:

[david@nittedal david]$ cat > datafil

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Anne:040545:Jente:9190.10.34566:Oslo Banken

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

<Ctrl-d>

Filen datafil består av fornavn, fødselsdag, kjønn, kontonummer og bank. Denne skal nå sorteres. : er feltskilletegn (separator).

[david@nittedal david]$ sort -t: datafil Anne:040545:Jente:9190.10.34566:Oslo Banken

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Filen ble her sortert etter det første feltet. : var definert som feltseparator.

[david@nittedal david]$ sort -f -t: navnliste Anne:040545:Jente:9190.10.34566:Oslo Banken

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Her blir innholdet av filen navnliste sortert på basis av første kolonne, med hensyn til separatortegnet : og uten hensyn til forskjellen mellom stor og liten bokstav.

Posisjonsparametere

[rediger]

Notasjonen +posisjon.1 og -posisjon.2 begrenser sorteringsnøkkelen fra starten av posisjon 1 til slutten av posisjon 2. Tegnene i posisjon 1 og posisjon 2 er inkludert i sorteringsnøkkelen. Tar du ikke med sluttposisjonen (posisjon.2), blir sorteringsfeltet begrenset til feltet mellom posisjon.1 og slutten av den linjen som skal sorteres.

[david@nittedal david]$ sort -t: +2 datafil

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

Anne:040545:Jente:9190.10.34566:Oslo Banken

Filen blir sortert etter det tredje feltet (kjønn).

[david@nittedal david]$ sort +1 -o sortdata datafil

[david@nittedal david]$ cat sortdata Anne:040545:Jente:9190.10.34566:Oslo Banken

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

Her blir filen sortert etter det andre feltet. Feltet med mellomnavn blir felt nr. 2 fordi det ikke er angitt noen skilletegn. Resultatet blir lagt i filen sortdata.

[david@nittedal david]$ sort -n +1 -t: -o sortdata datafil

Nils Erik:010356:Gutt:9190.10.56543:Oslo Banken

Anne:040545:Jente:9190.10.34566:Oslo Banken

Per David:220759:Gutt:6072.55.34567:Kreditkassen

Filen blir sortert etter det andre feltet. Angitt skilletegn er : (kolon). Fordi jeg bruker n-opsjonen, får jeg en sortering basert på det numeriske innholdet i kolonne nummer 2. Resultat blir lagt i filen sortdata.

[david@nittedal david]$ sort -t: +1 -2 datafil

Her brukes det andre feltet til å sortere filen navnliste. Opsjonen +1 forteller oss at sorteringsfeltet er starten på andre felt i linjen. Tar du ikke med sluttposisjonen (posisjon.2) blir sorteringsfeltet begrenset til feltet mellom posisjon.1 og slutten av den linjen som skal sorteres

[david@nittedal david]$ sort -t: +2n -3 /etc/passwd

Her sorteres passordlisten (eksempel på passordliste). Det gir:

root:*:0:1:Superuser:/:

daemon:*:1:1:System daemons:/etc:

bin:*:2:2:Owner of system commands:/bin:

sys:*:3:3:Owner of system files:/usr/sys:

adm:*:4:4:System accounting:/usr/adm:

Passordfilen sorteres etter numerisk brukernavn, dette er tredje kolonne. Feltseparatorer er kolon.

Finne tekstmønster – grep

[rediger]

Med grep-kommandoen kan du finne tegnmønstre i én eller flere filer. Er ikke annet angitt, blir resultatet sendt til skjermen. Kommandoen grep står for Global Regular Expression Print, den er egentlig en familie av kommandoer, bestående av grep, fgrep og egrep. Grunnen til at det finnes tre grep-kommandoer, er at hver av dem har sine fordeler og ulemper. Kommandoen grep bruker mindre plass enn egrep, men den er vanligvis også langsommere. Uttrykket fgrep står for fixed grep, og med denne kommandoen kan du bare finne faste strenger og ikke jokere. Uttrykket egrep står for extended grep; egrep er et mer avansert program enn de andre grep-kommandoene og kan ta mer komplekse uttrykk. Kommandoen grep trenger en del øvelse før du blir godt kjent med den.

Kommandoen grep finner en streng i én eller flere filer
Kommando: grep [-vcln] uttrykk [fil1 ...]
Funksjon: Finner en streng i én eller flere filer
Opsjoner: Se også Linux-man-sidene.
-c Angir antall linjer som inneholder tekststrengen
-i Store og små tegn får samme kode.
-l Bare navnet på filen(e) blir skrevet ut hvis tekststrengen finnes.
-n Alle linjer hvor grep finner tekststrengen, blir skrevet ut med linjenummer.
-v Skriver ut alle linjer som ikke inneholder tekststrengen
uttrykk: Tekststrengen du søker etter
fil1: Filnavn (ett eller flere) med eller uten jokere (*, ?, [ ])

Bruker du ingen opsjoner, men spesifiserer bare en tekststreng og et filnavn, vil grep finne og skrive ut alle linjer som inneholder tekststrengen.

NB! Har strengen flere ord, må tekststrengen stå i anførselstegn.

Eksempler:

[david@nittedal david]$ grep david filnavn

Her blir alle linjer i filen filnavn som inneholder ordet david skrevet ut på skjermen.

[david@nittedal david]$ grep -n Olav datafil

I dette tilfellet finner grep-kommandoen nummeret på linjen som inneholder tekststrengen Olav.

[david@nittedal david]$ grep -c Olav datafil

Gir antall linjer i filen datafil som inneholder mønstret Olav.

[david@nittedal david]$ grep -v Olav datafil

Gir alle linjer som ikke innholder mønstret Olav.

[david@nittedal david]$ grep -i Olav datafil

Fordi jeg bruker i-opsjonen, er det her ikke gjort forskjell på små og store bokstaver.

[david@nittedal david]$ grep -l ansi /etc/termcap /etc/termcap.old /usr/lib/terminfo/a/ansi

Her blir alle filene som inneholder mønstret ansi skrevet ut på skjermen.

[david@nittedal david]$ grep -n set *

Her søkes det gjennom alle filer etter tekststrengen set. Søker du etter uttrykk med spesialtegnene [, ], }, {, \, |, $ osv, kan du slå av spesialfunksjonen med en ' (apostroftegnet) på hver side av spesialtegnet.

[david@nittedal david]$ grep -n '\|' *

Bruker du norsk 7-bits ASCII-tegnsett, er | mappet til ø, \ til stor Ø, [ til stor Æ, osv. Det vanligste er å bruke 8-bits ISO-tegnsett, som jeg anbefalte i forbindelse med Linux-installasjonen.

[david@nittedal david]$ grep 'Ole' fil

Gir de linjene hvor tekststrengen Ole står alene.

[david@nittedal david]$ grep 'O..' fil

Gir de linjene som består av 3 tegn, der det første tegnet er O.

[david@nittedal david]$ grep '[Oo]le' fil

Gir de linjene som består av både Ole og ole.

[david@nittedal david]$ grep '[^o-z]le' fil

Gir ord som består av 3 tegn, som ikke starter på bokstavene o til z, men ender på le.

[david@nittedal david]$ grep ',$' fil

Finner alle linjer som ender med komma (,).

[david@nittedal david]$ grep -n '^$' fil

Finner alle tomme linjer.

[david@nittedal david]$ fgrep "david" datafil

Her søkes det etter tekststrengen david i filen datafil. Jeg bruker her fgrep i stedet for grep ettersom jeg har en fast tekststreng.

Sammen med egrep kan du bruke følgende regulære uttrykk:

Tekststreng Forklaring
tekststreng + En eller flere tekststrenger kan settes sammen.
tekststreng ? Tekststreng pluss et tegn
uttrykk2 Søker enten uttrykk1 eller uttrykk2

[david@nittedal david]$ egrep 'An+e' navnliste

Her søkes det gjennom filen navnliste etter tekststrengen Ane, Anne, Annne osv.

[david@nittedal david]$ egrep 'david | dave' navnliste

Her søkes det etter tekststrengen david eller dave i filen navnliste.

Finne filer – find

[rediger]

Med find kan du finne en spesiell fil eller katalog i filsystemet. Med find kan du ha flere søkekriterier, blant annet navnet på filen (katalogen), inodenummer på filen, eieren av filen (katalogen), filens (katalogens) gruppetilhørighet, datoen, størrelsen etc. Er ikke noe annet angitt, blir resultatet sendt til skjermen.

Kommandoen find finner én eller flere filer (kataloger)
Kommando: find katalog kriteria [filnavn] kommando

eller forenklet find hvor hva hva-gjør-vi

Funksjon: Finner én eller flere filer (kataloger) som oppfyller bestemte kriterier definert med de forskjellige uttrykkene du kan bruke
Beskrivelse: Se også Linux-man-sidene.
-name fil Sant hvis filen(e) er identisk med filnavn
-user bruker Sant hvis filen(e) tilhører bruker
-group gruppe Sant hvis filen(e) tilhører gruppe
-size n Sant hvis størrelsen er n; n er antall blokker (en blokk=512 bytes).
-atime n Sant hvis filen har vært brukt for n dager siden
-exec cmd Utfører skallkommandoen cmd
-print Viser søkebane på skjermen

Bruker du ingen kriterier, vil ikke find-kommandoen gi noe resultat.

Figur 13.1: Bruk av GNOMEs søkeverktøy (Søk etter filer …)

Eksempler:

[david@nittedal david]$ find . -name brev -print

Punktumet (.) gjør at jeg søker i den katalogen som kommandoen blir utført fra. Kommandoen -name brev gjør at jeg søker etter filen med navnet brev. Kommandoen print gjør at resultatet blir sendt til skjermen.

[david@nittedal david]$ find / name Linuxbok -print

Søker fra root / og nedover hele filstrukturen etter filen Linuxbok. Hvis Linuxbok blir funnet, blir resultatet vist på skjermen.

[david@nittedal david]$ find / -user david -print

Søker etter alle filer som tilhører david.

[david@nittedal david]$ find / -atime +2 -print

Søker etter alle filer som har vært i bruk de siste to dagene.

[david@nittedal david]$ find . -size 0 -print

Søker etter alle filer som har null størrelse i den katalogen kommandoen blir utført.

[david@nittedal david]$ find / -name wp -exec ls -l {} \;

Søker etter alle filer med navnet wp. Hvis en fil med wp blir funnet, skal dette vises via kommandoen ls -l. Det er exec som utfører den angitte kommandoen ls -l. Tegnet {} står for filen som er ettersøkt, mens tegnet \; står for kommandoens avslutning. (Mer om disse operatorene finner du i kapittel 16.)

Til slutt tar jeg med et mer sammensatt eksempel.

[david@nittedal david]$ find / \( -name core -o -name "*.out" \) -atime +7 -exec rm {} \;

Her sletter jeg alle filer som har navnet core, og alle filer som har endelsen .out. Bare de filene som det ikke er lest eller skrevet til de siste syv dagene, blir slettet.

Finne filer - which & locate

[rediger]

Med find kan du finne en spesiell fil eller katalog i filsystemet. Med find kan du bruke mange forskjellig søkekriterier. Ønsker du bare å lokalisere søkebanen til en fil eller katalog kan du bruke which-kommandoen

elboth@suselap:~/tmp> which xine

/usr/bin/xine

Husker du bare deler av filnavnet eller katalogen er det kommandoen locate du skal bruke.

elboth@suselap:~/tmp> locate cdroast

/opt/gnome/share/icons/gnome/32x32/apps/xcdroast.png

/opt/gnome/share/icons/gnome/48x48/apps/xcdroast.png

Denne kommandoen forutsetter at databasen updatedb er oppdatert på din Linux-maskin. Du har ikke 100% utbytte av denne kommandoen hvis du ikke oppdaterer databasen daglige eller på ukelig basis avhengig av hvor ofte du bruker PCen. Dette kan du løse ved at du har en cron-jobb (jobb som kjører i bakgrunnen på bestemte tidspunkter; se kapittel 11) som kjører dette automatisk for deg .

Klippe fil – cut

[rediger]

Kommandoen cut brukes til å kutte ut vertikale deler av en fil. Denne kommandoen manipulerer på inputfiler og sender resultatet til terminalen. Du får mest bruk for cut ved behandling av data som er i tabulatorformat. Kommandoen cut er ikke standard i versjon 7 eller Berkeley-baserte Unix-systemer.

For å kunne bruke cut må du vite hvordan kolonnene er separert. Den greieste feltseparatoren er tab, men du kan også bruke andre tegn som separator, for eksempel : eller mellomrom.

Kommandoen cut kutter vertikalt i en tekstfil
Kommando: cut -c liste [fil1 fil2 ...]

cut -f liste [fil1 fil2 ...] eller cut -f liste [-d separatortegn] [fil1 fil2 ...]

Funksjon: Kutter vertikalt i en tekstfil
Beskrivelse: Se også Linux-man-sidene.
-c liste Listen etter -c spesifiserer en tegnposisjon, for eksempel betyr -c1-72 at det bare blir kopiert fra tegnposisjon 1 til 72.
-f liste Feltliste, for eksempel -f1,7, betyr at bare første og syvende kolonne blir kopiert.
-d separatortegn Tegnet som etterfølger -d, er feltseparator.


Eksempler:

[david@nittedal david]$ cut -f2,5 -d":" datafil

Tar ut felt 2 og 5 i filen datafil. Feltseparator er : (kolon).

Dette gir:

220759:Kreditkassen

040545:Oslo Banken

010356:Oslo Banken

[david@nittedal david]$ cut -c1-3 datafil

Gir de tre første tegnene i første kolonne i filen datafil.

Per

Ann

Nil

[david@nittedal david]$ cut -d: -f1,5 /etc/passwd

Her tar jeg ut brukernavn og bruker-id-nummer fra filen /etc/passwd.

[david@nittedal david]$ navn=who am i | cut -f1 -d" "

Her tar jeg ut brukernavnet mitt.

Flette filer – paste

[rediger]

Kommandoen paste brukes til å manipulere vertikale deler av tekstfiler. Du får mest bruk paste ved behandling av data som er i tabulatorformat. Kommandoen paste brukes til å flette inn flere filer vertikalt i en fil; paste manipulerer inputfiler og sender resultatet til terminalen.

Kommandoen paste er ikke standard i versjon 7 eller Berkeley-baserte Unix-systemer. For å kunne bruke paste må du vite hvordan kolonnene er separert. Den greieste feltseparatoren er tab, men hva som helst kan brukes.

Kommandoen paste flette filer
Kommando: paste [-s] [-d separatortegn] fil1 fil2 ...
Funksjon: Fletter flere filer vertikalt ved siden av hverandre
Beskrivelse: Se også Linux-man-sidene.
-d separatortegn Tegnet som etterfølger -d er feltseparator.
-s Omformer enkeltlinjer fra en enkelt fil

Eksempel med både cut og paste:

La oss separere fornavnene fra telefonlisten telefon.

Først lager jeg listen:

[david@nittedal david]$ cat >telefon

david 02453449

nils 02834896

ole 05749845

vigdis 07374758

geir 02549474

odne 02653433

Jeg bruker -f-opsjonen slik at det blir entydig hvilket felt det skal kuttes fra. Jeg kutter her ut første felt (fornavnene) i filen telefon og legger disse i filen fornavn:

[david@nittedal david]$ cut -f1 telefon >fornavn

Jeg ser så på innholdet i filen fornavn.

[david@nittedal david]$ cat fornavn

david

nils

ole

vigdis

geir

odne

Nå kan jeg bruke paste-kommandoen til å kombinere de vertikale tabellene. Jeg lager en ny fil som jeg kaller nyliste, hvor telefonnumrene kommer før fornavnene på hver linje. Kommandoen paste separerer automatisk de to kolonnene med en tab-karakter.

[david@nittedal david]$ cut -f1 telefon >navn

[david@nittedal david]$ cut -f2 telefon >tall

[david@nittedal david]$ paste tall navn >nyliste

[david@nittedal david]$ cat nyliste

02453449 david

02834896 nils

05749845 ole

07374758 vigdis

02549474 geir

02653433 odne

[david@nittedal david]$ rm tall navn

Fjerner filene tall og navn. Eksempler med paste-kommandoen:

[david@nittedal david]$ paste -d":" data1 data2 > data

Her setter jeg sammen kolonnene i filen data1 med kolonnene i filen data2. Den nye resultatfilen får navnet data. Jeg har definert : som kolonneseparator.

[david@nittedal david]$ ls | paste -d" " -

Lister innholdsfortegnelsen i én kolonne.

[david@nittedal david]$ ls | paste - - - -

Lister innholdsfortegnelsen i fire kolonner.

[david@nittedal david]$ paste -s -d"\t\n" navnfil

Her blir to linjer i filen navnfil til én enkel linje.

Se også: cut, grep, ls, rm

Unike linjer – uniq

[rediger]

Ønsker du å fjerne gjentatte linjer i en fil, bruker du kommandoen uniq. Denne kommandoen leser fra innfil og sammenligner to linjer ved siden av hverandre. Hvis to linjer er like, blir den ene fjernet. Dette gjelder bare like linjer som ligger etter hverandre. I mange tilfeller kan jeg ha like linjer som er gjentatt forskjellige steder i en fil. For å ha muligheten til å fjerne alle like linjer, må jeg derfor først sortere filen.

Kommandoen uniq finner unike linjer i en fil
Kommando: uniq [-udc] [-felt] [+tegn] [innfil] [utfil]
Funksjon: Fjerner to like linjer som er plassert ved siden av hverandre i en fil
Opsjoner: Se også Linux-man-sidene.
-felt Her definerer du de første feltene som skal hoppes over før sammenligningen av linjer som kommer etter hverandre starter.
+tegn Her hoppes de første tegnene i hver linje over før sammenligningen av linjer som kommer etter hverandre starter. Har du først angitt et felt, vil uniq først hoppe over dette feltet før den hopper over enkelttegn.
-u Alle linjer som ikke er gjentatt, blir skrevet ut.
-d Alle de gjentatte linjene blir skrevet ut.
-c Opphever opsjonene -u og -d og viser antall gjentatte linjer

Uten opsjon vil uniq vise det samme resultat som om jeg hadde brukt både -u og -d.

Eksempler:

[david@nittedal david]$ sort datafil | uniq

Her blir filen datafil først sortert, deretter blir alle like linjer fjernet.

[david@nittedal david]$ sort datafil | uniq -c

Her blir antall gjentatte linjer vist på skjermen.

Se også: sort

Konvertere tekst – tr

[rediger]

Med kommandoen tr kan du endre en tekst som er skrevet i en form til en annen form. Teksten leses inn fra standard inndata eller fra fil. Resultatet blir sendt til standard utdata hvis ikke annet er spesifisert.

Kommandoen tr konvertere datatekst
Kommando: tr [-cds] [streng1] [streng2]
Funksjon: bytter ut eller fjerner valgte tegn
Opsjoner: Se også Linux-man-sidene.
-c komplementer (inverterer) tegn gitt ved streng1 (complement)
-d Fjerner (delete) tegn gitt ved streng1.
-s Minsker (squeeze) et bestemt antall tegn som kommer etter hverandre til et tegn.

Inndata er spesifisert med streng1, og resultatet er streng2.

Eksempler:

[david@nittedal david]$ tr -s "\012" < datafil

Her vil alle tomme linjer i filen datafil bli fjernet.

[david@nittedal david]$ tr "[A-Z] [a-z]" < datafil

Her vil alle store bokstaver (her bruker jeg 7 bits; ved 8 bits ISO skriver du [A-Å]) i filen datafil bli omgjort til små bokstaver.

[david@nittedal david]$ echo "Dette er Linux-verden" | tr L U

Dette er Uinux-verden

I dette eksemplet bytter tr-kommandoen bokstaven L ut med U i tekststrengen “Dette er Linux-verden".

[david@nittedal david]$ tr -cs "[A-Z][a-z]" "[\012*]" < datafil.1 >resultat.fil

I dette eksemplet lager jeg en liste over ordene i filen datafil.1. Hvert av disse ordene blir en enkel linje i filen resultat.fil. Et ord er definert til å bestå av tegnene A-Z eller a-z. 012, som betyr linjeskift, er tatt med for å spesifisere linjeskift etter hvert ord i resultat.fil.

Se også: echo og koder

Sideformatering – pr

[rediger]

Kommandoen pr brukes til å formatere tekst; pr kan brukes til formatering av tekst som skal ut på terminalen eller til en skriver. Kommandoen pr sender ikke det formaterte dokumentet direkte til skriver, men bare til standard utdata (skjerm).

Kommandoen pr sideformatering av datatekst
Kommando: pr [opsjon] [fil ...]
Funksjon: Formaterer én eller flere filer
Opsjoner: Se også Linux-man-sidene.
-(n) Du får utskriften fra fil(ene) i n-kolonner.
-h Bruker det neste argumentet som overskrift på toppen av hver side
-m Fletter de spesifiserte filene sammen til én fil. Hver fil blir plassert i en kolonne, dvs. fil1 blir plassert i kolonne 1, fil 2 blir plassert i kolonne 2, osv.
-p Utskriften til terminalen stoppes etter hvert sideskift.
-t Skriver ikke ut de 5 første og 5 siste linjene i fil(ene)
-w(n) Setter bredden av linjen til n tegn

De forskjellige opsjonene bestemmer hvordan utskriften skal se ut. Den opprinnelige filen blir ikke endret.

Eksempler:

[david@nittedal david]$ pr -3 datafil

Lister ut filen datafil i tre kolonner.

[david@nittedal david]$ pr -w70 brev-tilbud

Linjebredden (siden) blir satt til 70 i stedet for 72 som er standard.

[david@nittedal david]$ pr -h "Budsjett 2002" bud1 -h "Budsjett 2003" bud2 bud3

Her blir filen bud1 skrevet ut med toppteksten Budsjett 2002, og filene bud2 og bud3 blir skrevet ut med toppteksten Budsjett 2003.

[david@nittedal david]$ pr -h "Budsjett 2005" bud1 bud2 bud3 | lpr -P laser-III

Her blir filene bud1, bud2 og bud3 satt sammen, og toppteksten Budsjett 2005 blir satt på toppen av hver side. Til slutt blir dokumentet sendt til skriver laser-III. Originalfilene blir ikke endret.

[david@nittedal david]$ pr -m -t -p -h "IDG Forlag A/S" Regn2002 Regn2003

Regn2002 og Regn2003 blir flettet sammen til to kolonner. Regn2002 blir satt i kolonne 1, og Regn2003 blir satt i kolonne 2. De 5 første og 5 siste linjene blir ikke tatt med i filene. Toppteksten IDG Forlag blir lagt til på hver side. Etter hver side stoppes utskriften til skjermen.

[david@nittedal david]$ ls /usr/ole | pr -8 -w132 | lpr -P laser-III

Her blir utskriften fra ls-kommandoen formatert i 8 kolonner, og utskriftslinjen(siden) er satt til 132 tegn. Tilslutt blir dokumentet sendt til skriverkø laser-III.

Se også: cat

Andre nyttige GNU-verktøy

[rediger]

I dette avsnittet ser jeg på andre nyttige GNU-verktøy. Mange ganger har jeg problemer med å sende større filer som vedlegg til mine samarbeidspartnere. En løsning på problemet er å splitte filene opp i mindre enheter. Under har jeg eksempel på hvor jeg splitter opp en fil i størrelse a 1 MB.

[david@nittedal david]$ split -b 1024k boken.sxw del

Alle delfilene får navnet del.aa, del.ab, del.ac. Bruker jeg diskett som media kan jeg velge en filstørrelse på 1440k.

[david@nittedal david]$ split -b 1440k boken.sxw del

Ønsker du senere å lime alle filene sammen til en fil kan du bruke cat-kommandoen. Under har jeg eksempel:

[david@nittedal david]$ cat del?? > storfil.sxw

Mange ganger får man patcher og oppdateringer og da kan være nyttige vite hva som er forskjellen mellom originalfilen og den nye filen. Jeg bruker kommandoen diff for å se forskjellen.

[david@nittedal david]$ diff -u orginal.c ny.c > patch-1

Med denne kommandoen lager jeg filen patch-1 som er endringen i C-kildefilen. Når en bruker mottar patch-filen er det bare nødvendige å plassere den patchede filen i samme katalog og kjøre patch-kommanoden

[david@nittedal david]$ patch < patch-1

patching file orginal.c

Du vil se at patch-kommandoen oppdateres endringene til orginal filen orginal.c. Patch-kommandoen er enkel kommando til å oppdatere endringer på tekstfiler.

Har du en stor tekstfil hvor du ønsker å konverter alle tab til mellomrom. Vi du finne expand nyttige.

[david@nittedal david]$ expand tab_fil > mellom_fil

I eksemplet over konverter jeg alle taber til mellomrom fra filen tab_fil. Resultatfilen er mellom_fil. Ønsker du konvertere den andre veien bruker du kommandoen unexpand.

[david@nittedal david]$ unexpand mellom_fil > tab_fil

Ønsker du at alle linjene i en tekstfil ikke skal ha mer enn et bestemt antall tegn per linje er kommandoen fold nyttige. Under har jeg et eksempel.

[david@nittedal david]$ fold -w8 datafil1 > datafil2

I eksempelet over blir linjer i datafil1 konvertert til maksimalt 8 tegn i resultatfilen datafilen2.

I tabellen nedenfor har jeg laget en oversikt over andre nyttige GNU-programmer under Linux.

Kommando Beskrivelse
cksum Sjekker CRC sjekksum og teller antall bytes i en fil. Nyttige kommando for sjekke om filen har blitt ødelagt i forbindelse med overføring (FTP).
md5sum Regner ut og sjekker om MD5 sjekksum basert 128 bit kryptering (MD5-algoritmen).
head Skriver bare ut første delen av fil.
nl Setter nummer på hver linje og sender resultatet til standard utdata.
od Skriver innholdet av filene til standard utdata i oktalt format eller andre formater.
ptx Lager en indeks av innholdet.
tac Skriver hver fil ut til standard utdata med de siste linjene først.
tsort Denne kommandoen lager en topologisk sortering (brukes til bibliotekshåndtering; sjekk kommandoene ar og ld).
* Pakkeprogrammer

Akkurat som i Microsoft DOS og Windows, finner du mange pakkeprogrammer for Linux. Til hver enkel av disse kommandoene finner du mange opsjoner. (Se også Linux-man-sidene.) Her er noen eksempler:

[david@nittedal david]$ gzip -v *

Her får jeg en oversikt over hvor mye plass jeg sparer med å pakke de enkelte filene på den katalogen jeg utfører kommandoen.

[david@nittedal david]$ gzip Linuxbok

Her pakker jeg filen Linuxbok. Den gamle filen blir fjernet. Den nye pakkede filen får navnet Linuxbok.gz.

[david@nittedal david]$ gzip -d Linuxbok

Her blir filen Linuxbok pakket ut. Det nye filnavnet blir Linuxbok.

[david@nittedal david]$ zip -e bok.zip bok.sxw

Her pakker jeg filen bok.sxw (OpenOffice-format). Filen blir pakket inn i arkivet bok.zip. Fordi jeg har med opsjonen -e blir det satt passord på arkivet.

[david@nittedal david]$ unzip -d bok.zip

Her blir alt pakket ut av arkivet. Fra arkivet får vi bok.sxw.

I tabellen nedenfor har jeg laget en oversikt over de mest brukte pakkeprogrammene for Linux.

Kommando Beskrivelse
compress Pakkeprogram som var mye benyttet tidligere. Filer som er komprimert med compress, har endelsen .Z. Filen Linux.Z er resultatet av compress, mens Linux.gz er resultatet av gzip.
uncompress Brukes for å dekomprimere filer laget med compress; gunzip kan også brukes.
gzip Pakkeprogram som bruker Lempel-Zip koding; med gzip kan du både pakke inn og ut.
gunzip Utpakkingsprogram for .gz-filer (gzip)
zcmp Pakker ut filene og sammenligner dem ved å bruke Linux-kommandoen cmp
zdiff Pakker ut filene og sammenligner dem ved å bruke Linux-kommandoen diff
zgrep Pakker ut filene og søker etter tekstmønstre ved å bruke Linux-kommandoen grep
zless Pakker ut filen og viser den på skjermen
unzip Tilsvarer programmet pkunzip for Microsoft DOS og Windows
bzip2 (buzip2) Dette er også et pakkeprogram som var mye benyttet tidligere. Filer som er komprimert med bzip2, har endelsen .bz2.

Kommandoen gunzip kan benyttes til å dekomprimere en fil som er pakket av gzip. Dette er det samme som å bruke "gzip -d".

[david@nittedal david]$ gunzip Linuxbok

Her pakker jeg ut filen Linuxbok med utpakkingsprogrammet gunzip. Det nye filnavnet blir Linuxbok.

[david@nittedal david]$ zgrep Gnome *.gz

Her får jeg en oversikt over hvilke av mine pakkede tekstfiler som har tekststrengen “Gnome".

[david@nittedal david]$ unzip Linux.zip kap1 kap2

Her pakker jeg ut filene kap1 og kap2 fra arkivet Linux.zip.

Oppgaver til kapittel 13

[rediger]

Oppgave 13.1

Hva er forskjellen mellom verktøyene more og less?

Oppgave 13.2

Lag en alfabetisk liste over alle filene du har på ditt brukerområde.

Oppgave 13.3

Bruk grep-kommandoen til å finne ut om du er definert i /etc/passwd-filen.

Oppgave 13.4

Finn ut hvor mange underkataloger root har. (Tips: ls -F / | grep '/' | wc.)

Oppgave 13.5

Hvilke filer har vært i bruk på ditt arbeidsområde den siste uken? (Tips: find $HOME -name -atime +7 -print.) Plukk ut alle filene som er større enn 750 kB. (Tips: find og -size.) Plukk ut alle filene som tilhører deg. (Tips: find og -user.)

Oppgave 13.6

Hvordan kan du skrive ut alle filene som ligger under /usr-katalogen og heter test.data? Bruk find-kommandoen. (Tips: find /etc -name 'test.data' -exec ls -la {} \;)

Oppgave 13.7

Bruk cut-kommandoen til å klippe ut de brukerne som er definert i /etc/passwd. Navnelisten kan du plassere i en egen tekstfil.

Oppgave 13.8

Bruk cut-kommandoen og paste-kommandoen på /etc/passwd til å lage en liste som består av brukernavn og det tekstbeskrivende feltet i /etc/passwd.

Oppgave 13.9

Jeg har en fil som består av følgende:

ole 123456

nils 565467

anne 435674

petter 233453

kari 221209

Sorter filen ved hjelp av sort slik at den blir alfabetisk. Telefonnummeret skal deretter settes opp som første kolonne. Bruk kommandoene cut og paste.

Oppgave 13.10

Forklar hva følgende kommandoer gjør:

grep id-nummer < navnbase >> resultat

ls /etc | grep hosts | wc -l

find / -name core -print

pr -m -t test1 test2 test3

tr a g < testfil

Oppgave 13.11

Pakk alle filene på din hjemmekatalog. Du kan bruke gzip. Pakk ut filene et annet sted i Linux-strukturen. Gjør det tilsvarende med programmet zip (unzip).