This shows you the differences between two versions of the page.
unixmix:capitole:capitol-09 [2013/07/12 13:17] tpopeea [Recapitulare] |
unixmix:capitole:capitol-09 [2014/09/12 08:50] (current) razvan [Recapitulare] |
||
---|---|---|---|
Line 1: | Line 1: | ||
= Shell Scripting 2 = | = Shell Scripting 2 = | ||
+ | [[https://docs.google.com/presentation/d/10B39_rTL7VQe20VewNB0sEK6JZFwBGI0JlF20Pbb-B0/pub?start=false&loop=false&delayms=3000|Slide-uri de prezentare]] | ||
== Exerciții == | == Exerciții == | ||
Line 33: | Line 34: | ||
* Găsiți toate fișierele cu extensia .conf. | * Găsiți toate fișierele cu extensia .conf. | ||
* Găsiți toate fișirele .conf și creați un fișier de backup cu extensia .backup, exemplu ''apache2.conf -> apache2.conf.backup''. | * Găsiți toate fișirele .conf și creați un fișier de backup cu extensia .backup, exemplu ''apache2.conf -> apache2.conf.backup''. | ||
- | <del>* Găsiți toate numele de fișiere, fără calea lor.</del> | ||
* Realizaţi un script numit ''checkfile.sh'' care: | * Realizaţi un script numit ''checkfile.sh'' care: | ||
Line 45: | Line 45: | ||
* Scrieți un script care primește doi parametri, //start// și //count// și afișează un număr de //count// procese începând de la indexul //start//, în ordinea crescătoare a PID-urilor. Hint: ''sort'' | * Scrieți un script care primește doi parametri, //start// și //count// și afișează un număr de //count// procese începând de la indexul //start//, în ordinea crescătoare a PID-urilor. Hint: ''sort'' | ||
- | * Folosind ''sed'' scrieți un script care generează mail-uri în mod automat. | + | * Scrieți un script care generează mail-uri în mod automat. Ca date de intrare, creați un fișier cu structura: |
- | + | ||
- | Ca date de intrare, creați un fișier cu structura: | + | |
<code>nume,email | <code>nume,email | ||
Alex,alex@example.com | Alex,alex@example.com | ||
Line 63: | Line 61: | ||
Ca date de ieșire, scriptul va crea într-un director ''emails'' câte un fișier cu numele //email// personalizat pentru fiecare //nume// din fișierul dat. | Ca date de ieșire, scriptul va crea într-un director ''emails'' câte un fișier cu numele //email// personalizat pentru fiecare //nume// din fișierul dat. | ||
- | * Puteți face același lucru folosind tcsh? Dacă da, cum? Scrieți un alt script care folosește tcsh pentru înlocuiri. | ||
* Scrieți un script care crează copii de siguranță pentru toate fișierele din ''/etc'' sau un folder dat ca parametru, cu extensia ''.conf''. | * Scrieți un script care crează copii de siguranță pentru toate fișierele din ''/etc'' sau un folder dat ca parametru, cu extensia ''.conf''. | ||
Line 72: | Line 69: | ||
== Hands on (3) == | == Hands on (3) == | ||
* Programați ca peste 5 minute să fie creat un fisier ''executat'' în home-ul utilizatorului curent | * Programați ca peste 5 minute să fie creat un fisier ''executat'' în home-ul utilizatorului curent | ||
- | * Configurați ca scriptul de backup de la //Hands on (3)// să ruleze o dată la 10 minute. | + | * Configurați ca scriptul de backup de mai sus să ruleze o dată la 10 minute. |
- | == Exerciții == | ||
- | |||
- | |||
- | # Afișați conținutul pachetelor instalate în sistem al căror nume începe cu litera {{{w}}}. | ||
- | #* Hint: {{{dpkg -l <glob>}}} | ||
- | #* Pași de urmat: | ||
- | #** Folosiți {{{dpkg -l <glob>}}} pentru a lista pachetele dorite. | ||
- | #** Folosiți {{{grep}}} pentru a extrage doar pachetele instalate. | ||
- | #** Folosiți {{{tr}}} și {{{cut}}} pentru a extrage doar numele pachetelor instalate. | ||
- | #** Folosiți {{{dpkg -L}}} și expandarea comenzilor pentru a definitiva exercițiul. | ||
- | # Afișați un șir de forma {{{Last entry: $last_entry; Number of entries: $num_entries}}} unde {{{$last_entry}}} este ultimul director precizat în variabila de mediu {{{PATH}}}, iar {{{$num_entries}}} reprezintă numărul de intrări din acel director. | ||
- | # Realizați un script numit {{{checkpar.sh}}} care primește 2 parametri și îi afișează la ieșire. Dacă nu se dau exact 2 parametri, scriptul acesta afișează mesajul "Numărul de parametri este greșit". | ||
- | #* Hint: $#, http://tldp.org/LDP/abs/html/comparison-ops.html - integer comparison | ||
- | #* Exemplu de output pentru apelul {{{./checkpar.sh a b}}}:<code> | ||
- | a | ||
- | b | ||
- | </code> | ||
- | #* Exemplu de output pentru apelul {{{./checkpar.sh a}}}:<code> | ||
- | Numarul de parametri este gresit | ||
- | </code> | ||
- | # Scrieți și rulați un script numit {{{even.sh}}}. | ||
- | #* Scriptul primește ca argument un număr. | ||
- | #* Scriptul va afișa mesajul par sau impar în funcție de paritatea numărului primit ca argument. | ||
- | #* Scriptul se va întoarce cu eroare (exit 1) și va afișa un mesaj specific dacă se transmite un număr invalid de argumente (nici un argument sau mai mult de un argument). | ||
- | #* Hint: http://tldp.org/LDP/abs/html/arithexp.html, mergeți la exemplul 1 și căutați "modulo". | ||
- | # Realizaţi un script numit {{{checkfile.sh}}} care: | ||
- | #* primește ca argument un string și verifică dacă un fișier cu acest nume există pe disc în directorul curent | ||
- | #* dacă fișierul nu există în directorul curent, acesta va fi creat cu numele dat ca argument | ||
- | #* dacă fisierul există pe disc în directorul curent, acesta va fi redenumit în {{{<nume-fișier-initial>_exista}}} unde argument este argumentul transmis scriptului (numele fișierului) | ||
- | #* Rulați scriptul de 2 ori cu același parametru. | ||
- | #* Hint: http://tldp.org/LDP/abs/html/testconstructs.html și http://tldp.org/LDP/abs/html/fto.html | ||
- | # Realizați un script numit {{{sum.sh}}} care realizează suma primelor N numere naturale, unde N este dat ca parametru. | ||
- | #* Exemplu de output pentru apelul {{{./sum.sh 100}}}:<code> | ||
- | suma primelor 100 de numere naturale este 5050 | ||
- | </code> | ||
- | #* Hint: seq, for, http://tldp.org/LDP/abs/html/extmisc.html | ||
- | # Realizați un script care calculează suma numerelor de la 1 la {{{N}}} multiplu de {{{M}}}. {{{N}}} și {{{M}}} sunt transmise ca argumente în linia de comandă. | ||
- | # Scrieți și rulați un script shell numit {{{ls_boot.sh}}} | ||
- | #* Scriptul va folosi instrucțiuni repetitive pentru a afișa conținutul directorului {{{/boot/}}}. | ||
- | #* Scriptul va afișa pentru fiecare intrare {{{"fisier $nume_fisier"}}} sau {{{"director $nume_director"}}}. | ||
- | #** {{{$nume_fisier}}} reprezintă numele fișierului (în cazul în care intrarea este fișier) | ||
- | #** {{{$nume_director}}} reprezintă numele directorului (în cazul în care intrarea este director); | ||
- | #** sirurile fisier și director vor fi afișate literal. | ||
- | #* Hint: find, for, http://tldp.org/LDP/abs/html/testconstructs.html, http://www.tldp.org/LDP/abs/html/fto.html | ||
- | |||
- | |||
- | == Exerciții (3) == | ||
- | |||
- | == sed == | ||
- | |||
- | **sed** este un **stream editor**. Cel mai bine cunoscut pentru funcția de search and replace. | ||
- | |||
- | <code> | ||
- | sed "s/foo/bar/g" in_file > out_file | ||
- | </code> | ||
- | |||
- | Se poate adăuga parametrul ''-i'' pentru editare "in place" a fișierului: | ||
- | |||
- | <code> | ||
- | sed -i "s/foo/bar/g" in_file | ||
- | </code> | ||
- | |||
- | Înlocuirea se poate face prin expresii regulate: | ||
- | |||
- | <code> | ||
- | sed -i "s/\^first/First/g" file | ||
- | sed -i "s/[0-9]/X/g" file | ||
- | </code> | ||
- | |||
- | |||
- | În general, sintaxa se referă la o adresă (linii selectate) și la o acțiune asupra acelor linii: | ||
- | |||
- | <code> | ||
- | # Pentru fiecare linie din text, dacă este între linia 3 și 4, printeaza-o; ignoră restul liniilor | ||
- | sed –n `3,4p’ foo.txt | ||
- | # Pentru fiecare linie din text, dacă este ultima linie, printeaza-o; ignoră restul liniilor | ||
- | sed –n `$p’ foo.txt | ||
- | |||
- | </code> | ||
- | |||
- | Se pot aplica mai multe acțiuni asupra unui fișier, folosind parametrul ''-e'' la fiecare acțiune: | ||
- | |||
- | <code> | ||
- | # Șterge liniile 4 și 2. | ||
- | sed -e '4d' -e '2d' file | ||
- | </code> | ||
- | |||
- | == awk == | ||
- | |||
- | **awk** este un întreg limbaj de procesare a textului. | ||
- | |||
- | În general, folosește un fișier de script pentru acțiuni, cu sintaxa: | ||
- | |||
- | <code> | ||
- | awk –f awk.script foo.file | ||
- | </code> | ||
- | |||
- | |||
- | Există un bloc de BEGIN, unul de END și corpul scriptului. | ||
- | |||
- | Exemplu de script: | ||
- | |||
- | <code> | ||
- | |||
- | # Begin Processing | ||
- | BEGIN {print "Print Totals"} | ||
- | |||
- | # Body Processing | ||
- | {total = $1 + $2 + $3} | ||
- | {print $1 " + " $2 " + " $3 " = "total} | ||
- | |||
- | # End Processing | ||
- | END {print "End Totals"} | ||
- | |||
- | </code> | ||
- | |||
- | Rezultate: | ||
- | |||
- | <code> | ||
- | |||
- | Input Output | ||
- | 22 78 44 Print Totals | ||
- | 66 31 70 22 +78 +44 =144 | ||
- | 52 30 44 66 +31 +70 =167 | ||
- | 88 31 66 52 +30 +44 =126 | ||
- | 88 +31 +66 =185 | ||
- | End Totals | ||
- | |||
- | </code> | ||
- | |||
- | Fiecar câmp dintr-o linie poate fi folosită ca o variabilă: | ||
- | |||
- | <code> | ||
- | İnput | ||
- | 1 clothing 3141 | ||
- | 1 computers 9161 | ||
- | 1 textbooks 21312 | ||
- | 2 clothing 3252 | ||
- | 2 computers 12321 | ||
- | 2 supplies 2242 | ||
- | 2 textbooks 15462 | ||
- | </code> | ||
- | |||
- | <code> | ||
- | |||
- | awk ‘if ($2 =="computers“){print}'sales.dat | ||
- | |||
- | </code> | ||
- | |||
- | <code> | ||
- | Output | ||
- | 1 computers 9161 | ||
- | 2 computers 2321 | ||
- | </code> | ||
- | = Recapitulare = | + | == Recapitulare == |
- | * Scrieți un script care afișează doar fișierele utilizatorului ''thales'' din diectorul curent. | ||
* Scrieți un script care creează directorul ''numbers'', iar în director creează 100 de fișiere ale căror nume este un număr cuprins între 100 și 199. | * Scrieți un script care creează directorul ''numbers'', iar în director creează 100 de fișiere ale căror nume este un număr cuprins între 100 și 199. | ||
* Scrieți un script care afișează ''inode-ul'' unui fișier primit ca argument. | * Scrieți un script care afișează ''inode-ul'' unui fișier primit ca argument. | ||
* Hint: ''stat''. | * Hint: ''stat''. |