This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
basic-unix:capitole:capitol-08 [2016/05/15 21:57] razvan created |
basic-unix:capitole:capitol-08 [2016/05/26 19:09] (current) razvan [Creare fișiere] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== X. TODO ====== | + | ====== 8. Înlănțuirea comenzilor ====== |
- | 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 | + | * Expandarea comenzilor (''%%$(...)%%'') |
- | * TODO | + | * Operatorul ''|'' |
- | * TODO | + | * One linere |
+ | * Expresii regulate | ||
==== Utilitare folosite ==== | ==== Utilitare folosite ==== | ||
- | * TODO | + | * ''grep'', ''tr'', ''cut'' |
- | * TODO | + | * ''basename'' |
- | * TODO | + | * ''dd'', ''split'' |
===== Resurse utile ===== | ===== Resurse utile ===== | ||
Line 24: | Line 25: | ||
==== Demo-uri ==== | ==== Demo-uri ==== | ||
- | TODO | + | === 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 === | ||
+ | |||
+ | <code bash> | ||
+ | stat -c "%s" $(find /etc/ -type f -name '*.conf' -size +5k) | ||
+ | lsof -p $(pgrep bash | tr '\n' ',') | ||
+ | </code> | ||
+ | |||
+ | === Demo: Globbing === | ||
+ | |||
+ | Dorim să afișăm toate fișierele cu extensia ''.conf'' din ''/etc'', care încep cu ''a, b, c, d'' sau ''e'': | ||
+ | <code bash> | ||
+ | ls -l /etc/[a-e]*.conf | ||
+ | </code> | ||
+ | |||
+ | Dorim să afișăm fișierele (sau directoarele) cu extensiile ''.conf'' sau ''.d'' din ''/etc'': | ||
+ | <code bash> | ||
+ | ls -ld /etc/*{.conf,.d} | ||
+ | </code> | ||
+ | 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'': | ||
+ | <code bash> | ||
+ | ls -ld /etc/[^abc]*{.conf,.d} | ||
+ | </code> | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | <note tip> | ||
+ | Pentru accesare în ultimele 3 zile, folosiți opțiunea ''-atime'' a comenzii ''find''. | ||
+ | </note> | ||
+ | |||
+ | ==== 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> | ||
+ | |||
+ | ==== 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 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ă ('',''). | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''stat''. | ||
+ | </note> | ||
+ | |||
+ | Sortați executabilele de mai sus în ordinea timpului ultimei schimbări. | ||
- | TODO | + | <note tip> |
+ | Sortarea poate fi simplă, nu este nevoie de sortare numerică. Formatul datei afișat de ''stat'' permite sortare de orice fel. | ||
+ | </note> | ||
- | ==== TODO 2 ==== | + | ==== Creare fișiere ==== |
- | TODO | + | Creați 100 de fișiere cu numele ''%%myfile-XY.txt%%'', unde ''XY'' este indexul fișierului între ''00'' și ''99''. |
- | ==== TODO 2 ==== | + | <note tip> |
+ | Folosiți comenzile ''seq'' și ''touch''. | ||
+ | </note> | ||
- | TODO | + | <note tip> |
+ | Ca model folosiți-vă de comanda<code> | ||
+ | seq -f "%02g" 1 100 | ||
+ | </code> | ||
+ | Între ghilimele poate apărea un șir complet. Gândiți-vă că trebuie să generați șiruri de forma ''%%myfile-XY.txt%%''. | ||
+ | </note> |