This shows you the differences between two versions of the page.
|
uso:laboratoare:laborator-06:inspect-files [2022/11/08 16:45] alexandru.vladut02 |
uso:laboratoare:laborator-06:inspect-files [2025/10/26 16:53] (current) daniel_ioan.dinu Typos in [Exerciții] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Inspectarea fișierelor ====== | ====== Inspectarea fișierelor ====== | ||
| - | ===== Inspectarea rapida a conținutului fișierelor ===== | + | ===== Inspectarea rapidă a conținutului fișierelor ===== |
| - | În secțiunea anterioară, ''%%Inspectarea sistemului de fișiere%%'', am văzut cum căutăm fișiere în sistem cu ajutorul utilitarelor ''%%locate%%'' și ''%%find%%''. Căutăm un fișier cu un scop: vrem să găsim fișierul ''%%README%%'' pentru informații despre compilarea proiectului, vrem să ne amintim un detaliu de implementare din cod, etc. | + | În secțiunea anterioară, ''%%Inspectarea sistemului de fișiere%%'', am văzut cum căutăm fișiere în sistem cu ajutorul utilitarului ''%%find%%''. Căutăm un fișier cu un scop: vrem să găsim fișierul ''%%README%%'' pentru informații despre compilarea proiectului, vrem să ne amintim un detaliu de implementare din cod, etc. |
| De cele mai multe ori acțiunea noastră se poate grupa în una din următoarele două categorii: | De cele mai multe ori acțiunea noastră se poate grupa în una din următoarele două categorii: | ||
| - | * Ne dorim să inspectăm rapid conținutul fișierelor pentru a ne da seama dacă am găsit informația căutată. | + | * Ne dorim să inspectăm/citim rapid conținutul fișierelor pentru a ne da seama dacă am găsit informația căutată. |
| - | * Ne dorim să afișăm pe ecran conținutul fișierelor pentru a extrage și prelucra informații din acestea. | + | * Ne dorim să afișăm pe ecran conținutul fișierelor pentru a extrage și prelucra informații din acestea cu ajutorul altor comenzi. |
| ==== Căutarea informației într-un fișier ==== | ==== Căutarea informației într-un fișier ==== | ||
| - | Pentru a vedea rapid conținutul unui fișier folosim utlitarul ''%%less%%''. | + | Pentru a vedea rapid conținutul unui fișier folosim utilitarul ''%%less%%''. |
| <note> | <note> | ||
| Line 57: | Line 57: | ||
| <note> | <note> | ||
| - | În cadrul unei sesiuni ''%%less%%'' putem folosi aceeleași taste ca în cadrul sesiunii interactive ''%%man%%'' pentru navigarea în pagină: | + | În cadrul unei sesiuni ''%%less%%'' putem folosi aceleași taste ca în cadrul sesiunii interactive ''%%man%%'' pentru navigarea în pagină: |
| * ''%%Ctrl+n%%''/''%%Ctrl+p%%'' sau ''%%j%%''/''%%k%%'' pentru a naviga, cu câte o linie, în jos, respectiv în sus; recomandăm utlizarea tastelor ''%%j%%''/''%%k%%'' pentru a fi mai eficienți | * ''%%Ctrl+n%%''/''%%Ctrl+p%%'' sau ''%%j%%''/''%%k%%'' pentru a naviga, cu câte o linie, în jos, respectiv în sus; recomandăm utlizarea tastelor ''%%j%%''/''%%k%%'' pentru a fi mai eficienți | ||
| Line 73: | Line 73: | ||
| === Exerciții === | === Exerciții === | ||
| - | - Analizați, folosind ''%%less%%'', algoritmul de căutare din fișierul ''%%workspace/C/searching/linear_search.c%%''. Ce implementare este mai eficientă: **binary_search** sau **linear_search**? | + | - Analizați, folosind ''%%less%%'', algoritmii de căutare din fișierele ''%%workspace/C/searching/linear_search.c%%'' și ''%%workspace/C/searching/binary_search.c%%''. Ce implementare este mai eficientă: **binary_search** sau **linear_search**? |
| - | - Analizați, folosind ''%%less%%'', algoritmul de sortare **quick_sort**. Folosiți utilitarul ''%%find%%'' pentru a găsi fișierul sursă care conține implementarea. | + | - Folosiți utilitarul ''%%find%%'' pentru a găsi fișierul sursă care conține algoritmul de sortare **quick_sort**. Analizați implementarea acestuia folosind utilitarul ''%%less%%''. |
| - | - Analizați, folosind ''%%less%%'', algoritmul de sortare **merge_sort**. Folosiți utilitarul ''%%find%%'' pentru a găsi fișierul sursă care conține implementarea. | + | - Folosiți utilitarul ''%%find%%'' pentru a găsi fișierul sursă care conține algoritmul de sortare **merge_sort**. Analizați implementarea acestuia folosind utilitarul ''%%less%%''. |
| - Căutați pe Google detalii despre cei doi algoritmi de sortare și încercați să vă răspundeți la întrebarea: Când folosim **merge_sort** și când folosim **quick_sort**? | - Căutați pe Google detalii despre cei doi algoritmi de sortare și încercați să vă răspundeți la întrebarea: Când folosim **merge_sort** și când folosim **quick_sort**? | ||
| Line 98: | Line 98: | ||
| [...] | [...] | ||
| </code> | </code> | ||
| - | Observăm că pentru un fișier cu un număr mare de linii, așa cum este **binary_search.c**, afișarea întregului conținut pe ecran devine un impediment în a putea înțelege și urmări conținutul. De aceea vă încurajăm să folosiți ''%%less%%'' în loc de ''%%cat%%'' pentru a inspecta un fișier: vă este mult mai ușor să vă plimbați în interiorul fișierului și puteți folosi funcția search pentru a căuta în fișier. De asemeni, folosind ''%%less%%'' vă păstrați consola curată și puteți urmări mai ușor ce comenzi ați dat anterior și care au fost rezultatele acestora. | + | Observăm că pentru un fișier cu un număr mare de linii, așa cum este **binary_search.c**, afișarea întregului conținut pe ecran devine un impediment în a putea înțelege și urmări conținutul. De aceea, vă încurajăm să folosiți ''%%less%%'' în loc de ''%%cat%%'' pentru a inspecta un fișier: vă este mult mai ușor să vă plimbați în interiorul fișierului și puteți folosi funcția search pentru a căuta în fișier. De asemenea, folosind ''%%less%%'' vă păstrați consola curată și puteți urmări mai ușor ce comenzi ați dat anterior și care au fost rezultatele acestora. |
| - | Folosim comanda ''%%cat%%'' în combinație cu alte comenzi pentru a extrage sau filtra conținutul anumitor fișiere. Comanda ''%%cat%%'' primește ca argumente calea către unul sau mai multe fișiere și afișează pe ecran conținutul concatenat al acestora. | + | Folosim comanda ''%%cat%%'' în combinație cu alte comenzi pentru a extrage sau filtra conținutul anumitor fișiere. Comanda ''%%cat%%'' primește ca argument calea către unul sau mai multe fișiere și afișează pe ecran conținutul concatenat al acestora. |
| Un exemplu uzual este faptul că vrem să extragem informațiile despre starea memoriei sistemului din fișierul ''%%/proc/meminfo%%''. Pentru aceasta rulăm comanda de mai jos: | Un exemplu uzual este faptul că vrem să extragem informațiile despre starea memoriei sistemului din fișierul ''%%/proc/meminfo%%''. Pentru aceasta rulăm comanda de mai jos: | ||
| Line 110: | Line 110: | ||
| MemAvailable: 874420 kB | MemAvailable: 874420 kB | ||
| </code> | </code> | ||
| - | În exemplul de mai sus folosim ''%%cat%%'' pentru a oferi ca intrare conținutul fișierului ''%%/proc/meminfo%%'' utilitarului ''%%grep%%''; cu utilitarul ''%%grep%%'' filtrăm conținutul după textul ''%%"Mem"%%''. Cu alte cuvinte, outputul comenzii ''%%cat /proc/meminfo%%'', adică conținutul fișierului ''%%/proc/meminfo%%'' este textul pe care utilitarul ''%%grep%%'' îl prelucrează. | + | În exemplul de mai sus folosim ''%%cat%%'' pentru a oferi ca intrare conținutul fișierului ''%%/proc/meminfo%%'' utilitarului ''%%grep%%''; cu utilitarul ''%%grep%%'' filtrăm conținutul după textul ''%%"Mem"%%''. Despre operatorul ''%%|%%'' vom vorbi mai jos. |
| + | |||
| + | Cu alte cuvinte, outputul comenzii ''%%cat /proc/meminfo%%'', adică conținutul fișierului ''%%/proc/meminfo%%'' este textul pe care utilitarul ''%%grep%%'' îl prelucrează. | ||
| **Exercițiu**: Plecând de la exemplul de mai sus, extrageți din fișierul ''%%/proc/cpuinfo%%'' dimensiunea memoriei cache a procesorului vostru; filtrați conținutul după textul ''%%"cache"%%''. | **Exercițiu**: Plecând de la exemplul de mai sus, extrageți din fișierul ''%%/proc/cpuinfo%%'' dimensiunea memoriei cache a procesorului vostru; filtrați conținutul după textul ''%%"cache"%%''. | ||
| Line 169: | Line 171: | ||
| În acest moment am găsit răspunsul căutat, dar avem două mici neajunsuri: | În acest moment am găsit răspunsul căutat, dar avem două mici neajunsuri: | ||
| - | * Ne lipsește antetul, așa că nu știm ce informații avem pe coloane | + | * Ne lipsește antetul (aflat pe prima linie), așa că nu știm ce informații avem pe coloane |
| * Procesele sunt sortate crescător, a.î. cel mai consumator este ultimul; vrem să fie sortate descrescător | * Procesele sunt sortate crescător, a.î. cel mai consumator este ultimul; vrem să fie sortate descrescător | ||
| - | Rezolvăm cele două probleme prin intermediul opțiunii ''%%--sort%%'': dacă punem un ''%%-%%'' (minus) în fața argumentului după care sortăm, o să sortăm descrescător. Rulăm comanda: | + | Rezolvăm cele două probleme prin intermediul opțiunii ''%%--sort%%'': dacă punem un ''%%-%%'' (minus) în fața argumentului după care sortăm, o să sortăm descrescător. Rulăm comanda nouă și vizualizăm rezultatul folosind ''%%less%%'': |
| <code bash> | <code bash> | ||
| Line 208: | Line 210: | ||
| ===== Căutarea în fișiere ===== | ===== Căutarea în fișiere ===== | ||
| - | Așa cum am văzut până în acest punct din carte, majoritatea comenzilor Linux afișează o gamă largă de informații pe care apoi utilizatorul (adică noi) le filtrează pentru a extrage ceea ce îl intresează. La începutul acestei secțiuni, dar și de-a lungul cărții, am folosit utilitarul ''%%grep%%'' ca să filtrăm rezultatul unei comenzi. | + | Așa cum am văzut până în acest punct, majoritatea comenzilor Linux afișează o gamă largă de informații pe care apoi utilizatorul (adică noi) le filtrează pentru a extrage ceea ce îl interesează. La începutul acestui laborator, dar și de-a lungul materiei, am folosit utilitarul ''%%grep%%'' ca să filtrăm rezultatul unei comenzi. |
| - | Comanda ''%%grep%%'' este una dintre cele mai folosite în linie de comandă. Sintaxa de folosire a ''%%grep%%'' este următoarea: | + | Comanda ''%%grep%%'' este una dintre cele mai folosite în linia de comandă. Sintaxa de folosire a ''%%grep%%'' este următoarea: |
| <code bash> | <code bash> | ||
| Line 249: | Line 251: | ||
| ==== Exerciții ==== | ==== Exerciții ==== | ||
| - | - Căutați //patternul// "l" în fișierul ''%%binary_search.c%%'', pentru a vedea unde este folosit parametrul **left**. Observați cât de multe rezultate irelevante ați găsit datorită faptului că am căutat doar caracterul **l**. Aici există o lecție de învățat. Numele variabilelor sunt foarte improtante: nu fac doar codul mai ușor de înțeles, dar ajută și căutarea. Folosiți //patternul// "param l" în încercarea de a restrânge căutarea. | + | - Căutați //pattern-ul// "l" în fișierul ''%%binary_search.c%%'', pentru a vedea unde este folosit parametrul **left** al funcției de căutare binară. Observați cât de multe rezultate irelevante ați găsit datorită faptului că am căutat doar caracterul **l**. Aici există o lecție de învățat. Numele variabilelor sunt foarte importante: nu fac doar codul mai ușor de înțeles, dar ajută și căutarea. Folosiți //pattern-ul// "param l" în încercarea de a restrânge căutarea. |
| - | - Căutați //patternul// "arr" în fișierul ''%%binary_search.c%%''. | + | - Căutați //pattern-ul// "arr" în fișierul ''%%binary_search.c%%''. |
| - | - Căutați //patternul// "binarysearch1" în fișierul ''%%binary_search.c%%'' pentru a vedea cum este apelată funcția de căutare. | + | - Căutați //pattern-ul// "binarysearch1" în fișierul ''%%binary_search.c%%'' pentru a vedea cum este apelată funcția de căutare. |
| - | ==== Opțiuni uzuale ale grep ==== | + | ==== Extra: Opțiuni uzuale ale grep ==== |
| - | === Afișarea numărului liniei care conține patternul === | + | === Afișarea numărului liniei care conține pattern-ul === |
| - | Folosim opțiunea ''%%-n%%'' pentru a afișa și numărul liniei care conține patternul căutat: | + | Folosim opțiunea ''%%-n%%'' pentru a afișa și numărul liniei care conține pattern-ul căutat: |
| <code bash> | <code bash> | ||
| Line 271: | Line 273: | ||
| === Căutarea case-insensitive === | === Căutarea case-insensitive === | ||
| - | Implicit, grep caută în mod case-sensitive patternul, așa cum putem observa din exemplul de mai jos: | + | Implicit, grep caută în mod case-sensitive pattern-ul, așa cum putem observa din exemplul de mai jos: |
| <code bash> | <code bash> | ||
| student@uso:~$ grep Search workspace/C/searching/binary_search.c | student@uso:~$ grep Search workspace/C/searching/binary_search.c | ||
| </code> | </code> | ||
| - | Pentru a efectua căutarea textului în mod case-insesnsitive, folosim opțiunea ''%%-i%%'', ca în exemplul de mai jos: | + | Pentru a efectua căutarea textului în mod case-insensitive, folosim opțiunea ''%%-i%%'', ca în exemplul de mai jos: |
| <code bash> | <code bash> | ||
| Line 290: | Line 292: | ||
| === Excluderea unui pattern === | === Excluderea unui pattern === | ||
| - | Pentru a afișa toate liniile, mai puțin pe cele care conțin pattern, folosim opțiunea ''%%-v%%'', ca în exemplul de mai jos: | + | Pentru a afișa toate liniile, mai puțin pe cele care conțin pattern-ul, folosim opțiunea ''%%-v%%'', ca în exemplul de mai jos: |
| <code bash> | <code bash> | ||
| Line 308: | Line 310: | ||
| === Căutarea recursivă a unui pattern === | === Căutarea recursivă a unui pattern === | ||
| - | În căutările noastre de până acum, ca și în exemplele de mai sus, am presupus că știm în ce fișiere se găsește informația căutată de noi. Acest lucru este adevărat pentru fișiere din sistem cu informații bine cunoscute, cum ar fi ''%%/proc/meminfo%%'', dar atunci când lucrăm cu un proiect nou nu vom ști în ce fișiere să căutăm informația dorită. De exemplu, în cazul proiectului cu algoritmi implementați în C, noi am făcut presupunerea că vom găsi linii care conțin patternul **search** în fișierul ''%%workspace/C/searching/binary_search.c%%''. | + | În căutările noastre de până acum, ca și în exemplele de mai sus, am presupus că știm în ce fișiere se găsește informația căutată de noi. Acest lucru este adevărat pentru fișiere din sistem cu informații bine cunoscute, cum ar fi ''%%/proc/meminfo%%'', dar atunci când lucrăm cu un proiect nou, nu vom ști în ce fișiere să căutăm informația dorită. De exemplu, în cazul proiectului cu algoritmi implementați în C, noi am făcut presupunerea că vom găsi linii care conțin pattern-ul **search** în fișierul ''%%workspace/C/searching/binary_search.c%%''. |
| - | Atunci când nu știm în ce fișiere se află informația căutată putem să-i spunem lui ''%%grep%%'' să caute recursiv prin toată ierarhia de fișiere dintr-un anumit director. Pentru a efectua o căutare recursivă folosim opțiunea ''%%-r%%'', ca în exemplul de mai jos: | + | Atunci când nu știm în ce fișiere se află informația căutată, putem să-i spunem lui ''%%grep%%'' să caute recursiv prin toată ierarhia de fișiere dintr-un anumit director. Pentru a efectua o căutare recursivă folosim opțiunea ''%%-r%%'', ca în exemplul de mai jos: |
| <code bash> | <code bash> | ||
| Line 369: | Line 371: | ||
| === Bonus: Căutarea unui cuvânt === | === Bonus: Căutarea unui cuvânt === | ||
| - | Din rezultatele căutărilor de mai sus observăm că ''%%grep%%'' caută patternul dat ca un subșir. Acest lucru se vede foarte ușor în rezultatul anterior: | + | Din rezultatele căutărilor de mai sus observăm că ''%%grep%%'' caută pattern-ul dat ca un subșir. Acest lucru se vede foarte ușor în rezultatul anterior: |
| <code bash> | <code bash> | ||
| Line 376: | Line 378: | ||
| workspace/C/leetcode/src/700.c:10:struct TreeNode *searchBST(struct TreeNode *root, int val) | workspace/C/leetcode/src/700.c:10:struct TreeNode *searchBST(struct TreeNode *root, int val) | ||
| </code> | </code> | ||
| - | Observăm că patternul **search** se regăsește în șirul ***searchBST**. Dacă dorim să căutăm cuvântul **search** folosim opțiunea ''%%-w%%'' (word) pentru a-i transmite utilitarului că patternul trebuie tratat ca un cuvânt, ca în exemplul de mai jos: | + | Observăm că pattern-ul **search** se regăsește în șirul ***searchBST**. Dacă dorim să căutăm cuvântul **search** folosim opțiunea ''%%-w%%'' (word) pentru a-i transmite utilitarului că pattern-ul trebuie tratat ca un cuvânt, ca în exemplul de mai jos: |
| <code bash> | <code bash> | ||
| Line 390: | Line 392: | ||
| === Exerciții === | === Exerciții === | ||
| - | - Găsiți toate fișierele care includ headerul ''%%stdio.h%%''. | + | - Găsiți toate fișierele care includ header-ul ''%%stdio.h%%''. |
| - | - Găsiți toate aparițiile patternului ''%%binarySearch%%''. | + | - Găsiți toate aparițiile pattern-ului ''%%binarySearch%%''. |
| - | - Găsiți toate aparițiile patternului ''%%quickSort%%''. | + | - Găsiți toate aparițiile pattern-ului ''%%quickSort%%''. |