Rørlegging og omdirigering (Pipes and Redirection)

Dette innlegget bygger videre på innlegget Grunnleggende om terminalen i Mac og Linux.

Standard inn og standard ut

De aller fleste programmers prosesser har en standard måte å kommunisere ut og inn på; standard inn og standard ut. Som regel er input’en, standard inn, tastaturet via konsollen – og output’en, standard ut, konsolltekst som vises på skjermen. Man kan imidlertid endre dette, slik at f.eks. output går til en tekstfil i stedet for skjermen. Ettersom de fleste Unix-programmer bruker klartekst i output og input, kan man også bruke f.eks. output som input til en annen prosess. Dette kalles rørlegging (eng.: piping) og gjør at man enkelt kan kombinere simple enkeltprosesser til komplekse sekvenser av operasjoner med flere ulike prosesser.

Eksempel på standard inn med grep

Vanligvis bruker man en fil som argument til grep, f.eks. grep frank navn.txt for å søke etter frank i filen navn.txt. Men, siden de fleste programmer kan bruke standard inn og standard ut som input og output, kan man også i grep bruke tastaturet som input. Ved å enkelt og greit utelate filnavnet i kommandoen, grep frank, vil grep bruke standard inn som input, altså tekst man skriver i konsollen fra tastaturet. I dette tilfellet vil man få en ny linje med markør uten prompt. Dette er grep som venter på data fra standard inn. Skriver man da knut frank johan og trykker enter, er det dette som blir input’en, og grep søker etter “frank” i det vi skrev inn. Den vil så returnere linjen som inneholder “frank”. I dette tilfellet var det bare én linje, og den inneholdt “frank”, så hele linjen “knut frank johan” vil returneres. Grep venter deretter på ny input, så man kan skrive f.eks. “esel-johan” og grep vil søke gjennom input’en etter mønsteret “frank”, ikke finne det, og dermed ikke returnere noe til output.

Når grep mottar input vil den fortsette å gjøre det helt til den finner en spesiell markør, kalt End of File (EOF) som angir slutten på filen. I tilfeller hvor man bruker filer i operativsystemet som input, vil denne markøren dukke opp i slutten av filen. Men når man bruker standard inn, tastaturet, som input, kommer ikke denne markøren automatisk, og grep vil fortsette å motta input i det uendelige. For å simulere EOF kan man trykke Ctrl + d som sier at det var slutten på input’en, og grep vil avsluttes.

Omdirigering

Eksempel på om-/redirigering med grep

På samme måte som man kan bruke tastaturet som standard input i grep, kan man også bruke en fil som input ved å bruke omdirigering. Dette angis med tegnet <: grep dette < filnavn.txt vil bruke filen “filnavn.txt” som standard input i stedet for tastaturet (som er default standard input). Dette ser ganske likt ut som slik man vanligvis bruker grep: grep dette filnavn.txt, men grep kan tilfeldigvis bruke et filnavn som argument, så i sistnevnte tilfellet er “filnavn.txt” et argument og ikke standard input. En del programmer kan, i motsetning til grep, kun motta input via standard inn. Derfor er det greit å kunne redirigere til å bruke en fil som standard input.

Og på samme måte som man kan bruke en fil som standard input, kan man også bruke en fil som standard output. Mange programmer bruker flagget -o hvor man kan definere output’en, men man kan uansett bruke standard output og redirigere output’en til en fil i stedet for konsolltekst på skjermen, som er default. grep dette filnavn.txt > denne.txt vil søke etter “dette” i filen “filnavn.txt”, men i stedet for å vise resultatene i konsollen, redirigere output’en og skrive resultatene til filen “denne.txt”. Ved å bruke ett >-tegn skrives filen over dersom den finnes, dvs. at om det fantes en “denne.txt” fra før vil innholdet nå ha blitt overskrevet av greps output. Ønsker man i stedet å legge til output’en til en fil (uten å slette eksisterende innhold) bruker man to >>-tegn: grep “dette også” filnavn.txt >> denne.txt.

Redirigering av Standard Error

I tillegg til Standard Output har også prosesser enda en output kalt Standard Error. Dette er en outputstrøm som programmer typisk brukes til å kjøre ut feilmeldinger i. Siden dette er en egen strøm uavhengig av standard out, kan den enkelt redirigeres. Ref. det tidligere eksemplet hvor et søk i systemroten ga masse feilmeldinger blant søkeresultatene; her er det greit å kunne filtrere ut feilmeldingene til et annet sted.

Eksempel:

find / -name filnavn 2> error_log.txt. I stedet for å bruke bare >-tegnet, skriver vi 2>. Dette angir at strøm nummer 2, dvs. Standard Error, skal redirigeres til filen error_log.txt.

Strøm nr. 1 – Standard Output – redirigeres ikke, og vil sendes til terminalvinduet som vanlig.

/dev/null

I praksis vil man gjerne ikke spare på disse feilmeldingene i en fil, men bare slippe å se dem. Da kan man bruke spesiell fil, nemlig /dev/null. Denne filen sletter alt som skrives til den, og passer derfor utmerket til å redirigere outputs man ikke har bruk for. Skriver man find / -name filnavn 2> /dev/null redirigeres outputen fra strøm 2, altså feilmeldinger, til filen “/dev/null”, hvor den slettes automatisk, og man slipper mer på det.

Rørlegging (piping)

Vi kan bruke output’en av én prosess, som input til en annen – dette kalles rørlegging. Dette gjøres ved å bruke tegnet | (tegnet heter pipe på engelsk) mellom to prosesser: Kommando A | Kommando B. Det som skjer da, er at standard output fra prosessen til venstre for pipe-tegnet brukes som input for prosessen til høyre.

Man kan rørlegge flere prosesser til en lang kjede av operasjoner med kun én linje: Kommando A | Kommando B | Kommando C | Kommando D.

Eksempel på rørlegging med grep

ps aux | grep bash. Dette vil kjøre programmet ps med valgene aux og liste alle kjørende prosesser. Outputen herfra vil brukes som input for grep som leter etter “bash” i denne inputen.

 

Leave a Reply

Your email address will not be published. Required fields are marked *