Göm menyn

TDP001 Handhavande av datormiljö

Terminalkommandon v35


Nu är vi redan klara med tredje veckan och därmed är det dags för ett nytt mail om terminalen och dess kommandon.
I detta mail får ni fler uppgifter.

Vi inleder med lite grundläggande tips som gör det lättare att arbeta i terminalen.

TangentAnvänding
TabFyll i automatiskt. Om du börjat skriva något och det endast finns en fil som passar kan terminalen automatiskt fylla i resten av ordet. Trycker du tab två gånger får du en lista över alternativ.
Pil upp/nerbläddra mellan tidigare utförda kommandon
Dagens mail kommer handla om (enkel) textfilshantering. Här kommer en lista på bra kommandon, som vanligt är detta inte en komplett beskrivning av dessa kommandon men efter mailet från första veckan vet du hur du tar reda på det:
kommando Betydelse Beskrivning
cat [fil]... conCATenate Slå ihop innehållet i de givna filerna och skriv ut i terminalen. Om endast en fil anges skrivs dess innehåll ut.
less fil Visa filens innehåll
tail fil Visa de sista raderna i filen
head fil Visa de första raderna i filen
grep text fil Global RegEx Print Skriv ut alla rader i filen som har en viss text (med -E stöds fulla reguljära uttryck)
wc fil Word Count Visa statistik om filen (antal rader, tecken osv)
cut fil Plocka ut kolumner ur filen.
paste fil... Slå ihop filer radvis
diff fil1 fil2 Visa skillnader mellan de två givna filerna

I nedanstående exempel använder vi den givna filen som finns på kurshemsidorna: (http://www.ida.liu.se/~TDP001/2018/material/resultat.txt).

Vi börjar med att visa filens innhåll:

   $ cat resultat.txt
Nu ser vi att varje rad består av ett namn (Förnamn Efternamn) samt tre tal, alla värden separerade med ett eller flera mellanslag.
Med hjälp av cut kan vi skriva ut alla namnen:
    $ cut -d' ' -f1-2 resultat.txt
Vad betyder då detta? cut tar som sagt ut kolumner och -d anger vilket tecken vi använder som avgränsare (delimiter) mellan kolumner. -f väljer vilka kolumner (fields) vi är intresserade av. Detta betyder alltså tag ut de två första kolumnerna som avgränsas med mellanslag (dvs ord). Eftersom mellanslag används för att separera värden som skickas till kommandot (även kallat argument) använder jag apostrofer för att använda mellanslag som avgränsare.

grep går att använda på ett väldigt avancerat sätt (vi behandlar reguljära uttryck senare i kursen), men grundfallet är ganska enkelt.

     $ grep son resultat.txt
Här skriver vi ut alla rader som har texten "son" någonstans i raden.

Pipe

Grundidéen bland de inbyggda kommandona är att varje program ska göra EN sak på ett bra sätt. Ofta vill man dock lösa flera problem och därför finns Pipe. En pipe (tecknet | ) används för att skicka utskriften från ett program som indata till ett annat. De flesta kommandona kan alltså antingen läsa från en fil eller från inmatning.

    $ grep son resultat.txt | head -n1
Detta kommando hämtar alltså först alla rader som innehåller "son". Därefter skickar vi resultatet till head som med argumentet -n1 begränsar utskriften till den första raden. Sammansatt kommer alltså detta skriva ut den första raden som innehåller "son".

(Tips: undersök man-sidorna för grep)

Strömmar och omdirigering

Normalt sett skrivs resultat ut i terminalfönstret (STDOUT, eller standard output). Ibland är det dock trevligt att få resultatet i en textfil. Det kan man göra med omdirigering:
    $ tail resultat.txt > tio_sista.txt
Detta betyder alltså att resultatet av tail kommer skrivas ut på en ny fil med namnet "tio_sista.txt". Normalt sett skrivs eventuellt tidigare innehåll över.
   $ tail resultat.txt >> tio_sista.txt
Istället för att skriva över innehållet lägger >> till resultatet i slutet av filen. Utöver STDOUT finns det även en ström som heter STDERR där felmeddelanden normalt sätt skrivs ut. Denna separeras ifrån STDOUT när man omdirigerar utskrifter så exempelvis kommer följande kommando skriva ut feltexten i terminalen istället för på filen:
   $ python3 -c '1/0' > output
Här kör jag alltså python och ger den koden '1/0'. Detta ger som vi vet en felutskrift och den skrivs ut i terminalen.
  $ python3 -c 'print(4); 1/0' > output 2> errs
Här kör jag python-koden 'print(4); 1/0' och vanlig utskrift hamnar i filen output och fel (ström nummer 2) hamnar i filen errs.
  $ cat output
  4
  $ cat errs
  Traceback (most recent call last):
    File "", line 1, in 
  ZeroDivisionError: division by zero

Glob

För att hitta filer i terminalen kan man såklart använda deras namn. Det blir dock jobbigt efter ett tag, särskilt om det är många filer man vill komma åt och därför har terminalen stöd för glob-mönster. I sitt enklaste fall har vi två symboler att använda oss av, ? och *. Tecknet ? matchar ETT tecken och * betyder noll eller fler tecken.

   $ ls /home/*/Documents/
Ovanstående kommando listar alla filer som finns i Documents-mappen för alla användare på systemet. Det som kan vara bra att veta här är att det är terminalen som utökar glob-tecken. Hela texten vi skrivit in byts alltså ut mot alla filer som matchar mönstret innan kommandot anropas.

Uppgifter

Uppgift 1, 2 och 4 använder filen resultat . Dessa ska precis som föregående uppgift presenteras på er blogg.

  • Uppgift 1: Hur kan man med grep hitta alla rader med namn (förnamn eller efternamn) som slutar med tecknen "on"?
  • Uppgift 2: Skriv ut de fem första efternamnen som inte avslutas med "son"
  • Uppgift 3: I mappen /usr/lib finns det flera filer som har namn på formatet xxx.so.d, där xxx är dess namn och d är ett (eller flera separerade med .) heltal. Skriv ut alla dessa filers namn (dvs xxx-delen) till en fil med valfritt namn.
  • Uppgift 4: Ge ett kommando som (endast) skriver ut hur många rader i filen som har ett namn som har bokstäverna "an" efter varandra. (Bör bli 7)


Sidansvarig: Pontus Haglund
Senast uppdaterad: 2019-05-29