This is an old revision of the document!
Accesați subdirectorul ~/uso-lab/labs/06-scripting/support/
pentru exercițiile de laborator. Sunt și tutoriale (deja făcute / rezolvate) și exerciții. Tutorialele au rolul de a vă acomoda cu diferitele comenzi iar exercițiile sunt parte practică efectivă.
Accesați subdirectorul 02-one-liners/
din directorul laboratorului.
Intrați în subdirectorul indexed-names/
. Dorim să realizăm operații automate în sistemul de fișiere, folosind for
și one linere.
Rulăm cele două comenzi de mai jos:
for i in $(seq -f "%02g" 1 3); do touch test-"$i".txt; done for i in $(seq -f "%02g" 0 12); do mkdir uso-curs-"$i"; done
La sfârșitul rulării acestor comenzi obținem 3 fișiere text (pentru cele 3 lucrări/teste) si 13 directoare, pentru cele 13 directoare. Am folosit for
pentru parcurgerea unei liste și seq
pentru crearea unei liste numerice.
Exercițiu: Realizați un one liner care creează cele 13 directoare și în cadrul fiecărui director creează un subdirector numit slides/
, un fișier numit note.txt
și un fișier numit resurse.txt
.
Intrați în subdirectorul rename/
. Copiați fișierele din subdirectorul src/
în directorul curent:
cp src/* .
Vrem să redenumim toate fișierele cu extensia .c
ca să avem prefixul uso_
în nume. Pentru aceasta folosim one liner-ul:
for i in *.c; do mv "$i" uso_"$i"; done
După această comandă, vor apărea fișiere redenumite.
Apoi ștergeți fișierele nou generate și recopiați-le din directorul src/
:
rm *.c cp src/*.c .
Exercițiu: Realizați un one liner care redenumește toate fișierele cu extensia .c
și adaugă sufixul _uso
în nume. Adică fișierul ptr.c
devine ptr_uso.c
.
Accesați subdirectorul 03-one-liners-vs-commands/
din directorul laboratorului. Vom compara one linere cu comenzi mai simple.
Rulăm următoarele comenzi pentru a genera o parolă de 16 caractere și pentru a afișa PID-urile proceselor utilizatorului student
:
tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2
Aceste acțiuni le putem realiza și folosind comenzi dedicate și opțiunile lor, fără a fi nevoie de trecerea prin operatorul |
(pipe):
pwgen -y 16 1 ps -u student -o pid --no-header
|
(pipe).
Intrați în subdirectorul indexed-names/
. Vrem să realizăm operații similare exercițiului indexed-names/
de la punctul anterior.
Astfel că, putem realiza același lucru precum comenzile de mai jos:
for i in $(seq -f "%02g" 1 3); do touch test-"$i".txt; done for i in $(seq -f "%02g" 0 12); do mkdir uso-curs-"$i"; done
folosind comenzile:
touch $(seq -f "test-%02g.txt" 1 3) mkdir $(seq -f "uso-curs-%02g" 0 12)
Avantajul celui de-al doilea set de comenzi este că vor crea un singur proces (touch
sau mkdir
). Avantajul primului set de comenzi este că putem adăuga mai multe (și mai diferite) comenzi care să fie executate pe fiecare element din bucla for.
Accesați subdirectorul 04-regex/
din directorul laboratorului. Vrem să folosim expresii regulate pentru a prelucra fișierele students.csv
și students.txt
.
Exerciții: Folosiți grep
pentru a extrage, respectiv, din fișierul students.csv
:
315CC
315CC
și care au luat prima notă 9
(din cele 3 coloane)315CC
și care au luat a doua notă care începe cu cifra 7
(din cele 3 coloane)Mai jos sunt rezultatele așteptate pentru cele patru comenzi de mai sus:
$ grep TODO students.csv ȚIFREA C. Alexandru-Nicolae,315CC,7,7,6.25 BOGDAN O.Gh. Ana,315CC,5,4.5,1.89 COSTEA I. Florin Traian,315CC,4,3.5,3.7 OLTEANU Ș. Ionuț-Mihăiță,315CC,7,4.25,4.7 FULGER P. Alexandru-Gabriel,315CC,7,4.25,5 DUȘE-VASILIU V. Andra,315CC,8,7,6.4 CHIȚESCU E. Bogdan-Florentin,315CC,9,7.75,6.89 MAVRODIN I. Andrei,315CC,9,7,6.4 DRĂGOI M. Ovidiu-Alexandru,315CC,8,8,3.44 MANEA A. Mihail-Alin,315CC,7,6.75,6.22 TRACHE M. Ana-Maria,315CC,7,4.75,4.9 IORDACHE M. Tiberiu-Constantin,315CC,8,8.25,4.56 BARBU I. Ștefan,315CC,10,10,7.56 MĂNOIU I. Ioana-Veronica,315CC,10,10,8.6 STOICA I.D. Aurel-Octavian,315CC,7,3.75,5.4 IUȘAN V. Bogdan-Cosmin,315CC,9,7.25,8 BURCEANU D.N. Radu-Gabriel,315CC,8,8.75,7 ASĂVOAEI P. Cătălin,315CC,8,6.75,7 ȘTIRBĂȚ A. Steliana,315CC,10,10,10 $ grep TODO students.csv CHIȚESCU E. Bogdan-Florentin,315CC,9,7.75,6.89 MAVRODIN I. Andrei,315CC,9,7,6.4 IUȘAN V. Bogdan-Cosmin,315CC,9,7.25,8 $ grep TODO students.csv ȚIFREA C. Alexandru-Nicolae,315CC,7,7,6.25 DUȘE-VASILIU V. Andra,315CC,8,7,6.4 CHIȚESCU E. Bogdan-Florentin,315CC,9,7.75,6.89 MAVRODIN I. Andrei,315CC,9,7,6.4 IUȘAN V. Bogdan-Cosmin,315CC,9,7.25,8 $ grep TODO students.csv ȚIFREA C. Alexandru-Nicolae,315CC,7,7,6.25 DUȘE-VASILIU V. Andra,315CC,8,7,6.4 CHIȚESCU E. Bogdan-Florentin,315CC,9,7.75,6.89 MAVRODIN I. Andrei,315CC,9,7,6.4 MANEA A. Mihail-Alin,315CC,7,6.75,6.22
Accesați subdirectorul 05-find/
din directorul laboratorului.
Pentru început vom crea o ierarhie de fișiere pe care să o folosim în continuare folosind comanda:
tar xf etc.tar.gz
În urma rulării acestei comenzi obținem un subdirector etc/
. Folosim comanda find
pentru a parcurge fișiere din ierarhia de fișiere etc/
.
Pentru început rulăm comenzile de mai jos pentru a afișa anumite intrări:
find etc/ find etc/ -type f find etc/ -type f -name 'a*' find etc/ -type f -name 'a*.*'
Exercițiu: Afișați intrările de tip link simbolic din ieraria etc/
. Apoi afișați intrările de tip link simbolic care încep cu litera a
.
Dacă dorim să rulăm anumite informații despre un fișier dat, precum dimensiunea sa, putem folosi comenzi precum cele de mai jos:
find etc/ -type f -exec stat -c "%s" {} \; find etc/ -type f -exec stat -c "%s,%n" {} \; find etc/ -type f -exec stat -c "%s,%n" {} \; | sort -n find etc/ -type f -exec stat -c "%s,%n" {} \; | sort -n | tail -10
Accesați subdirectorul 07-extend-scripts/
din directorul laboratorului.
Intrați în directorul wiki-cat/
. Avem mai multe directoare cu fișiere de tip wiki pe care dorim să le concatenăm.
Ca să obținem un fișier de tip wiki pentru laboratorul 1, folosim comanda:
cat 01-fs/{concepts,demo,recap,basics,need-to-know,nice-to-know,get-a-life,summary}.wiki > 01-fs.wiki
Exercițiu: Creați un script do-all
care generează fișiere de tip wiki pentru toate cele 4 laboratoare din director. Folosiți for
pentru a parcurge toate 4 directoarele.
Intrați în directorul diacritics/
. În directorul in/
avem fișiere care conțin diacritice în format necorespunzător (cedilla below); vrem să fie în format corespunzător (comma below), așa cum sunt în directorul expected/
. Lista completă de diacritice este în fișierul diacritice_ro.txt
.
Dacă doriți să vedeți codul UTF-8 pentru diacritice folosiți comanda:
xxd diacritice_ro.txt
În scriptul solution
aveți comanda sed
pentru a converti diacritica ş
(cedilla below) în diacritice ș
(comma below).
Exercițiu: Extindenți scriptul solution
pentru a converti și celelalte trei diacritice: ţ
, Ş
și Ţ
.
Exercițiu: Creați un script do-all
care convertește toate fișierele din directorul in/
în diacriticele de tip comma below. Folosiți for
pentru a parcurge toate fișierele. Pentru verificare folosiți comanda cmp
și comparați fișierele obținute cu cele din directorul expected/
.
Accesați subdirectorul 08-sample-real-scripts/
din directorul laboratorului. Aici sunt exemple de scripturi pe care le folosim în practică. Parcurgeți scripturile și înțelegeți-le. Acolo unde sunt lucruri neclare, apelați la asistent.
Accesați subdirectorul 09-args/
din directorul laboratorului.
Intrați în directorul timetable/
. Scriptul download
descarcă orarele din anul universitar curent semestrul 1. Rulați scriptul pentru a-l testa:
./download
Va descărca fișierele pentru orar în format .xls
.
Exercițiu: Creați un script numit solution
care primește două argumente: primul este anul universitar, altul este semestrul și descarcă orarele pentru acel an universitar și pentru acel semestru de pe site-ul de orare: http://acs.pub.ro/~cpop/
Rularea fără argumente a scriptului solution
ar trebui să afișeze un mesaj de forma:
$ ./solution Usage: ./solution <academic-year> <semester> Example: ./solution 2017_2018 sem1
Intrați în directorul average/
.
Scriptul compute
calculează media la a doua notă pentru toți studenții din fișierul ../../04-regex/students.csv
:
$ ./compute Average: 6.72
Exercițiu: Creați un script numit solution
care primește ca argument un nume de grupă și calculează media doar pentru aceștia. Un exemplu de rulare este
$ ./solution 314CC Average: 7.56