User Tools

Site Tools


school:uso:labs:shell_scripting_2

Differences

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

Link to this comparison view

school:uso:labs:shell_scripting_2 [2009/08/09 19:23]
razvan
school:uso:labs:shell_scripting_2 [2020/07/20 09:16]
Line 1: Line 1:
-= 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 (''='')): 
- 
-{{{ 
-MY_VAR=$HOME/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'': 
- 
-{{{ 
-export MY_VAR 
-./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/''. 
- 
-{{{ 
-ls /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 [[http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html|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: 
- 
-{{{ 
-echo "a b c d" | (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. 
- 
-{{{ 
-cat numbers.txt | 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 [[http://www.faqs.org/docs/bashman/bashref_33.html|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 mod_rewrite.c> 
-  <IfModule mod_ssl.c> 
-    <Location /secureapp> 
-      RewriteEngine on 
-      RewriteCond %{HTTPS} !^on$ [NC] 
-      RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L] 
-    </Location> 
-  </IfModule> 
-</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 [[http://www.faqs.org/docs/bashman/bashref_42.html|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'': 
- 
-{{{ 
-echo "Say hello to my little friend" | 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: 
- 
-{{{ 
-sed "s/ana/bogdan/g" names.txt 
-}}} 
- 
-* Pentru a concatena mai multe prelucrări ''sed'' folosiți ''-e'': 
- 
-{{{ 
-sed -e "s/ana/bogdan/g" -e "s/an/nono/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: 
- 
-{{{ 
-cp nonsense.txt nonsense.txt.old 
-sed -i "s/ana/bogdan/g" nonsense.txt 
-sed -i.bak "s/ana/bogdan/g" nonsense.txt.old 
-ls nonsense.txt* 
-}}} 
- 
-==== Enunț ==== 
- 
-* Fișierul ''svn.passwd'' conține linii de forma ''username: password'' folosite pentru autentificare în [[http://subversion.tigris.org/|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 (''\''): 
- 
-{{{ 
-echo -e "run*for*it \n runforit" | 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 ''\< .. \>'': 
- 
-{{{ 
-echo -e "anaconda \n ana are mere \n roxana" | grep "ana" 
-echo -e "anaconda \n ana are mere \n roxana" | grep -w "ana" 
-echo -e "anaconda \n ana are mere \n roxana" | grep "\<ana\>" 
-}}} 
- 
-==== Enunț ==== 
- 
-Folosiți ''grep'' pentru a selecta 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 selecta liniile ce conțin șirul ''gmail''. 
-* Folosiți ''grep'' pentru a selecta liniile ce conțin șirul ''gmail.com''. (Hint: folosiți ''\'' pentru citare) 
-* Folosiți ''grep'' pentru a selecta liniile ce conțin cuvântul ''gmail.com''. (Hint: ''\<'' și ''\>'') 
-* Folosiți ''grep'' pentru a selecta liniile ce conțin cuvântul ''gmail.com'' în destinație. (Hint: dacă folosiți ''+'' acesta trebuie citat cu ''\'' pentru a avea rol în expresia regulată - unul sau mai multe caractere) 
-* Folosiți ''grep'' pentru a selecta liniile ce conțin șirul-cuvânt ''nume.prenume@gmail.com'' în destinație. (**Atenție**: intrarea ce conține ''j.r.r.tolkien@gmail.com'' este invalidă) 
- 
-=== 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: 
- 
-{{{ 
-cat lista.txt | awk -F '[ \t]+' '{ print "nume:", $1, "prenume", $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'': 
- 
-{{{ 
-cat lista2.txt | sort 
-cat lista2.txt | sort | uniq 
-}}} 
- 
-==== Enunț ==== 
- 
-* Fișierul ''sent_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 ''sent_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 primului destinatar. (Hint: folosiți ''<'' și ''>'' ca separatori; vor exista excepții dar sunt tolerabile) 
-* Folosiți înlănțuirea comenzilor și ''grep'' pentru a elimina liniile albe (liniile care conțin doar spații sau caractere TAB sau care nu conțin nimic). 
-* 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 ''sent_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 ''sent_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. (Hint: se presupune data în formatul ''Day, DD Mon YYYY'' - adică 4 cuvinte separate prin spațiu) 
-* 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.txt · Last modified: 2020/07/20 09:16 (external edit)