Generell syntaks til kommandoer er kommando options parameter1 parameter2 ... Hver kommando er et program. Kommandoprogrammene kommer gjevnelig i nye versjoner med flere opsjoner. Vær oppmerksom på at bruk av de nyeste opsjonene gjøre scriptet mindre portabelt. Bourne shell har rundt 50 kommandoer. Disse vil ikke bli gjennomgått her med unntak av noe som er meget vanlige i script, men ikke så vanlig for interkative brukere.
Shell intepreteren prøver å tolke første ordet den finner på kommandolinjen som en kommando, med noe noe få unntak. I kapittelet over om "Variabler" så vi at bruk av tilordningstegn kan hindre dette. Det er også mulig å få intepreteren til å begynne lese inn en ny kommanod på et tilfeldig sted på kommandolinjen ved å ved bruk av bakoverlent enkle anførselstegn. Alt som befinner seg mellom to bakoverlent enkle anførselstegn prøver intepreteren å tolke som en ny kommando, eks: echo `date`. I stedet for anførseltegnene er det også mulig å omslutte kommandoene med paranteser prefikset med dollartegn, eks: echo $(date).
Det er mulig å gruppere to kommandoer slik at siste kommando utføres eller ikke med hensyn til om første kommando returnerer exit-status lik 0. Dette hendholdvis følgende syntaks kommando1 && kommando2 og kommando1 || kommando2.
Denne kommandoen er vanlig i if- og while-konstruksjoner i script. Kommandoen setter status-variablen, $?, til 0 om testen er sann eller til 1 om testen feiler. Kommanondoen har to valgfrie og likeverdige syntakser test betingelse og [ betingelse ]. Legge merke til mellomrommet mellom hakeparantesen og betingelsen. Betingelsen gjelder enten filer, tekststrenger eller tall.
Vanlige filbetingelser er.
| [ -d katalognavn ] |
Dette er en katalog |
| [ -f filnavn ] |
Dette er efn fil |
| [ -L linknavn ] |
Dette er en symbolsk link |
| [ -r filnavn ] |
Dette er en lesbar fil |
| [ -s filnavn ] |
Dette er en fil som ikke er tom |
| [ -w filnavn ] |
Dette er en skrivbar fil |
| [ -u filnavn ] |
Dette er en suid fil |
| [ -x filnavn ] |
Dette er en kjørbar fil |
Vanlige tekststrengbetingelser
| [ streng1 = streng2 ] |
Strengene er like |
| [ streng1 = streng2 ] |
Strengene er ulike |
| [ -z streng1 ] |
Streng1 er tom |
| [ -n streng1 ] |
Streng1 er ikke tom |
Vanlige tallbetingelser
| [ tall1 -eq tall2 ] |
Tallene er like |
| [ tall1 -ne tall2 ] |
Tallene er ulike |
| [ tall1 -gt tall2 ] |
tall1 er større enn tall2 |
| [ tall1 -ge tall2 ] |
tall1 er større eller lik tall2 |
| [ tall1 -lt tall2 ] |
tall1 er mindre enn tall2 |
| [ tall1 -le tall2 ] |
tall1 er mindre eller lik tall2 |
Logiske operatorer
| [ betingelse1 -a betingelse2 ] |
Testen er sann om begge betingelsene er sanne |
| [ betingelse1 -o betingelse2 ] |
Testen er sann om en av betingelsene er sann |
Betingelsene kan negeres ved prefiksing med utropstegn.
Kommandoen utfører bl.a. enkle aritmetriske utregninger. Husk at all variabler lagres som tekststrenger. Multiplikasjonentegnet må prefikses med med bakoverlent skråstrek slik at det ikke blir betraktet som listing av innholdet i directory.
| expr tall1 + tall2 |
Summen av tall1 og tall2 |
| expr tall1 - tall2 |
Differansen av tall1 minus tall2 |
| expr tall1 / tall2 |
Kofisienten av tall1 delt med tall2 |
| expr tall1 \* tall2 |
Produktet av tall1 multiplisert med tall2 |
grep (Global Regular Expression Print)
|
Kommandoen skriver ut utvalgte linjer i en fil med hensyn til et regulært utrykk. Generell syntaks til sed-kommandoe er:
grep opsjoner "
regulært utrykk " filnavn
Det regulære utrykket kan erstattes av en streng. De doble anførseltegnene kan byttes ut med enkle anførselstegn. Anførselstegnene kan utelates når utrykket kun innholder et ord. Filnavnet kan innholde vanlig wildchar notasjon slik at grep søker igjennom flere filer samtidig i katalogen. Nedenfor følger liste av vanlig opsjoner
| -c |
Tell (count) antall linjer som matcher |
| -H |
Prefiks (header) linjer som skrives ut med filnavn |
| -h |
Ikke prefiks linjer med filnavn |
| -I |
Overse (ignor) binære filer |
| -i |
Overse (ignor) forskjeller mellom store og små bokstaver |
| -l |
Skriv kun ut filnavn ved søk igjennom flere filer |
| -n |
Nummerer (number) alle linjer som skrives ut |
| -r |
Søker også i underkataloger |
| -s |
Skriv ikke ut feilmeldinger om ikke eksisterende filer |
| -v |
Invers (invert) utskrift, slik ikke matchene linjer skrives ut |
For omtale av regulære utrykk se dokumentasjon av javascript. Til forskjell må klammeparantese for angi repetisjon prefikses med bakoverlent skråstrek for unngå sammenblandig med shell kommandoen for subshell, eks 3 etterfølgende a-tegn blir utrykket: a\{3\}. Videre har tegnklassen andre navn med unntak av \w og \W.
| [[::alnum:]] | Ekvivalent med [a-zA-Z0-9] |
| [[::alpha:]] | Ekvivalent med [a-zA-Z] |
| [[::upper:]] | Ekvivalent med [A-Z] |
| [[::lower:]] | Ekvivalent med [a-z] |
| [[:digit:]] | Ekvivalent med [0-9] |
| [[:space:]] | Ekvivalent med [\t\n\r\f\v] |
Det finnes også to utvidede versjoner av grep: egrep og fgrep.
Eksempel på søk etter linjer som innholder dobbel "a" i filen test.txt. Eventuelt linjer funnet blir prefikset med linjenummer.
|
grep -n "a\{2\}" test.txt
|
Eksempel på søk etter linjer som innholder "abc" eller "def"i filen test.txt.
Sed kan leser en fil (eller standard input stream), utføre vanlig teksteditering og deretter returnere resultatet til standard output stream. Tekstediteringen baserer seg på lokalisering av linjene som skal oppdateres ved bruk av regulært utrykk. Sed endrer aldri innoldet i kildefil. Unnlates navnet på kildefil blir editering utført på standard input stream. Generell syntaks for bruk av sed-kommandoen er:
sed opsjoner 'linjeadresse sedkommando' kildefil
En kan også lage egne sedscript-filer inkluderes på følgende måte i kommandoen
sed opsjoner -f sedscript kildefil
Innholder sedscript på første linje #! /usr/bin/sed -f kan sedscriptet kjøres direkte (må ha kjøre rettigheter). Scriptet kalles som følger
sedcript-navn opsjoner kildefil
Oppgis ikke opsjonen -n vil alle linjer i kildefilen skrives til standard ouput. Ved bruk av flere flere sedkommandoer på kommandolinjen må opsjonen -e benyttes.
Adressering av linjer i kildefilen kan gjøres ved direkte å oppgi linjenummer, benytte regulært utykk eller kombinere dette. Oppgis ikke adresse vil editeringskommandoen blir utført på alle linjer. En kan benytte $ for å angi siste linje i filen. Etter adressen kan legge til ! for å velge ut linjer som ikke matcher adressen.
| x |
x angir linjernummer |
| x,y |
alle linjer fra og linje nummer x til og med y |
| /utrykk/ |
alle linjer som matcher det regulære utrykket |
| /utrykk/utrykk/ |
alle linjer som matcher begge de regulære utrykk |
| /utrykk/,x |
alle linjer fra linjenummer x til første linje som matcher det regulære utrykket |
| x,/utrykk/ |
alle linjer fra første linje som matcher det regulære utrykket til og med linjenummer x |
Her følger kort beskrivelse av vanlige sed-kommandoer der en må adressere enkelt linjer
a\
ny linje 1\
ny linje 2 |
legger til nye tekst etter oppgitte linjer |
i\
ny linje 1\
ny linje 2 |
legger til nye tekst før oppgitt linjer |
| r filnavn |
legge til tekst lest fra annen fil |
Her følger kort beskrivelse av vanlige sed-kommandoer der det også er lovlig å oppgi et adresse område.
| p |
skriver ut linjer |
| = |
skriver ut linjenummer |
| d |
slette linjer |
| s/utrykk/bytte til/opsjon |
bytter ut forekomsten som matcher det regulære utrykket med "bytte til". Opsjonenene er: g p w n. Opsjon g bytter ut alle forekomster som matcher (er default). Forekomsten som er påtruffet kan refereres til med & i "bytte til" teksten. |
| c\ |
bytte ut linjer med ny linje |
| w filnavn |
skriver utvalgte linjer til fil |
| q |
skriver ut alle linjer fram til første adresserte forekomst |
Eksempel på utskift av de 4 første linjen i filen test.txt
Eksempel på å legge til linjenummer for filen test.txt
Eksempel på endring av innhold fra standard input. Her endres "sekk" til "sokk"
|
echo "sekk" | sed "s/o/e/g"
|
Eksempel på innsetting av linjene:
insatt linje 1
insatt linje 2
etter linjer i filen test.txt som innholder ordet "java"
sed '/java/a\
sjekk\
dette' test.txt
|
Eksempel på sletting av linjene som innholder ordet "java" i filen test.txt
Cut kan lese kolonner/felt fra linjer/records fra filer eller standard input stream.
Eksempel: Lese ut tegnene 2 til og med 5, samt tegn 8 fra filen test1.txt og test2.txt
|
cut -c2-5,8 test1.txt test2.txt
|
Eksempel: Sette felt separator til : (kolon) og lese ut felt 2 og 4 samt feltene 7-9 fra filen test.txt
|
cut -d : -f 2,4,7-9 test.txt
|
Tr leser fra standard input og oversetter tegn/ord til angitt tegn/ord.
Eksempel: Endre alle "a" til "b" i filen test.txt
Eksempel: Endre fra små- til store-bokstaver i filen test.txt
|
tr "[a-z]" "[A-Z]" < test.txt
|
Eksempel: Fjerne to eller flere like bokstaver etterhverandre i filen test.txt
|
tr -s "[a-z][A-Z]" < test.txt
|
Eksempel: Fjerne blanke linjer i filen test.txt
|
tr -s "[\012]" < test.txt
|
Vi vil her se nærmere på gawk som er utvidelse av awk. Ved hjelp av dette verktøyet kan en generere rapporter eller gjøre utrekk av data fra filer som innehoder record. Recordene er separert med faste skilletegn. Feltene i recorden kan ha forhåndsdefinert lengde eller fast skilletegn. Gawk lesere inn en og en record fra kildefilen og utfører alle tilhørende gawk-statment på denne recorden før neste record leses inn. Gawk definere et eget script språk med en rekke ferdig definerte funksjoner og variabler. I script språket kan en definere egne variabler og benytte flytkontroll mekanismer som if-tester, for- og while-løkker samt definerere egne funksjoner for styring med hva som skal utføres på hver enkelt record. Gawk bruker ikke minst regulære utrykk for å selektere recorder. Denne beskrivelsen er bare en kort introduksjon og detaljer må leses i annen litteratur.
Tilsvarende sed er det tre måter starte gawk på. Generell syntaks for gawk-kommandoen er:
gawk opsjoner 'gawk-kommandoer' varnavn=verdi kildefil
En kan samle awk-kommandoer i egne script som kan kalles på følgende måte i kommandoen
gawk opsjoner -f gawk-script varnavn=verdi kildefil
Innholder awkscript på første linje #! /bin/gawk -f kan gawkscriptet kjøres direkte (må ha kjøre rettigheter). Scriptet kalles som følger
gawk-scriptnavn opsjoner varnavn=verdi kildefil
Utelates navn på kildefil leser gawk standard input stream. Gawk-kommandoene er omsluttet av enkle anførseltegn på kommandolinjen. Syntaksen til gawk-kommanoder er som følger
gawk-pattern {gawk-statements}
Her kan enten gawk-pattern eller gawk-statments være utelatt. Gawk-statements kan innholde flere gawk-statement som er avskilt med semikolon.
Gawk-pattern
Med gawn-pattern menes
- BEGIN
- END
- /regulært utrykk/
Etter gawk har startet utføres først statments prefikset med BEGIN. Etter gawk er ferdig med å lese alle kildefilen utføres statments prefikset med END. Gawn-statments som ikke prefikset med gawn-utrykk vil bli utført for alle record. Gawk kontrollerer først om recorden matcher gawk-utrykket før tilhørende gawk-statments utføres. Gawk-pattern kan også innholde en logisk sammensetning av to regulære utrykk. Det sammensatte utrykket må omsluttes av vanlige parenteser.
| (/regulært utrykk/ && /regulært utrykk /) |
begge de regulære utrykk må tilfredstilles |
| (/regulært utrykk/ || /regulært utrykk /) |
ett av de regulære utrykk må tilfredstilles |
| (/regulært utrykk1/ ? /regulært utrykk2 / : /regulært utrykk3 /) |
Matcher recorden utrykk 1 benyttes utrykk2 ellers utrykk3 |
| (!/regulært utrykk/ |
sjekker om record ikke matcher utrykket |
Gawk-variabler
Gawk-variabler tilordnes verdi i statments og det benyttes tilsvarende syntaks som for vanlig Bourne-shell-variabler. Til forskjell er det to tre typer gawk-variabler: streng, float og array. For å refere til gawk-variabler benyttes kun variabelnavn (uten prefiks med dollar-tegn som i Bourne-shell). For referanse til elementer i array-variabler benyttes vanlig array-notasjon: arrayNavn[n], der n er indeks i arrayen. Ved innlesning av en record blir verdiene i hvert felt plassert i variablene $1, $2, $3 osv. $0 er referanse til hele recorden.
Gawk har en del standard variabler som bestemmer oppførselen til standard funksjonen.
| ARGC |
Antall argumenter på kommando-linjen |
| ARGV |
Array innholdene argumenter oppgitt på kommando-linjen |
| ENVIRON |
Array innholden environment variabler. F.eks ENVIRON["QUERY_STRING"] |
| FNR |
Antall record lest fra inneværende fil |
| FS |
Felt seperator |
| NF |
Antall felt i innlest record |
| NR |
Antall record lest totalt så langt |
| OFS |
Felt skilletegn i utskriftfil |
| ORS |
Record skilletegn i utskriftfil |
| RS |
Record skilletegn |
| FIELDWITHS |
Ved tilordnig benyttes faste feltlengder til å separerer felt. Tilordnes en kommaseparert liste med tall |
| OFMT |
utskrift format til tall. Default "%.6g" |
| IGNORECASE |
Kontrollere om det skal eller ikke skal skilles mellom store og små bokstaver ved regulære utrykk og tekst operasjoner |
Vanlige opsjoner til gawk-kommandoen er -F og -v. Opsjonen -F sufikses med felt-skilletegnet. Default skilletegn er blank. Opsjon -v etterfølges av varnavn=verdi. Opsjon -v benyttes for å tilordne variabler verdier før gawk starter. Etter oppstart av Gawk programmet utføres først statments prefikset med BEGIN deretter utføres tilordninger til variabler som eventuelt er oppgitt før filnavnene. Filnavnene leses inn i ARGV-arrayen. Deretter starter innlesning av record fra kildefil og utføring av tilhørende statements.
Gawk-statement
Gawk-statement har vanlig variabel-tilordning, if-tester og løkke-konstuksjoner basert på c-syntaks. Klammeparanters har riktignok en annen betydning i gawk-script enn i java og c. Statements i gawk kan grupperes ved hjelp av vanlige paranteser. Gawk har de samme operatorene som i java og c slik som +, -, *, /, %, ++, --, &&, ||, osv. I tillegg har gawn en, ~, tilde-operator for match av regulære utrykk i betingelser. !~ /regulært utrykk/ er sant om det ikke er match. Nedenfor følger opplisting av standard statement og funksjoner i gawk
Gawk kontroll-statement (i beskrivelsen under er "i" et tilfeldig valg variabelnavn).
- if ( betingelse ) statement else statement
- while ( betingelse ) statement
- do statement while (betingelse)
- for ( i=0; i<tall; i++) statement
- for ( i in arraynavn ) statement
- break
- continue
- delete arraynavn [index]
- delete arraynavn
- exit tall
Gawk IO-statement benyttes til utskrift av record. Ulike felt kan skrives ut i ulike formater. Det er i IO-statement for å avslutte innlesning av en fil og forsette innlesning fra en annen fil. Den mest vanlige IO-statment er print somskriver til standard output stream. En kan etter nøkkeordet oppgi en komma-separert liste med de feltverdier som skal skrives ut. Se annen dokumentasjon for ytterligere detaljer.
Gawk tekst-funksjoner
| gsub(r,s) |
Bytter til s for alle forekomster av r i recorden |
| gsub(r,s,t) |
bytte til s for alle forekomster av r i t |
| index(s,t) |
returnere første posisjon av t i s, eller 0 ved ingen forekomster |
| length(s) |
lengden til strengen s |
| tolower(s) |
returnerer en kopi av strengen der alle bokstaver er representert med små bokstaver |
| toupper(s) |
returnerer en kopi av strengen der alle bokstaver er representert med store bokstaver |
| match(s,r) |
tester om s innholder en substring som matcher det regulære utrykket r |
| split(s,a,fs) |
deler opp s i array a der deletegn er fs |
| sprint(fmt,exp) |
skriver ut et exp i henhold til fmt |
| sub(r,s) |
tilsvarende gsub med kun utbytting av første forekomst |
| substr(s,p) |
returnerer resten av s fra og med posisjon p |
| substr(s,p,n) |
returner n tegn av s fra of med posisjon p |
Gawk tall-funksjoner omfatter cos(), sin(), sqrt(), srand(), rand(), log(), exp(), int(), atan(). Funksjonen rand() returnerer et tilfeldig tall
Gawk tids-funkjoner omfatter systime() og strftime(). Funksjonen systime() returnere sekunder etter 1. januar 1970. Funksjonen strftime() kan benyttes til å returnere en formatert dato.
Eval-kommandoen tar en kommando som argument. Først utføres oppgitt kommando som normalt. Deretter betraktes resultatet som en ny kommando som utføres.
Kommandoen benyttes til stoppe utføringen av et script eller prosess å setter verdien til status-variablen. Eks exit 1.Status-variablen, $?, vil ha verdien 1 før neste kommando utføres.
Kommandoen benyttes til å erstatte eksisterende shell med et nytt og alle eksisterende environment-variabler fjernes.
Eksempel: Starte z-shell
Kommandoen leser standard input stream og sender resultatet videre til både standard output og til fil
Eksempel: Eksempel der standard input stream sende til videre til standard output og tilleggsfilen res.txt