Göm menyn

Klippa, klistra och omdirigera

En av de starka sidorna hos UNIX är dess förmåga att behandla textfiler på olika sätt. Det finns en lång rad kommandon och tekniker som används bland annat för detta ändamål. Att studera dessa ger en god inblick i filosofin bakom UNIX och i detta steg ska vi därför bland annat visa hur man kan spara utdata från ett program på en fil, hur man kan låta utdata från ett program bli indata till ett annat, samt olika sätt att klippa och klistra i textfiler.

Introduktion till omdirigering

Skalet i Linux hämtar inte indata direkt från tangentbordet och skriver heller inte direkt till skärmen. Istället sker in- och utmatning via två enheter som kallas stdin (standard input) och stdout (standard output). Dessa två enheter är dock normalt kopplade till tangentbordet respektive skärmen, men kan vid behov kopplas någon annan stans. T.ex. kan man låta ett program hämta indata från en fil istället från tangentbordet. Denna teknik kallas omdirigering och är en viktig del av Linux. Tack vare att man på detta sätt kan koppla ihop flera av de många enkla kommandon som finns tillgängliga, kan man lösa flera relativt komplicerade uppgifter. Nedanstående tabell visar en översikt över hur omdirigering går till:

   
kommando > fil Skicka utdata från ett program till en fil
kommando >> fil Skicka utdata från ett program till slutet av en fil
kommando < fil Hämta indata från en fil
kommando1 | kommando2 Låt utdata från ett program bli indata till ett annat

Vi ska nu övergå till att exemplifiera användningen av ovanstående.

Skriv till fil med > eller >>

Genom att skriva kommando > filnamn omdirigerar du utskriften från kommandot till en fil. Om du till exempel vill ha utskriften från kommandot ls sparad i en fil kan du skriva:

ls > katalog.txt

När du använder omdirigering som i exemplet ovan kommer filen katalog.txt att skrivas över om den redan finns. Om du istället vill lägga till utskriften i slutet av filen kan du använda >>. Du kan på detta sätt lägga till filer i slutet på andra filer genom att t.ex. skriva:

cat senaste_resultat.txt >> ackumulerade_resultat.txt

Kommandot cat skriver ut innehållet i filen, men utskriften omdirigeras och hamnar i slutet av filen ackumulerade_resultat.txt.

Kombinera kommandon med |

Om du vill omdirigera utdata från ett kommando till att utgöra indata till ett annat kommando kan du använda det vertikala strecket |. Du kan tänka dig tecknet som ett rör (eng. pipe) som förbinder två kommandon. Istället för att skriva ls -l *.txt kan du t.ex. skriva

ls -l | grep ".txt"

vilket kommer att lista alla rader i utskriften från ls -l som innehåller texten .txt. Man brukar säga att man "pajpar" ls till grep. Kommandot grep letar reda på de rader i en fil som innehåller en viss text och vi ska titta mer på det i nästa steg.

Du kan också kombinera pipe med andra omdirigeringar. Antag t.ex. att du har en fil random_words som består av tusen ord, ett på varje rad. Du vill sortera dessa i alfabetisk ordning och spara dem i filen sorted_words. För sortering kan vi använda kommandot sort så här:

cat random_words | sort > sorted_words

Kommandot cat random_words skickar utdata (dvs innehållet i filen) som indata till kommandot sort. Utdata från sort skickas sedan till filen sorted_words.

I följande avsnitt ska vi introducera några av alla de kommandon som man kan använda för att omdirigera in- och utdata.

Övning Hur kan du med hjälp av omdirigering hitta alla förekomster av båda orden "hej" och "hopp" någonstans på samma rad i en fil? Lösningsförslag

Övning Med hjälp av flaggan -F eller flaggan -p till kommandot ls så markeras alla kataloger på ett särskilt sätt. Hur kan du med hjälp av det du hittills lärt dig skapa en lista över enbart kataloger? Lösningsförslag

Sortering

Linux-kommandon som bearbetar textfiler arbetar oftast med en rad i taget. Kommandot sort används för att sortera raderna i en fil. Som exempel ska vi använda filen resultat1.txt .

Om man inte ger några andra argument till sort än själva filen att sortera sker följande:

	
turte123@li10-3:-$ sort resultat1.txt
Annica Rundgren     17  10  15
Britt Lidell         -  14   9
David Fors           8  12  11
Elisabeth Björklind 15  12  10
Gustaf Karlsson     12  14  13
...
	

Med hjälp av olika flaggor kan man dock få sort att sortera på flera olika sätt. Nedanstående tabell sammanfattar några av de viktigaste flaggorna:

Flagga Betydelse
-r Utför sorteringen baklänges
-k n Sorterar på det n:te fältet på raden
-t c Använder tecknet c som separator mellan fält
-b Ignorerar inledande mellanslag
-n Sorterar numeriska värden

Kommandot sort kan sortera på särskilda delar av raden kallade fält . Fälten separeras normalt av mellanslag och i vår exempelfil är efternamnet alltså det andra fältet. Om fälten separeras av andra tecken kan vi använda flaggan -t för att markera detta. För att sortera vår exempelfil baklänges på efternamn gör vi alltså följande:

	
turte123@li10-3:-$ sort -r -k 2 resultat1.txt
Siv Tidblom         11   9  12
Johanna Rönnberg     9  15  13
Annica Rundgren     17  10  15
Ingrid Lindgren      8  13  13
Britt Lidell         -  14   9
Jerker Leo           -   -  11
...
	

Om vi inte ger sort något filnamn hämtas indata direkt från stdin, vilket innebär att vi lätt kan koppla ihop sort med andra kommandon. Antag att vi vill producera en lista över filerna i en viss katalog i storleksordning. Med kommandot ls -l får vi en detaljerad lista över innehållet i katalogen där filstorleken är det femte fältet på raden. Vi kan då pröva att skicka utdata från ls till sort så här:

	
turte123@li10-3:-$ ls -l | sort -n -k 5
total 350
-rw-r--r--   1 petda123 student      744 aug 17 15:07 notering.txt
-rw-r--r--   1 petda123 student     2541 jun 30 15:09 brev.txt
-rw-r--r--   1 petda123 student     2849 dec 12 15:09 databas.mbd
-rw-r--r--   1 petda123 student   160968 jun 30 15:08 uppsats2.doc
	

Här använder vi -n för att tala om att vi ska sortera som tal och inte i bokstavsordning.

Övning Sortera filen resultat4.txt så att födelsedatumen kommer i stigande ordning. Lösningsförslag

Övning Sortera filen resultat5.txt så att resultaten i den första kolumnen kommer i fallande ordning. Lösningsförslag

Klippa och klistra

I detta avsnitt tar vi upp fyra kommandon som används för att klippa och klistra i textfiler.

Kommandot cut

Med hjälp av kommandot cut kan man klippa ut en eller flera kolumner ur en textfil. Resultatet blir lika många rader, men innehåller bara de fält som specificerats. Vi kan t.ex. klippa ut förnamnen ur filen resultat4.txt så här:

	
turte123@li10-3:-$ cut -f 2 -d : resultat4.txt
Johan
Tommy
Olof
Jesper
...
	

De viktigaste flaggorna till cut sammanfattas i följande tabell:

Flagga Betydelse
-c spec klipper ut de tecken som anges av spec från varje rad
-f spec klipper ut de fält som anges av spec från varje rad
-d c använder tecknet c som separator mellan fälten

Oavsett om vi använder flaggan -c eller -f ser specifikationen likadan ut. Om vi bara vill klippa ut ett enstaka tecken eller fält anger vi ett tal. Om vi vill klippa ut flera tecken eller fält kan vi ange en kommaseparerad lista av tal eller ett intervall med hjälp av bindestreck. I exempelfilen börjar varje rad med ett fält som ser ut att vara personens studentkonto. Vi kan klippa ut siffrorna ur detta genom att ange tecken 6-8 så här:

	
turte123@li10-3:-$ cut -c 6-8 resultat4.txt
101
102
103
104
...
	

Kommandot paste

Motsatsen till kommandot cut är, kanske inte helt oväntat, paste. Med hjälp av paste kan man slå ihop flera filer till en genom att betrakta de individuella filerna som kolumner. Normalt slås kolumnerna ihop med tabb-tecken som separator, men med flaggan -d kan man ange ett eller flera tecken som ska användas som separatorer.

I filerna resultat5.txt och resultat6.txt finns två listor med samma personer. Vi kan slå ihop dessa så här:

	
turte123@li10-3:-$ paste resultat5.txt resultat6.txt
Joanna Johansson     20  36     Joanna Johansson     39  42  24
Patrik Aspebring     26  37     Patrik Aspebring     28  23  33
Timmy Sallnäs        38  29     Timmy Sallnäs        36  41  25
...
	

Vi ser att namnen från de båda listorna stämmer överens. Om vi bara vill ha med namnet en gång kan vi kombinera paste med cut så att vi klipper ut de kolumner av utskrifter som vi är intresserade av:

	
turte123@li10-3:-$ paste resultat5.txt resultat6.txt | cut -c 1-27,48-
Joanna Johansson     20  36  39  42  24
Patrik Aspebring     26  37  28  23  33
Timmy Sallnäs        38  29  36  41  25
...
	

Kommandona head och tail

Kommandona head och tail klipper ut de första respektive sista raderna ur en fil. Man kan använda dessa kommandon för att snabbt titta på början eller slutet på en stor fil, men ibland kan de vara till nytta genom att kombineras med andra kommandon.

För båda kommandona gäller att tio rader klipps ut om inga särskilda argument ges. Om man vill klippa ut ett annat antal använder man flaggan -n där n är ett tal som anger hur många rader som ska klippas ut. För kommandot tail kan man också ange flaggan +n vilket innebär att de sista raderna i filen, från och med rad n, klipps ut.

	
turte123@li10-3:-$ head -2 resultat5.txt
Joanna Johansson     20  36
Patrik Aspebring     26  37
	

Övning Utgå från filen resultat4.txt . Producera en ny lista som består enbart av förnamn och de tre resultatkolumnerna. Lösningsförslag .

Övning Utgå från filen resultat4.txt . Om man sorterar listan i bokstavsordning efter förnamn, vad heter den person i förnamn som då hamnar först? Svara på frågan genom att kombinera kombinera kommandona cut, sort och head på en rad. Lösningsförslag .

Kommandot grep

Med hjälp av kommandot grep kan man söka i en textfil. Kommandot bearbetar textfilen radvis och kontrollerar för varje rad om den sökta texten förekommer. Det normala beteendet för grep är att skriva ut alla rader som matchas, men med hjälp av flaggan -c kan vi få kommandot att enbart räkna förekomster.

Nedanstående exempel räknar hur många rader i filen resultat5.txt som innehåller texten "son".

	
turte123@li10-3:-$ grep -c son resultat5.txt
4
	

Vi kommer att gå igenom fler aspekter av grep i nästa avsnitt.

Sammanfattning

I detta avsnitt har vi gått igenom hur man gör följande saker:

  • Omdirigera med > och >> samt "pajpa" med |.
  • Sortera med sort.
  • Klippa och klistra med cut och paste.
  • Hämta delar av filer med head och tail.
  • Lokalisera eller räkna förekomster av ett ord med grep.


Klippa, klistra och omdirigera

Diagnos

När du har läst detta avsnitt är det dags att göra diagnos D12. Klippa och klistra . Gå till kursrummet i Lisam och klicka på Test i vänstermenyn.

Viktigt Innan du påbörjar diagnosen ska du spara filerna lista3.txt och matrix.txt någonstans på ditt konto. Du kommer att behöva utföra uppgifter med hjälp av dessa filer under diagnosen. Både namn och personnummer i filen är slumpmässigt valda och har ingenting med verkligheten att göra.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2023-08-21