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
ochpaste
. -
Hämta delar av filer med
head
ochtail
. -
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: 2024-08-26