User Tools

Site Tools


Sidebar

school:uso:labs:shell_scripting_2

This is an old revision of the document!


= Laborator shell scripting - partea a 2-a =

Elemente importante

* variabile de mediu * source * globbing * find * expresii regulate * grep * sort, uniq * read * sed * awk

Seturi de task-uri

variabile de mediu, source

Intrați în directorul lab11/ex01/

Tutorial

* Rulați comenzile de mai jos pentru afișarea valorii variabilelor de mediu PATH și HOME:

echo_path_echo_home}

* Rulați comenzile de mai jos pentru inițializarea și afișarea unei variabile (nu folosiți spații înainte sau după caracterul egal (=)):

alfanumeric_echo_my_var}

* Urmăriți conținutul scriptului show_var.sh:

cat_show_var.sh}

* Rulați scriptul:

show_var.sh}

* Doar varibilele de mediu sunt propagate la procesele copil. Folosiți export:

show_var.sh}

Enunț

Creați un script update_path.sh care să actualizeze variabila de mediu PATH cu directorul bin/ din home-ul utilizatorului curent. Rulați scriptul pentru a actualiza valoarea variabilei în shell-ul curent.

Pași ajutători

* Actualizați variabila de mediu PATH cu directorul /opt/bin. Afișați valoarea variabilei. * Creați un script update_path.sh care să actualizeze variabila de mediu PATH cu directorul bin/ din home-ul utilizatorului curent. Folosiți export pentru exportarea variabilei. * Rulați scriptul și afișați valoarea variabilei PATH. De ce nu se modifică valoarea? * Folosiți source pentru a rula scriptul. Afișați valoarea variabilei PATH.

find, globbing

* Intrați în directorul lab11/ex02/.

Tutorial

* Comanda 'find' afișează ierahia unui director. Dacă directorul lipsește se consideră implicit directorul curent (.). Rulați comanda de mai jos pentru a afișa intrările din ierarhia curentă (.):

find_._find}

* Rulați comanda de mai jos pentru a afișa fișierele din ierahia curentă:

find_-type_f}

* Caracterul star (*) este folosit pentru a reprezenta orice șir de caractere (de la caracterul vid până la șirul infinit). Rulați comanda de mai jos pentru a afișa fișierele cu extensia .conf din /etc/.

conf}

Enunț

* Folosiți find pentru a identifica fișierele cu drept de execuție care nu au extensia .sh aflate în subdirectoarele directorului lab11/ex02.

Pași ajutători

* Folosiți find pentru a afișa ierarhia din subdirectoare. (Hint: -mindepth) * Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare cu extensia .sh. (Hint: -name, -type) * Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare care nu au extensia .sh. (Hint: OPERATORS în pagina de manual) * Folosiți find pentru a afișa fișierele din ierarhia din subdirectoare cu drept de execuție care nu au extensia .sh. (Hint: -perm)

find, shell expansion

* Intrați în directorul lab11/ex03/.

Tutorial

* Construcția ${parameter%word} (descrisă și aici) permite eliminarea din variabila descrisă de parameter a porțiunii finale descrisă de șirul word. Rulați exemplele de mai jos:

var_ana_are_mere_echo_var_mere_var_a.c.bak_echo_var_.bak_var_nebuchadnezzar_echo_var_d}

Enunț

* Folosiți find și cp pentru a crea copii de lucru ale fișierelor de configurare de distribuție din ierarhia lab11/ex03/horde. 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).

Pași ajutători

* Folosiți find pentru a afișa fișierele cu extensia .dist din ierahia lab11/ex03/horde. (Hint: -type, -name) * Folosiți for, find și ls -l pentru a afișa informații complete despre fișierele de mai sus. * Inițializați variabila MY_FILE la valoarea conf.php.dist. Folosiți echo și construcția ${parameter%word} pentru a afișa valoarea variabilei MY_FILE fără extensia .dist. * Folosiți for, find și cp pentru a crea copii de lucru ale fișierelor de mai sus.

read

* Intrați în directorul lab11/ex04/.

Tutorial

* Comenzile head și tail permit, respectiv, eliminarea ultimelor linii și a primelor linii dintr-un fișier. Rulați comenzile de mai jos:

head_-n_-1_numbers.txt_tail_-n_2_numbers.txt_head_-n_-3_numbers.txt_tail_-n_2_numbers.txt}

* Comanda read permite parsarea unui șir primit la intrare folosind spații albe ca separator implicit:

(read v1 v2 v3 v4; echo "$v1 # $v2 # $v3 # $v4") echo "alfa beta gamma delta" | (read v1 v2; echo "$v1 # $v2") }

* În general, read este folosit împreună cu while pentru a citi un întreg fișier.

while read num string; do echo "$string ## $num"; done }

Enunț

Pornind de la catalogul din fișierul catalog.csv, creați scriptul select_7.sh care să afișeze numele și grupa celor care au nota mai mare sau egală cu 7.

Pași ajutători

* Creați scriptul select_7.sh și folosiți tail pentru a afișa toate liniile mai puțin prima linie (linia de antet). (Hint: -n +N) * Actualizați în cadrul scriptului variabila IFS pentru ca read să folosească pe post de separator caracterul virgulă (,). (Hint: detalii aici sau în pagina de manual a Bash - căutare după “Word splitting”) * Folosiți tail, while și read pentru a afișa doar numele și grupa studenților din fișierul catalog.txt, separate prin caracterul două puncte (:). * Folosiți if pentru a selecta studenții care au nota mai mare sau egală cu 7.

grep, here document

* Intrați în directorul lab11/ex05/.

Tutorial

* Comanda grep este folosită pentru a selecta liniile ce conțin un anumit șablon (expresie regulată):

grep_ana_names.txt_grep_a._a_names.txt}

* Argumentul -v (revert selection) va selecta liniile ce nu conțin un anumit șablon:

grep_-v_an_names.txt}

Enunț

Creați un script ssl_update.sh care să adauge opțiunea de redirectare HTTPS în cadrul unui fișier de tip vhost pentru Apache. Adăugați opțiunea de mai jos la sfârșitul directivei <VirtualHost> din cadrul fișierului vhost.conf:

ifmodule}

Pași ajutători

* Creați scriptul ssl_update.sh. * Folosiți grep pentru a afișa toate liniile mai puțin linia de încheiere a directivei vhost (</VirtualHost>) (Hint: -v). Stocați rezultatul în fișierul vhost_new.conf. * Folosiți un here document pentru a adăuga setul de directive de mai sus la sfârșitul fișierului vhost_new.conf. * Completați here document-ul pentru a adăuga inclusiv forma de încheiere a directivei (</VirtualHost>).

variabile, source, sed

* Intrați în directorul lab11/ex06/.

Tutorial

* Comanda mail permite transmiterea unui e-mail. În mod obișnuit se specifică subiectul și destinatarul. Comanda de mai jos trimite mesajul “Say hello to my little friend” cu subiectul “Hello” utilizatorului student:

mail -s "Hello" student }

* Utilitarul sed (stream editor) permite efectuarea a diverse operații pe un fișier la nivel de linie. În mod uzual este folosit pentru a substitui un șablon (expresie regulată) cu un șir:

g_names.txt}

* Pentru a concatena mai multe prelucrări sed folosiți -e:

g_names.txt}

Enunț

* Creați scriptul my_send_mail.sh care trimite un e-mail cu un mesaj personalizat pornind de la un template-ul mail_template.txt și fișierul de configurare config. Fișierul de configurare specifică variabilele folosite de script: SUBJECT - subiectul mesajul; DEST_ADDRESS - destinatarul; celelalte variabile reprezintă informații de substituit în template. ==== Pași ajutători ==== * Creați scriptul my_send_mail.sh în cadrul căruia afișați valoarea variabilei SUBJECT din fișierul config. (Hint: folosiți source) * Folosiți sed pentru a substitui șirul dest_name} din mail_template.txt cu Daniel. * Folosiți sed pentru a substitui șirul dest_name} din mail_template.txt cu valoarea variabilei DEST_NAME din fișierul config. * Completați scriptul my_send_mail.sh pentru a trimite un e-mail cu un mesaj personalizat pornind de la un template-ul mail_template.txt și fișierul de configurare config. === grep, sed === * Intrați în directorul lab11/ex07/. ==== Tutorial ==== * Utilitarul grep folosește un șablon (expresie regulată) pentru selectarea liniilor. Caracterele căciulă (^) și dolar ($) se potrivesc, respectiv, cu începutul și sfârșitul unei linii: grep_ana_nonsense.txt_grep_ana_nonsense.txt_grep_ana_nonsense.txt} * Argumentul -i al utilitarului sed permite modificarea “in place” a unui fișier: g_nonsense.txt.old_ls_nonsense.txt} * În cadrul utilitarului sed, construcția \1 permite “recuperarea” unui subșir de înlocuit în cadrul șirului care înlocuiește: g_nonsense.txt.old.bak} ==== Enunț ==== * Fișierul svn.passwd conține linii de forma username: password folosite pentru autentificare în Subversion. Creați scriptul update_svn_passwd.sh care actualizează fișierul cu parole: scriptul primește două argumente: numele de utilizator (username) și parola (password); dacă numele de utilizator există se actualizează (substituie) parola; dacă numele de utilizator nu există se adaugă parola.

Pași ajutători

* Creați scriptul update_svn_passwd.sh care primește doi parametri și îi afișează. * Folosiți grep pentru a extrage din fișierul svn.passwd linia asociată numelui de utilizator primit ca prim argument. ((Hint: ^, $1) * Afișați yes sau no după cum numele de utilizator primit ca prim argument se gasește în fișierul svn.passwd. (Hint: $?) * În cazul în care numele de utilizator primit ca argument nu se găsește în fișierul svn.passwd adăugați linia $username: $password la sfârșitul fișierului. ($username este primul argument, iar $password este al doilea argument) (Hint: echo, ») * În cazul în care numele de utilizator primit ca argument se găsește în fișierul svn.passwd, actualizați linia asociată. (Hint: sed, \1, -i)

grep, expresii regulate

* Intrați în directorul lab11/ex08/.

Tutorial

* Expresiile regulate utilizate de grep folosesc caractere care au rol special (^, $, *, +, .). Pentru a putea fi folosite cu rol de caracter ASCII se citează folosind backslash (\):

grep "run^for" echo -e "run^for^it \n runforit" | grep "run\^for" }

* grep selectează linii care conțin un șir descris printr-o expresie regulată. Pentru a extrage un cuvânt se folosește -w sau construcția \< .. \>:

grep "ana" echo "anaconda \n ana are mere \n roxana" | grep -w "ana" echo "anaconda \n ana are mere \n roxana" | grep "\<ana\>" }

Enunț

Folosiți grep pentru a elimina alias-urile cu destinația de forma nume.prenume@gmail.com din fișierul aliases. Intrările din fișierul aliases se consideră de forma alias: destinație.

Pași ajutători

* Folosiți grep pentru a elimina liniile ce conțin șirul gmail. (Hint: -v) * Folosiți grep pentru a elimina liniile ce conțin șirul gmail.com. (Hint: folosiți \ pentru citare) * Folosiți grep pentru a elimina liniile ce conțin cuvântul gmail.com. (Hint: \< și \>) * Folosiți grep pentru a elimina liniile ce conțin cuvântul gmail.com în destinație. * Folosiți grep pentru a elimina liniile ce conțin șirul-cuvânt nume.prenume@gmail.com în destinație.

grep, awk, sort, uniq

* Dificultate sporită * Intrați în directorul lab11/ex09/.

Tutorial

* Utilitarul awk' permite manipulări avansate ale unui fișier la nivel de linie. Sintaxa este similară cu cea a limbajului C. Poate fi folosit ca o versiune avansată a comenzilor read și cut (pentru parsarea intrării). Argumentul -F permite precizarea separatorului:

awk -F '[ \t]+' "{ print "prenume:", $1, "nume:", $2; }" cat /etc/passwd | awk -F ':' "{ print "nume: $1", "home:", $6; }" }

* Utilitarul sort sortează liniile de la intrare. Este folosit de obicei în conjuncție cu uniq:

sort cat lista2.txt | sort | uniq }

Enunț

* Fișierul mail.txt conține mesaje trimise de un utilizator. Creați un script dest_sort.sh care sortează mesajele trimise de un utilizator după destinatari; se vor afișa adresa de e-mail a destinatarului și numărul de mesaje transmise de acesta.

Pași ajutători

* Creați scriptul dest_sort.sh și folosiți grep pentru a extrage din fișierul mail.txt liniile care specifică destinatarul (liniile care încep cu To:). * Folosiți înlănțuirea comenzilor (|) și awk pentru a extrage doar adresa de e-mail a destinatarului. * Folosiți înlănțuirea comenzilor (|) și sort pentru a sorta adresele de e-mail ale destinatarilor. * Folosiți înlănțuirea comenzilor (|) și uniq pentru a “uniciza” adresele de e-mail ale destinatarilor cu afișarea numărului de apariții ale acestora. (Hint: -c) * Folosiți înlănțuirea comenzilor (|) și sort pentru a sorta adreselele de e-mail după numărul de apariții ale acestora .(Hint: -r, -n)

grep, awk, sort, uniq

* Dificultate sporită * Intrați în directorul lab11/ex10/.

Enunț

* Fișierul mail.txt conține mesaje trimise de un utilizator. Creați un script dest_sort.sh care script care sortează mesajele trimise de un utilizator în funcție de data la care au fost transmise; se vor afișa data de transmitere a mesajului și numărul de mesaje transmise la acea dată.

Pași ajutători

* Creați scriptul date_sort.sh și folosiți grep pentru a extrage din fișierul mail.txt liniile care specifică data (liniile care încep cu Date:). * Folosiți înlănțuirea comenzilor (|) și awk pentru a extrage doar data de transmitere a mesajului. * Folosiți înlănțuirea comenzilor (|) și sort pentru a sorta datele mesajelor. * Folosiți înlănțuirea comenzilor (|) și uniq pentru a “uniciza” datele mesajelor cu afișarea numărului de apariții ale acestora (Hint: -c) * Folosiți înlănțuirea comenzilor (|) și sort pentru a sorta datele mesajelor după numărul de apariții ale acestora (Hint: -r, -n)

Idei pentru shell scripting 1

* script care copiază un set de fișire în home-ul unor utilizatori primiți ca argument pe sistemul local și schimbă owner-ul acestora * adăugarea unei chei publice pe un sistem la distanță într-un one liner * script care copiază un fișier pe mai multe sisteme din rețeaua locală (poate integrat cu mdns)

Extra

* copierea unei ierarhii (doar fișierele cu extensia .php.dist împreună cu directoarele asociate) * gestiunea unei adrese electronice (address book)

school/uso/labs/shell_scripting_2.1249829497.txt.gz · Last modified: 2009/08/09 17:51 by razvan