====== 8. Înlănțuirea comenzilor ====== 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 ===== * Expandarea comenzilor (''%%$(...)%%'') * Operatorul ''|'' * One linere * Expresii regulate ==== Utilitare folosite ==== * ''grep'', ''tr'', ''cut'' * ''basename'' * ''dd'', ''split'' ===== Resurse utile ===== * TODO * TODO ===== Exerciții ===== ==== Demo-uri ==== === Demo: Folosire filtre de bază === Folosire ''head'', ''tail'', ''sort'', ''uniq'', ''cut'', ''tr'', ''wc'' Generare parolă random === 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: Expandare comenzi === stat -c "%s" $(find /etc/ -type f -name '*.conf' -size +5k) lsof -p $(pgrep bash | tr '\n' ',') === Demo: Globbing === Dorim să afișăm toate fișierele cu extensia ''.conf'' din ''/etc'', care încep cu ''a, b, c, d'' sau ''e'': ls -l /etc/[a-e]*.conf Dorim să afișăm fișierele (sau directoarele) cu extensiile ''.conf'' sau ''.d'' din ''/etc'': ls -ld /etc/*{.conf,.d} De ce am folosit parametrul ''-d'' la ''ls''? Dorim să afișăm fișierele (sau directoarele) cu extensiile ''.conf'' sau ''.d'' din ''/etc'' care nu încep cu ''a, b, c'': ls -ld /etc/[^abc]*{.conf,.d} ==== Expandare comenzi ==== Creați o arhivă ''.tar.gz'' cu toate fișierele din ''/usr/include'' mai mari de ''10KB''. Creați o arhivă ''.zip'' cu toate fișierele din ''/usr/include'' mai mari de ''10KB''. Creați o arhivă ''.zip'' cu toate fișierele din ''/usr/include'' mai mari de ''10KB'' accesate în ultimele 3 zile. Pentru accesare în ultimele 3 zile, folosiți opțiunea ''-atime'' a comenzii ''find''. ==== Informații despre dispozitive de tip caracter ==== Pentru dispozitivele de tip caracter din ''/dev'' afișați numele, majorul și minorul. 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. **Bonus**: Sortați-le în funcție de major. 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ă**. ==== Alte informații despre dispozitive de tip caracter ==== Câte dispozitive de tip caracter se găsesc în fiecare director din ierarhia ''/dev''? 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. ==== 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/''. **Nu** este nevoie să folosiți ''find'', puteți folosi un glob. Folosiți comanda ''basename'' pentru a extrage doar numele de bază al fișierului. 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''. 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 fișiere executabile pentru procese ==== Afișați procesele al căror proces părinte este ''init'', procesul cu PID-ul ''1''. Pentru procesele de mai sus afișați **doar** comanda completă. Filtrați doar acele comenzi care încep cu ''/'' (adică este calea completă către executabil). Selectați **doar** calea către executabil, fără argumente către acesta. Pentru executabilele de mai sus afișați numele și timpul ultimei schimbării (//change time//), separate prin virgulă ('',''). Folosiți comanda ''stat''. Sortați executabilele de mai sus în ordinea timpului ultimei schimbări. Sortarea poate fi simplă, nu este nevoie de sortare numerică. Formatul datei afișat de ''stat'' permite sortare de orice fel. ==== Creare fișiere ==== Creați 100 de fișiere cu numele ''%%myfile-XY.txt%%'', unde ''XY'' este indexul fișierului între ''00'' și ''99''. Folosiți comenzile ''seq'' și ''touch''. Ca model folosiți-vă de comanda seq -f "%02g" 1 100 Între ghilimele poate apărea un șir complet. Gândiți-vă că trebuie să generați șiruri de forma ''%%myfile-XY.txt%%''.