This shows you the differences between two versions of the page.
|
uso:laboratoare:new:06-auto:practical [2019/11/05 16:29] razvan.deaconescu [Exerciții] |
uso:laboratoare:new:06-auto:practical [2019/11/07 10:33] (current) adrian.zatreanu [02. One liners] |
||
|---|---|---|---|
| Line 14: | Line 14: | ||
| <code> | <code> | ||
| - | $ xdg-open . | + | xdg-open . |
| - | $ xdg-open http://google.com | + | xdg-open http://google.com |
| - | $ xdg-open ../07-extend-scripts/convert/Orar1CA.xls | + | xdg-open ../07-extend-scripts/convert/Orar1CA.xls |
| </code> | </code> | ||
| Line 47: | Line 47: | ||
| Pentru a converti fișierul ''acl.svg'' în fișierul ''acl.png'' folosim comanda: | Pentru a converti fișierul ''acl.svg'' în fișierul ''acl.png'' folosim comanda: | ||
| <code> | <code> | ||
| - | $ inkscape --export-png=acl.png acl.svg | + | inkscape --export-png=acl.png acl.svg |
| </code> | </code> | ||
| În urma comenzii a apărut fișierul ''acl.png''. Verificăm conversia corectă folosind alias-ul ''go'' creat anterior: | În urma comenzii a apărut fișierul ''acl.png''. Verificăm conversia corectă folosind alias-ul ''go'' creat anterior: | ||
| <code> | <code> | ||
| - | $ go acl.png | + | go acl.png |
| </code> | </code> | ||
| - | Pentru a realiza conversia **tuturor** fișiereleor din directorul curent folosim one liner-ul: | + | Pentru a realiza conversia **tuturor** fișierelor din directorul curent folosim one liner-ul: |
| <code> | <code> | ||
| - | $ for i in *.svg; do inkscape --export-png=$(basename "$i" .svg).png "$i"; done | + | for i in *.svg; do inkscape --export-png=$(basename "$i" .svg).png "$i"; done |
| </code> | </code> | ||
| Line 83: | Line 83: | ||
| Vrem să redenumim toate fișierele cu extensia ''.c'' ca să avem prefixul ''uso_'' în nume. Pentru aceasta folosim one liner-ul: | Vrem să redenumim toate fișierele cu extensia ''.c'' ca să avem prefixul ''uso_'' în nume. Pentru aceasta folosim one liner-ul: | ||
| <code> | <code> | ||
| - | for i in *.c; do mv "$i" uso_"$i".c; done | + | for i in *.c; do mv "$i" uso_"$i"; done |
| </code> | </code> | ||
| După această comandă, vor apărea fișiere redenumite. | După această comandă, vor apărea fișiere redenumite. | ||
| Line 90: | Line 90: | ||
| <code> | <code> | ||
| rm *.c | rm *.c | ||
| - | cp src/*.c | + | cp src/*.c . |
| </code> | </code> | ||
| Line 101: | Line 101: | ||
| Rulăm următoarele comenzi pentru a genera o parolă de 16 caractere și pentru a afișa PID-urile proceselor utilizatorului ''student'': | Rulăm următoarele comenzi pentru a genera o parolă de 16 caractere și pentru a afișa PID-urile proceselor utilizatorului ''student'': | ||
| <code> | <code> | ||
| - | $ tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 | + | tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 |
| - | $ ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2 | + | ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2 |
| </code> | </code> | ||
| Aceste acțiuni le putem realiza și folosind comenzi dedicate și opțiunile lor, fără a fi nevoie de trecerea prin operatorul ''|'' (//pipe//): | Aceste acțiuni le putem realiza și folosind comenzi dedicate și opțiunile lor, fără a fi nevoie de trecerea prin operatorul ''|'' (//pipe//): | ||
| <code> | <code> | ||
| - | $ pwgen -y 16 1 | + | pwgen -y 16 1 |
| - | $ ps -u student -o pid --no-header | + | ps -u student -o pid --no-header |
| </code> | </code> | ||
| Line 183: | Line 183: | ||
| MAVRODIN I. Andrei,315CC,9,7,6.4 | MAVRODIN I. Andrei,315CC,9,7,6.4 | ||
| MANEA A. Mihail-Alin,315CC,7,6.75,6.22 | MANEA A. Mihail-Alin,315CC,7,6.75,6.22 | ||
| - | ASĂVOAEI P. Cătălin,315CC,8,6.75,7 | + | |
| </code> | </code> | ||
| Line 331: | Line 331: | ||
| Accesați subdirectorul ''09-args/'' din directorul laboratorului. | Accesați subdirectorul ''09-args/'' din directorul laboratorului. | ||
| + | |||
| + | === Orar === | ||
| + | |||
| + | Intrați în directorul ''timetable/''. Scriptul ''download'' descarcă orarele din anul universitar curent semestrul 1. Rulați scriptul pentru a-l testa: | ||
| + | <code> | ||
| + | ./download | ||
| + | </code> | ||
| + | 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: | ||
| + | <code> | ||
| + | $ ./solution | ||
| + | Usage: ./solution <academic-year> <semester> | ||
| + | Example: ./solution 2017_2018 sem1 | ||
| + | </code> | ||
| + | |||
| + | === Medie === | ||
| + | |||
| + | 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'': | ||
| + | <code> | ||
| + | $ ./compute | ||
| + | Average: 6.72 | ||
| + | </code> | ||
| + | |||
| + | **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 | ||
| + | <code> | ||
| + | $ ./solution 314CC | ||
| + | Average: 7.56 | ||
| + | </code> | ||
| ==== 10. Înlocuiri de șiruri ==== | ==== 10. Înlocuiri de șiruri ==== | ||
| Accesați subdirectorul ''10-replace/'' din directorul laboratorului. | Accesați subdirectorul ''10-replace/'' din directorul laboratorului. | ||
| + | |||
| + | Fișierul ''template_reader.c'' conține template-ul unui fișier C. În acest fișier construcția ''__TEMPLATE__'' trebuie înlocuită cu un "mesaj secret". Acest mesaj este generat dintr-un șir în care fiecare literă este înlocuită cu valoarea sa ASCII din care scădem valoarea ''0x41'' (în hexazecimal). Pentru a face înlocuirea folosim scriptul ''generate'': | ||
| + | <code> | ||
| + | ./generate | ||
| + | </code> | ||
| + | În urma rulării scriptului ''generate'' a fost creat fișierul ''reader.c'' pornind de la fișierul ''template_reader.c''. Acum putem compila fișierul folosind fișierul ''Makefile'' cu ajutorul comenzii: | ||
| + | <code> | ||
| + | make | ||
| + | </code> | ||
| + | În urma rulării comenzii ''make'' a rezultat executabilul ''reader'' pe care îl putem acum lansa: | ||
| + | <code> | ||
| + | ./reader | ||
| + | </code> | ||
| + | |||
| + | Parcurgeți scriptul ''generate'' și înțelegeți-l. Acolo unde aveți nelămuriri, adresați-vă asistentului. | ||
| ==== 11. Dezvoltare de exerciții cu scripting ==== | ==== 11. Dezvoltare de exerciții cu scripting ==== | ||
| Accesați subdirectorul ''11-practical/'' din directorul laboratorului. | Accesați subdirectorul ''11-practical/'' din directorul laboratorului. | ||
| + | |||
| + | În fiecare dintre cele 3 subdirectoare aveți niște provocări. Fiecare provocare are un fișier ''flag'' care conține un mesaj ascuns. Va trebuie să "descifrați" acel mesaj. Ca să întelegeți cum a fost generat acel mesaj ascuns, vedeți scriptul ''encode''. Scriptul encode este scriptul folosit pentru generarea fișierului ''flag'' pornind de la un mesaj inițial (pe care trebuie să îl aflați). | ||
| + | |||
| + | **Exercițiu**: Alegeți o provocare (sau mai multe) și creați un script ''decode'' care decodifică mesajul ascuns în fișierul ''flag'' și afișează mesajul inițial. | ||
| + | |||
| + | **Exercițiu**: Gândiți-vă voi la o provocare și creați pentru aceasta scriptul ''encode'' și ''decode'' și fișierele auxiliare. | ||
| ==== 12. Shell vs Python ==== | ==== 12. Shell vs Python ==== | ||
| - | Accesați subdirectorul ''12-shell-vs-python/'' din directorul laboratorului. | + | Accesați subdirectorul ''12-shell-vs-python/'' din directorul laboratorului. Vrem să vedem cum se compară scripturi scrise în shell față de scripturi scrise în Python. |
| + | |||
| + | Scriptul ''generate'' este un script shell pe care l-am folosit în secțiunea 10. Scriptul ''generate.py'' are aceeași funcționalitate, dar scris în Python, iar mesajul inițial este citit din fișieru ''in''. | ||
| + | |||
| + | <note important> | ||
| + | În general, pentru acțiuni simple, folosim shell scripting. Pentru prelucrări de date și acțiuni mai complexe, este recomandat să folosim un limbaj de scripting mai puternic, precum Python. | ||
| + | </note> | ||