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._
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.
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:
- En fil
a.txt
som innehåller alla godkända på uppgift 1 - En fil
b.txt
som innehåller alla godkända på uppgift 2 - En fil
c.txt
som innehåller namn och epostadress för alla ia.txt
ochb.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
ellerawk
cat
|
>
<
man
för att läsa på om ovanstående
Använd gärna tree
för att se trädstrukturen.
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!
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.