User Tools

Site Tools


medium-unix:capitole:capitol-09

9. Utilitate shell scripting

Shell scripting-ul are, în esență, două cazuri de utilizare:

  • Prelucrare de date (tabelare) ASCII: folosind filtre de text, cu accent pe while read, sed și awk.
  • Automatizare de operații prin adăugarea mai multor comenzi într-un script și eventual controlarea fluxului folosind for și if.

Subiecte abordate

  • Scripturi practice
  • Prelucrarea datelor
  • Automatizarea operațiilor

Utilitare folosite

  • convert
  • while read
  • awk
  • join

Resurse utile

  • TODO
  • TODO

Slide-uri

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

Prelucrați output-ul primului fișier pentru a completa într-un fișier informațiile în forma

172.19.7.21    94:57:A5:CE:78:02
172.19.7.31    50:65:F3:1C:F1:1A
[...]

Apoi folosiți comanda join cu argumentele potrivite pentru a uni cele două fișiere după coloana de adresă MAC. Folosiți opțiunile (cu parametri) -1 și -2 ale comenzii join.

Conversie de fișiere imagine

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

Pentru început instalați pachetul imagemagick folosind comanda

sudo apt-get install imagemagick

Î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

Creare copii de lucru pentru fișiere

Folosiți find și cp pentru a crea copii de lucru ale fișierelor de configurare de distribuție din ierarhia horde/ din arhiva capitolului. Fișierele de distribuție au extensia .dist (de exemplu conf.php.dist); o copie de lucru este un fișier fără extensia .dist (de exemplu: conf.php).

Creați un script numit work-copy.sh.

Folosiți find pentru a afișa fișierele cu extensia .dist din ierahia horde/. Folosiți opțiunile -type și -name ale comenzii find.

Folosiți for și expandarea comenzii în conjuncție cu comanda find pentru a parcurge fișierele de mai sus. Adică o construcție de forma

for f in $(find ...); do ... done

Ca să obțineți copia de lucru trebuie să obțineți numele fișierului fără extensia .dist. Pentru aceasta folosiți comanda basename cu opțiunea -s .dist.

Apoi folosițo cp pentru a crea copii de lucru ale fișierelor: sursa este fișierul inițial (cu extensia .dist) iar destinația este fișierul fără extensia .dist.

medium-unix/capitole/capitol-09.txt · Last modified: 2016/05/19 19:22 by razvan