User Tools

Site Tools


linux-admin:capitole:capitol-08

Differences

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

Link to this comparison view

Next revision
Previous revision
linux-admin:capitole:capitol-08 [2016/06/06 18:23]
127.0.0.1 external edit
linux-admin:capitole:capitol-08 [2016/10/03 10:48] (current)
mihaic [Căutare cu grep]
Line 1: Line 1:
 ====== 8. Înlănțuirea comenzilor, one linere ====== ====== 8. Înlănțuirea comenzilor, one linere ======
  
-TODO+Comenzile în shell pot fi înlănțuite pentru a obține noi funcționalități. Anumite comenzi în shell pot primi diverse argumenter pentru a le altera funcționarea,​ în vreme ce altele primesc informații la standard input. Un one liner poate combina funcționalități precum folosirea operatorului ''​|''​ (//pipe//) sau expandarea comenzii (''​%%$(...)%%''​) pentru a crea rapid noi funcționalități în linia de comandă.
  
 ===== Subiecte abordate ===== ===== Subiecte abordate =====
  
-  * TODO +  * Operatorul ''​|''​ 
-  * TODO +  * Comanda ''​for''​ 
-  * TODO+  * One linere 
 +  * Filtre de text 
 +  * Expresii regulate
  
 ==== Utilitare folosite ==== ==== Utilitare folosite ====
  
-  * TODO +  * ''​for''​ 
-  * TODO +  * ''​grep'',​ ''​tr'',​ ''​cut''​ 
-  * TODO+  * ''​basename''​
  
-==== Bune practici ​====+===== Exerciții =====
  
-  * TODO +==== Recapitulare ====
-  * TODO +
-  * TODO+
  
-===== Resurse utile =====+=== Expandare comenzi (creare arhive) ​===
  
-  * TODO +Creați o arhivă ''​.tar.gz''​ cu toate fișierele din ''/​usr/​include''​ mai mari de ''​10KB''​.
-  * TODO+
  
-==== Slide-uri ====+Creați o arhivă ''​.zip''​ cu toate fișierele din ''/​usr/​include''​ mai mari de ''​10KB''​.
  
-[[http://​koala.cs.pub.ro/​training/​res/​medium-unix/slides/cap-08.pdf|Slide-uri capitol 8]]+Creați o arhivă ''​.zip''​ cu toate fișierele din ''​/usr/include''​ mai mari de ''​10KB''​ accesate în ultimele 3 zile.
  
-<html+<note tip
-  <​center>​ +Pentru accesare în ultimele 3 zile, folosiți opțiunea ''​-atime''​ a comenzii ''​find''​
-    <iframe src="​http://​docs.google.com/​viewer?​url=http://​koala.cs.pub.ro/​training/​res/​linux-admin/​slides/​cap-08.pdf&​embedded=true"​ width="​600"​ height="​470" ​  ​style="​border:​ none;"></​iframe>​ +</note>
-  </​center>​ +
-</html>+
  
-===== Exerciții =====+=== Informații despre dispozitive de tip caracter ​==
 + 
 +Pentru dispozitivele de tip caracter din ''/​dev''​ afișați numele, majorul și minorul. 
 + 
 +<note tip> 
 +Folosiți ''​find''​ cu opțiunea ''​-type''​ și parametrul corespunzător pentru a extrage dispozitivele de tip caracter. 
 + 
 +Folosiți ''​stat''​ cu opțiunile de formatare corespunzătoare și expandarea comenzii (''​%%$(...)%%''​) în conjuncție cu comanda ''​find''​ pentru afișarea numelui, majorului și minorului. 
 +</​note>​ 
 + 
 +**Bonus**: Sortați-le în funcție de major. 
 + 
 +<note tip> 
 +Pentru sortare folosiți comanda ''​sort''​. Va trebui să specificați separatorul de câmpuri (folosind opțiunea ''​-t''​) și cheia de sortare (folosind opțiunea ''​-k''​). Pentru că avem cheie de sortare un număr va trebui să faceți sortare **numerică**. 
 +</​note>​ 
 + 
 +=== Alte informații despre dispozitive de tip caracter ​==
 + 
 +Câte dispozitive de tip caracter se găsesc în fiecare director din ierarhia ''/​dev''?​ 
 + 
 +<note tip> 
 +Folosiți ''​find''​ pentru a extrage dispozitivele de tip caracter. 
 + 
 +Folosiți ''​dirname''​ și expandarea comenzii (''​%%$(...)%%''​) în conjuncție cu comanda ''​find''​ de mai sus pentru a extrage doar numele directoarelor. 
 + 
 +Prelucrați output-ul de mai sus prin comanda ''​sort''​ pentru a-l sorta. 
 + 
 +Apoi folosiți output-ul astfel prelucrat prin comanda ''​uniq''​ cu opțiunea ''​-c''​ pentru a afișa numărul de apariții al fiecărui director. 
 +</​note>​
  
 ==== Demo-uri ==== ==== Demo-uri ====
  
-TODO+=== Demo: Folosire filtre de bază === 
 + 
 +Folosire ''​head'',​ ''​tail'',​ ''​sort'',​ ''​uniq'',​ ''​cut'',​ ''​tr'',​ ''​wc''​ 
 + 
 +Generare parolă random 
 + 
 +Prelucrare date datornici 
 + 
 +=== Demo: Expresii regulate === 
 + 
 +Exemple de expresii regulate 
 + 
 +Câte directive ''#​include''​ conțin fișierele din ''/​usr/​include''?​ Câte directive ''#​include''​ conțin fișierele de tip header C++ (''​.hpp''​)?​ 
 + 
 +=== Demo: Folosire avansată grep și sort === 
 + 
 +Afișați fișierele din ierarhia ''/​usr/​include''​ în ordinea numărului de apariții ale **cuvântului** ''​FILE''​. 
 + 
 +=== Demo: Folosire ''​for''​ === 
 + 
 +<​code>​ 
 +for u in ana bogdan corina dan elena; do echo "user is $u"; done 
 +</​code>​ 
 + 
 +==== Creare directoare în home-urile mai multor utilizatori ==== 
 + 
 +Pentru început adăugați în sistem utilizatorii ''​ana'',​ ''​bogdan'',​ ''​corina'',​ ''​dan''​ și ''​elena''​ folosind utilitarul ''​adduser'':​ 
 +<​code>​ 
 +sudo adduser ana 
 +sudo adduser bogdan 
 +... 
 +</​code>​ 
 + 
 +Ca root, parcurgeți utilizatorii sistemului care au home-ul în ''/​home/'',​ și creați un director ''​public_html''​ în home-ul fiecăruia. 
 + 
 +<note tip> 
 +Ca să extragem utilizatorii al căror director home este în ''/​home/''​ folosim o construcție de forma<​code>​ 
 +grep '/​home/'​ /​etc/​passwd 
 +</​code>​ 
 +Apoi filtrăm output-ul comenzii de mai sus cu ajutorul comenzii ''​cut''​ pentru a extrage doar prima coloană. 
 + 
 +Apoi folosiți ''​for''​ și expandarea comenzii în forma<​code>​ 
 +for user in $(grep ...); do ...; done 
 +</​code>​ 
 +</​note>​ 
 + 
 +Realizați apoi un one-liner sau un script care să șteargă directorul ''​public_html''​. 
 + 
 +<note tip> 
 +Pentru a verifica prezența/​absența directorului folosiți comanda<​code>​ 
 +ls -ld <​path/​to/​folder>​ 
 +</​code>​ 
 +unde ''<​path/​to/​folder>''​ este calea către directorul pe care dorim să-l verificăm. 
 + 
 +Pentru afișarea tuturor directoarelor ''​public_html''​ din home-urile utilizatorilor puteți folosi un glob în forma<​code>​ 
 +ls -ld /​home/​*/​public_html/​ 
 +</​code>​ 
 +</​note>​ 
 + 
 +==== Creare directoare și schimbare permisiuni ==== 
 + 
 +Ca root, parcurgeți utilizatorii sistemului care au home-ul în ''/​home/'',​ și creați un director ''​public_html''​ în home-ul fiecăruia. Schimbați ownership-ul acelui director la utilizator folosind ''​chown''​. 
 + 
 +<note tip> 
 +Comanda ''​chown''​ este rulată doar de ''​root'',​ adică folosiți ''​sudo''​. 
 + 
 +O formă de rulare a comenzii ''​chown''​ este<​code>​ 
 +sudo chown <​username>​ <​path/​to/​file>​ 
 +</​code>​ 
 +unde ''<​username>''​ este numele utilizatorului către care vrem să schimbăm ownership-ul iar ''<​path/​to/​file>''​ este calea către fișierul/​directorul pentru care vrem să schimbăm ownership-ul. 
 +</​note>​ 
 + 
 +<note tip> 
 +Pentru a verifica dacă a fost schimbat ownership-ul pe un director folosiți o construcție de forma<​code>​ 
 +ls -ld <​path/​to/​folder>​ 
 +</​code>​ 
 +unde ''<​path/​to/​folder>''​ este calea către directorul pentru care dorim să verificăm ownership-ul. 
 + 
 +Pentru afișarea de informații despre directoarele ''​public_html''​ din home-urile utilizatorilor puteți folosi un glob în forma<​code>​ 
 +ls -ld /​home/​*/​public_html/​ 
 +</​code>​ 
 +</​note>​ 
 + 
 + 
 +==== Numele paginilor de manual dintr-o anumită secțiune ==== 
 + 
 +Afișați numele paginilor de manual din secțiunea 5. Numele sunt partea fără extensie din fișierele existente în directorul ''/​usr/​share/​man/​man5/''​. De exemplu, pentru fișierul ''​issue.5.gz'',​ numele este ''​issue''​. 
 + 
 +Recomandăm pașii de mai jos. 
 + 
 +Construiți glob-ul care să afișeze toate fișierele cu extensia ''​.5.gz''​ din directorul ''/​usr/​share/​man/​man5/''​. 
 + 
 +<note important>​ 
 +**Nu** este nevoie să folosiți ''​find'',​ puteți folosi un glob. 
 +</​note>​ 
 + 
 +Folosiți comanda ''​basename''​ pentru a extrage doar numele de bază al fișierului. 
 + 
 +<note tip> 
 +Comanda ''​basename''​ ca argumente numele fișierulelor. Pentru a elimina extensia folosiți opțiunea ''​-s''​ a comenzii ''​basename''​. 
 + 
 +Opțiunea ''​-s''​ a comenzii ''​basename''​ primește ca argument extensia ce trebuie scoasă. Trebuie să scoateți extensia ''​5.gz''​. 
 +</​note>​ 
 + 
 +Din lista de mai sus, extrageți doar comenzile care încep cu o anumită literă. Adică din outputul de mai sus, folosiți o comandă de forma ''​grep '​^a'''​ pentru a extrage liniile care încep cu litera ''​a''​ folosind ''​grep''​. 
 + 
 +==== Afișare informații despre fișiere ==== 
 + 
 +Dorim să afișăm informații despre fișiere folosind comanda ''​stat'',​ comandă dedicată exact obținerii de informații despre fișiere. 
 + 
 +Afișați pentru fișierul ''/​etc/​passwd''​ doar dimensiunea. **Indicație**:​ Folosiți comanda ''​stat''​ împreună cu opțiunea ''​%%--format%%''​ (sau ''​-c'',​ forma scurtă a acestei opțiuni). 
 + 
 +Afișați pentru fișierul ''/​etc/​passwd''​ inode-ul, dimensiunea și uid-ul, separate prin '',''​ (virgulă). 
 + 
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​. 
 + 
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​. 
 + 
 +Calculați totalul de octeți ocupat de fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​. 
 + 
 +<note tip> 
 +Dacă aveți numere (câte unul pe linie) pe care vreți să le adunați, folosiți construcția filtrați output-ul prin comanda ''​%%paste -s -d '​+'​%%''​. Adică ceva de forma 
 +<​code>​ 
 +stat ... | paste -s -d '​+'​ 
 +</​code>​ 
 +Output-ul comenzii de mai sus este acum o expresie aritmetică ce poate fi evaluată. Comanda ''​%%paste -s -d '​+'​%%''​ serializează liniile (opțiunea ''​-s''​) punând între ele caracterul ''​+''​ (pentru adunare). 
 + 
 +Pentru a efectua calculul, filtrați expresia aritmetică folosită mai sus prin comanda ''​bc''​. Comanda ''​bc''​ (un calculator în linia de comandă) primește o expresia aritmetică la standard input și o afișează la standard output. Adică o constructție de forma 
 +<​code>​ 
 +stat  ... | paste -s -d '​+'​ | bc 
 +</​code>​ 
 +</​note>​ 
 +==== Fișiere ordonate după dimensiune ==== 
 + 
 +Listați primele 10 **fișiere obișnuite** (//regular files//) din ierarhia ''/​etc''​ (adică din toate directoarele,​ subdirectoarele și subdirectoarele acestora etc.) sortate în ordinea dimesiunii ocupate de fiecare fișier. 
 + 
 +<note tip> 
 +Folosiți find pentru a extrage fișierele. Apoi folosiți expandarea comenzii și ''​stat''​ pentru a afișa doar numele și dimensiunea fișierului. Adică o construcție de forma 
 +<​code>​ 
 +stat -c ... $(find ...) 
 +</​code>​ 
 + 
 +Apoi filtrați output-ul comenzii de mai sus cu ajutorul comenzii ''​sort''​ pentru a sorta **numeric** în funcție de dimensiunea fișierului. Adică o construcție de forma: 
 +<​code>​ 
 +stat -c ... $(find ...) | sort ... 
 +</​code>​ 
 + 
 +Apoi filtrați output-ul prin comanda ''​tail''​ pentru a extrage doar primele ''​10''​ fișiere, în ordinea dimensiunii. Adică o construcție de forma: 
 +<​code>​ 
 +stat -c ... $(find ...) | sort ... | tail 
 +</​code>​ 
 +</​note>​ 
 + 
 +==== Căutare cu grep ==== 
 + 
 +Folosiți ''​grep''​ pentru a selecta alias-urile cu destinația de forma ''​nume.prenume@gmail.com''​ din fișierul ''​aliases''​ din [[http://​koala.cs.pub.ro/​training/​res/​linux-admin/​arc/​cap-08-res.zip|arhiva capitolului]]. Intrările din fișierul ''​aliases''​ se consideră de forma ''​alias:​ destinație''​. 
 + 
 +==== Generare parole aleatoare ==== 
 + 
 +Folosiți conținutul fișierului ''/​dev/​urandom''​ pentru a genera o parolă aleatoare de 16 caractere.
  
-TODO+<note tip> 
 +Folosiți comanda ''​tr''​ cu opțiunile ''​-d''​ și ''​-c''​ pentru a extrage doar caractere tipările (litere mici, litere mari, numere).
  
-==== TODO: Exercițiu 1 ====+Folosiți comanda ''​head''​ cu opțiunea ''​-c''​ pentru a extrage doar ''​16''​ caractere din output-ul anterior. 
 +</​note>​
  
-TODO+Actualizați comanda de mai sus pentru a genera ''​20''​ de parola a câte ''​16''​ caractere.
  
-==== TODOExercițiu 2 ====+<note important>​ 
 +Recomandăm să **nu** folosiți ''​for''​ (merge, dar vrem să folosim ''​fold'' ​:-P). Vedeți indicațiile legate de folosirea comenzii ''​fold''​ de mai jos. 
 +</​note>​
  
-TODO+<note tip> 
 +Comanda ''​fold''​ împarte informațiile primite la intrarea standard în linii pe care le afișează la ieșirea standard. Poate să extragă linii de dimensiune dată. Uzual se folosește în forma 
 +<​code>​ 
 +<​command>​ | fold 
 +</​code>​ 
 +unde ''<​command>''​ este o comandă care generează informații pe care apoi să le prelucreze comanda ''​fold''​.
  
 +Extrageți ''​20*16 = 320''​ caractere aleatoare și apoi folosiți comanda ''​fold''​ cu opțiunea ''​-w''​ pentru a le grupa în seturi de câte ''​16''​. Adică o construcție de forma
 +<​code>​
 +cat /​dev/​urandom | ... | fold -w 16
 +</​code>​
 +</​note>​
linux-admin/capitole/capitol-08.1465226636.txt.gz · Last modified: 2016/10/03 09:10 (external edit)