Skip to content

Latest commit

 

History

History
218 lines (166 loc) · 6.38 KB

V58.org

File metadata and controls

218 lines (166 loc) · 6.38 KB

V58: Grundläggande terminalkommandon

Att kunna navigera i terminalen är grundläggande som utvecklare. Det är standard att behöva logga in på maskiner på andra sidan jorden och kolla i loggar, starta om tjänster, etc. Drift och utveckling hänger samman, och det är sällan man har fönstersystem att tillgå (och ändå mer sällan som det vore vettigt att använda dem).

_Detta mål kan du inte redovisa vid kursens början. Observera att detta mål skiljer sig genom att det innehåller en uppgift som du skall använda för att redovisa._

Du bör kunna använda följande:

  • man, apropos, whatis
  • cd
  • ls
  • mkdir, rmdir
  • grep
  • find
  • xargs
  • &&
  • &
  • key:C-z, key:C-c och key:C-d (ung. suspend, abort och quit)
  • fg
  • bg
  • cut
  • tr
  • uniq
  • cp
  • omdirigering, pipes och miljövariabler.

Titta också gärna på verktyg som

  • ack
  • tmux
  • awk
  • sed
  • zsh
  • ps
  • top, htop
  • curl
  • ssh, scp
  • shell scripting

TIPS! Om du väntar till projektet med att redovisa detta mål kommer det gå per automatik. Givet förstås att du inte har undvikit terminalen fram till dess…

Filen http://wrigstad.com/ioopm/v58.zip innehåller ett antal kataloger och filer i samma format som jag får era kodprov. Lösningar som funkar med nedanstående exempel kommer nog att funka mot innehållet i v58.zip.

v58.zip ser ut ungefär så här:

(genererad med hjälp av kommandot tree)

.
├── elica842
│   ├── uppgift1
│   │   └── passed.txt
│   └── uppgift2
│       └── missing.txt
└── writo649
    ├── uppgift1
    │   └── passed.txt
    └── uppgift2
        └── fail.txt

I denna struktur finns det en katalog som motsvarar en person, t.ex. writo649, och under denna en katalog för varje uppgift som innehåller de inlämnade filerna, samt resultatet av rättningen. Utifrån exemplet ovan kan vi se att writo649 klarade av uppgift 1 men inte uppgift 2; elica842 klarade av uppgift 1 och för uppgift 2 finns inga uppgifter: den har inte lämnats in (missing.txt). (Det kan finnas andra filer med vilka andra namn som helst, de är utelämnade i exemplet ovan.)

Uppgiften består i att ta fram:

  1. En fil a.txt som innehåller alla godkända på uppgift 1
  2. En fil b.txt som innehåller alla godkända på uppgift 2
  3. En fil c.txt som innehåller namn och epostadress för alla i a.txt och b.txt

Varje uppgift bör lösas med ett kommando i terminalen. Notera att uppgift 3 kan bygga på att filerna a.txt och b.txt redan finns.

Facit från exemplet ovan:

a.txt
elica842
writo649

b.txt
<tom fil>

d.txt
Elias Castegren         elias.castegren@it.uu.se
Tobias Wrigstad         tobias.wrigstad@it.uu.se

(det är inte petnoga med tabbar, etc.)

För att konvertera t.ex. writo649 till ett namn och en epostadress kan du använda kommandot “student” som finns på våra Linux-system: /it/sw/misc/bin/student.

Lämpliga kommandon för denna uppgift är:

  • find
  • xargs
  • grep
  • uniq
  • cut eller awk
  • cat
  • |
  • >
  • <
  • man för att läsa på om ovanstående

Använd gärna tree för att se trädstrukturen.

Ledning

Varje kommando spottar ut radorienterad text. Arbetsflöden skapas genom att kommandon “pipe:as ihop”, kommand1 | kommando2 där all output från kommando1 blir input till kommando2. Diverse hjälpprogram används för att “massera texten” t.ex. om kommando1 listar A,B,C,D,E och vi vill ha C kan vi använda t.ex. cut -d , -f 3 för att säga “tolka detta som fält separerade av , och ta fält 3”.

Ett år stötte vi på en student på kursen som hade blandat ihop ^C och ^Z och som därför hade 50+ instanser av lagerhanteraren igång eftersom han, varje gång han trodde att han slog ihjäl programmet med ^Z, bara hade pausat det.

Det löste vi geschwint så här:

ps aux | grep ~whoami~ | grep ./lagret | cut -b 10-14 | xargs kill
(1)      (2)             (3)             (4)            (5)

Steg (1) tar fram en lista över processer:

root        27002  0.0  0.0 175880 15736 ?        Ss   dec05   0:00 ...
foobar      27005  0.0  0.1 199584 18480 ?        S    dec05   0:00 ...
foobar      27007  0.0  0.1 309656 32528 ?        S    dec05   0:01 ./lagret
root        27110  0.0  0.0   4496   780 ?        S    09:45   0:00 ...
foobar      27111  0.3  0.0  92592 10912 ?        S    09:45   1:41 ...

… som skickas till steg (2) som filtrerar (grep:ar) fram alla rader som matchar resultatet av whoami (foobar ovan). Resultatet:

foobar      27005  0.0  0.1 199584 18480 ?        S    dec05   0:00 ...
foobar      27007  0.0  0.1 309656 32528 ?        S    dec05   0:01 ./lagret
foobar      27111  0.3  0.0  92592 10912 ?        S    09:45   1:41 ...

… som skickas till steg (3) som filtrerar ytterligare:

foobar      27007  0.0  0.1 309656 32528 ?        S    dec05   0:01 ./lagret

… som skickas till steg (4) som tar fram numret på processerna:

27007

… som skickas till steg (5) som för vart och ett av numren som trillar in (i detta fall endast ett) kör “kill <numret>”. Alltså, kommandot ps aux | grep whoami | grep ./lagret | cut -b 10-14 | xargs kill utför slutligen

kill 27007

… vilket i det skarpa läget förra året blev över 50 anrop till kill, och alla lagerprogram stoppades.

Pröva gärna själv, men ersätt kill med echo för att inte slå ihjäl något program!

Om programmet student inte finns/inte fungerar

Skapa en fil student.sh med följande innehåll:

#!/bin/sh
finger $1 | head -n 1 | awk -F: '{ print $3 }' | cut -c 2-

Gör den exekverbar:

chmod a+x student.sh

Gör klart uppgiften men använd student.sh istället för student


Report a bug on this achievement? Please place an issue on GitHub.