Boken Om Linux/Kapittel 13
13: Linux-verktøy
redigerJeg 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
redigerLinux-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
redigerEt 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
redigerHver 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
redigerNotasjonen +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
redigerMed 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
redigerMed 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 |
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
redigerMed 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
redigerKommandoen 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
redigerKommandoen 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
redigerMed 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
redigerKommandoen 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
redigerI 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
redigerOppgave 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).