User Tools

Site Tools


advanced-unix:capitole:capitol-07

7. Scripturi practice

Dorim să dezvoltăm scripturi cât mai practice (desprinse din situații reale).

Subiecte abordate

  • Un script nu este un limbaj de programare. Trebuie să își facă treaba. Nu e nevoie de if și for. Poate fi compus doar din comenzi agregate.
  • Pentru comenzi rapide putem folosi one linere.
  • Dacă lucrurile se complică, e recomandat să folosim altceva (Python, Perl sau altceva).

Resurse utile

Exerciții

Mapare adrese IP și nume de stații

În listing-ul de mai jos aveți un output de rulare nmap:

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)

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):

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

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ă (,):

hostname1,IP_adddress1
hostname2,IP_adddress2
hostname3,IP_adddress3
[...]

Adică să aveți în final ceva de forma:

mihaic-pc,172.19.7.21
cristina-pc,172.19.7.31

Conversie de fișiere imagine

Dorim să realizăm un script care să automatizeze rescalarea dimensiunii unor fișiere imagine.

În arhiva de aici aveți un set de fișiere imagine. Descărcați arhiva și dezarhivați-o folosind comenzile

wget http://koala.cs.pub.ro/shell-scripting/res/arc/media.zip
unzip media.zip

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

convert -resize 50% input.jpg output.jpg

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

convert -resize 50% "$f" "$f.2"

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

echo "$1" | grep <suitable-regex> > /dev/null 2>&1

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.

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

Folosiți construcția while read pentru a parcurge liniile din fișier.

Separatorul este TAB; va trebui să-l definiți cu o linie de forma:

IFS=$'\t'

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 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.txt · Last modified: 2016/05/12 13:26 by razvan