User Tools

Site Tools


advanced-unix:capitole:capitol-07

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
advanced-unix:capitole:capitol-07 [2016/05/12 09:01]
razvan
advanced-unix:capitole:capitol-07 [2016/05/12 13:26] (current)
razvan [Parsare fișier de participanți]
Line 8: Line 8:
   * Pentru comenzi rapide putem folosi one linere.   * Pentru comenzi rapide putem folosi one linere.
   * Dacă lucrurile se complică, e recomandat să folosim altceva (Python, Perl sau altceva).   * Dacă lucrurile se complică, e recomandat să folosim altceva (Python, Perl sau altceva).
- +
 ===== Resurse utile ===== ===== Resurse utile =====
  
 ===== Exerciții ===== ===== Exerciții =====
  
 +==== Mapare adrese IP și nume de stații ====
 +
 +În listing-ul de mai jos aveți un output de rulare ''​nmap'':​
 +
 +<​code>​
 +Nmap scan report for 172.19.7.21
 +Host is up (0.0025s latency).
 +MAC Address: 94:​57:​A5:​CE:​78:​02 (Hewlett Packard)
 +Nmap scan report for 172.19.7.31
 +Host is up (-0.099s latency).
 +MAC Address: 50:​65:​F3:​1C:​F1:​1A (Hewlett Packard)
 +Nmap scan report for 172.19.7.52
 +Host is up (0.063s latency).
 +MAC Address: 50:​65:​F3:​36:​B2:​9E (Hewlett Packard)
 +Nmap scan report for 172.19.7.62
 +Host is up (0.0020s latency).
 +MAC Address: AC:​87:​A3:​07:​43:​31 (Apple)
 +Nmap scan report for 172.19.7.70
 +Host is up (-0.098s latency).
 +MAC Address: 50:​65:​F3:​26:​95:​FC (Hewlett Packard)
 +Nmap scan report for 172.19.7.250
 +Host is up (-0.099s latency).
 +MAC Address: 00:​50:​56:​B7:​5E:​3C (VMware)
 +Nmap scan report for 172.19.7.254
 +Host is up (0.0011s latency).
 +MAC Address: 00:​50:​56:​B7:​3A:​82 (VMware)
 +</​code>​
 +
 +Acest listing face asociere între adrese MAC și adrese IP curente.
 +
 +Mai jos este o asociere între adrese MAC și nume de stații, folosind ca separator TAB (folosiți construcția ''​%%'​$\t'​%%''​ pentru filtre de text):
 +
 +<​code>​
 +94:​57:​A5:​CE:​78:​02 mihaic-pc
 +50:​65:​F3:​1C:​F1:​1A cristina-pc
 +50:​65:​F3:​36:​B2:​9E lucian-pc
 +AC:​87:​A3:​07:​43:​31 macmini
 +50:​65:​F3:​26:​95:​FC debian-708
 +00:​50:​56:​B7:​5E:​3C flavius-pc
 +00:​50:​56:​B7:​3A:​82 mihait-pc
 +</​code>​
 +
 +Rulați cât mai puține comenzi pentru a obține o asociere între nume de stații și adrese IP curente în forma de mai jos, folosind ca separator virgulă ('',''​):​
 +
 +<​code>​
 +hostname1,​IP_adddress1
 +hostname2,​IP_adddress2
 +hostname3,​IP_adddress3
 +[...]
 +</​code>​
 +
 +Adică să aveți în final ceva de forma:
 +<​code>​
 +mihaic-pc,​172.19.7.21
 +cristina-pc,​172.19.7.31
 +</​code>​
 +
 +==== Conversie de fișiere imagine ====
 +
 +Dorim să realizăm un script care să automatizeze rescalarea dimensiunii unor fișiere imagine.
 +
 +În arhiva de [[http://​koala.cs.pub.ro/​shell-scripting/​res/​arc/​media.zip|aici]] aveți un set de fișiere imagine. Descărcați arhiva și dezarhivați-o folosind comenzile<​code bash>
 +wget http://​koala.cs.pub.ro/​shell-scripting/​res/​arc/​media.zip
 +unzip media.zip
 +</​code>​
 +
 +Dorim să scalăm dimensiunea acestor fișiere. Pe un fișier oarecare folosiți comanda ''​convert''​ pentru a-i schimba dimensiunea. De exemplu, comanda<​code bash>
 +convert -resize 50% input.jpg output.jpg
 +</​code>​ convertește fișierul ''​input.jpg''​ în fișierul ''​output.jpg''​.
 +
 +Dorim să convertim fișierele din directorul ''​media/''​. Vrem ca numele noului fișier să se încheie cu ''​.2''​. Astfel, dacă în variabila ''​f''​ avem numele fișierul inițial, comanda de conversie va fi<code bash>
 +convert -resize 50% "​$f"​ "​$f.2"​
 +</​code>​
 +
 +Realizați un script numit ''​convert-scale-images''​ care să convertească toate fișierele din directorul ''​media/''​ în fișiere noi care să se încheie cu ''​.2''​. Folosiți ''​%%for f in * ...%%''​ pentru parcurgerea fișierelor.
 +
 +Actualizați scriptul pentru a primi un parametru care indică scalarea conversiei. Adică dacă parametrul este ''​25%''​ atunci se scalează imaginea la ''​25%''​. Să fie afișat mesaj de
 +
 +Actualizați scriptul pentru a primi ca argument directorul de intrare (în care se găsesc fișierele) și directorul de ieșire (în care se vor găsi fișierele convertite). Dacă directorul de ieșire nu există va fi creat.
 +
 +Actualizați scriptul să afișeze mesaje de eroare dacă directorul de intrare nu există.
 +
 +**Bonus**: Actualizați scriptul ca să valideze dacă argumentul de scalare este în forma ''​XY%''​ unde ''​X''​ și ''​Y''​ sunt cifre. Puteți folosi pentru validare o construcție de forma<​code bash>
 +echo "​$1"​ | grep <​suitable-regex>​ > /dev/null 2>&1
 +</​code>​
 +
 +==== Parsare fișier de participanți ====
 +
 +Urmăriți conținutul fișierului de mai jos ''​participanti.txt''​. Creați un script denumit ''​get-participants.sh''​ care să selecteze participanți la cel puțin patru training-uri.
 +
 +<file participanti.txt>​
 +Nume C Java Pyhon Unix shell adv-shell
 +Andronescu Alin da nu da da nu da
 +Bogdanescu Bianca da nu da da da nu
 +Cirmaciu Calin nu nu da da da da
 +Dobrescu Diana da da da da da nu
 +Enescu Eugen nu da da da nu da
 +Florea Felicia nu da da da da nu
 +Ghita Gabriel nu nu nu da nu nu
 +Homescu Horia nu nu da da da nu
 +Ichim Ioana da nu da da nu nu
 +Janca Jeanina da nu da da da da
 +Lupu Lucian da nu da da nu nu
 +Marin Monica da nu da da nu nu
 +</​file>​
 +
 +Folosiți construcția ''​while read''​ pentru a parcurge liniile din fișier.
 +
 +<note tip>
 +Separatorul este TAB; va trebui să-l definiți cu o linie de forma:<​code bash>
 +IFS=$'​\t'​
 +</​code>​
 +</​note>​
 +
 +Recomandăm sa parcurgeți pașii de mai jos:
 +
 +Citiți cele 7 coloane din fișierul de intrare.
 +
 +Folosiți ''​if test''​ pentru a verifica cele 6 coloane pentru training-uri și incrementați o variabilă ''​count''​ pentru fiecare training la care a participat.
 +
 +Când faceți parcurgerea,​ ignorați prima linie (cea cu antetul).
 +
 +Afișați numele participanților pentru care valoarea variabilei ''​count''​ este mai mare decât ''​3''​. Afișați în paranteză, pe aceeași linie, și numărul de training-uri la care a participat, adică valoarea variabilei ''​count''​ (ca să fie validată afișarea).
 +
 +==== Calcul medie folosind awk ====
 +
 +Accesați directorul din arhiva de [[http://​titan.cs.pub.ro/​~razvan/​training/​compute-average.zip|aici]]. Urmăriți scriptul ''​remove-duplicates.awk''​ și sintaxa acestuia. Ce rol are acest script?
 +
 +Urmăriți fișierul ''​init.log''​. În majoritatea cazurilor apar de două ori (pe două linii) perechi de forma //​timestamp,​ IP address//.
 +
 +Creați un script denumite ''​replace-with-average.awk''​ în care înlocuiți două linii de forma de mai sus cu o singură linie a cărei a treia coloană să fie media valorilor inițiale. Inspirați-vă din scriptul ''​remove-duplicates.awk''​. Recomandăm să copiați conținutul în noul script și să-l editați.
advanced-unix/capitole/capitol-07.1463032898.txt.gz · Last modified: 2016/05/12 09:01 by razvan