Differences

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

Link to this comparison view

uso:laboratoare:new:06-auto:basics [2019/11/07 08:51]
costin.carabas [Shell scripting]
uso:laboratoare:new:06-auto:basics [2019/11/12 08:11] (current)
maria.mihailescu [Expresii regulate] Fix regex
Line 38: Line 38:
 Pentru căutarea și selectarea de linii din fișiere text folosim comanda ''​grep''​ care folosește, la rândul ei, expresii regulate. Astfel, dacă dorim să selectăm studenții care au litera ''​z''​ în numele lor, folosim comanda Pentru căutarea și selectarea de linii din fișiere text folosim comanda ''​grep''​ care folosește, la rândul ei, expresii regulate. Astfel, dacă dorim să selectăm studenții care au litera ''​z''​ în numele lor, folosim comanda
 <code bash> <code bash>
-student@uso:​~/​uso-lab/​06-auto/​00-basics$ grep '​z'​ students.txt ​+student@uso:​~/​uso-lab/​06-auto/support/00-basics$ grep '​z'​ students.txt ​
 GHECENCO F. Răzvan 312CC 8 8.75 4.67 GHECENCO F. Răzvan 312CC 8 8.75 4.67
 MARIN N. Răzvan 312CC 5 3.5 4.2 MARIN N. Răzvan 312CC 5 3.5 4.2
Line 76: Line 76:
 Doar că expresia ''​z''​ nu se potrivește (nu face //match//) pe litera ''​Z''​ (majusculă). Pentru a selecta studenții al cărore nume conține atât litera ''​z''​ cât și ''​Z''​ (majusculă) folosim expresia regulată ''​%%[zZ]%%''​ și comanda Doar că expresia ''​z''​ nu se potrivește (nu face //match//) pe litera ''​Z''​ (majusculă). Pentru a selecta studenții al cărore nume conține atât litera ''​z''​ cât și ''​Z''​ (majusculă) folosim expresia regulată ''​%%[zZ]%%''​ și comanda
 <code bash> <code bash>
-student@uso:​~/​uso-lab/​06-auto/​00-basics$ grep '​[zZ]'​ students.txt ​+student@uso:​~/​uso-lab/​06-auto/support/00-basics$ grep '​[zZ]'​ students.txt ​
 PAJARCU Z.P. Raul-Constantin 312CC 2 0.5 1.7 PAJARCU Z.P. Raul-Constantin 312CC 2 0.5 1.7
 GHECENCO F. Răzvan 312CC 8 8.75 4.67 GHECENCO F. Răzvan 312CC 8 8.75 4.67
Line 86: Line 86:
 Dacă vrem să selectăm studenții al căror nume de familie începe cu litera ''​F'',​ atunci vom folosi expresia regulată ''​%%^F%%''​ denotând litera ''​F''​ (majusculă) la început de rând. Vom folosi, așadar, comanda de mai jos: Dacă vrem să selectăm studenții al căror nume de familie începe cu litera ''​F'',​ atunci vom folosi expresia regulată ''​%%^F%%''​ denotând litera ''​F''​ (majusculă) la început de rând. Vom folosi, așadar, comanda de mai jos:
 <code bash> <code bash>
-student@uso:​~/​uso-lab/​06-auto/​00-basics$ grep '​^F'​ students.txt ​+student@uso:​~/​uso-lab/​06-auto/support/00-basics$ grep '​^F'​ students.txt ​
 FLOREA N. Monica-Andreea 313CC 9 7.5 8.5 FLOREA N. Monica-Andreea 313CC 9 7.5 8.5
 FULGER P. Alexandru-Gabriel 315CC 7 4.25 5 FULGER P. Alexandru-Gabriel 315CC 7 4.25 5
Line 93: Line 93:
 Dacă vrem în schimb să selectăm studenții al căror prenume începe cu litera ''​F''​ trebuie să privim lucrurile altfel. Urmărind textul putem observa că prenumele sunt precedate fie de caracterul spațiu (//blank//) fie de caracterul minus (''​-''​). Pentru început vom folosi expresia regulată ''​%%[ -]F%%''​ care face match pe caracterul spațiu sau minus urmat de caracterul ''​F''​ majusculă. Comanda aferentă este: Dacă vrem în schimb să selectăm studenții al căror prenume începe cu litera ''​F''​ trebuie să privim lucrurile altfel. Urmărind textul putem observa că prenumele sunt precedate fie de caracterul spațiu (//blank//) fie de caracterul minus (''​-''​). Pentru început vom folosi expresia regulată ''​%%[ -]F%%''​ care face match pe caracterul spațiu sau minus urmat de caracterul ''​F''​ majusculă. Comanda aferentă este:
 <code bash> <code bash>
-student@uso:​~/​uso-lab/​06-auto/​00-basics$ grep '[ -]F' students.txt ​+student@uso:​~/​uso-lab/​06-auto/support/00-basics$ grep '[ -]F' students.txt ​
 ONEA I. Flavia-Katilina 311CC 7 6.5 4.33 ONEA I. Flavia-Katilina 311CC 7 6.5 4.33
 PLEȘEA Fl. Alexandru 311CC 9 9.25 7.9 PLEȘEA Fl. Alexandru 311CC 9 9.25 7.9
Line 102: Line 102:
 CHIȚESCU E. Bogdan-Florentin 315CC 9 7.75 6.89 CHIȚESCU E. Bogdan-Florentin 315CC 9 7.75 6.89
 </​code>​ </​code>​
-Observăm, însă, că se face match și pe șirul ''​Fl.''​ și pe șirul ''​F.''​ reprezentând inițiale. Știm că un prenume conține doar litere mici și că **nu** se încheie cu punct (''​.'',​ //dot//). Atunci extindem expresia regulată de mai sus la expresia ''​%%[ -]F[a-z]+[^\.]%%''​. Expresia regulată face match pe un șir care:+Observăm, însă, că se face match și pe șirul ''​Fl.''​ și pe șirul ''​F.''​ reprezentând inițiale. Știm că un prenume conține doar litere mici și că **nu** se încheie cu punct (''​.'',​ //dot//). Atunci extindem expresia regulată de mai sus la expresia ''​%%[ -]F[a-z]\+[^\.]%%''​. Expresia regulată face match pe un șir care:
   * începe cu unul dintre caracterele spațiu (//blank//) sau minus (''​-''​);​   * începe cu unul dintre caracterele spațiu (//blank//) sau minus (''​-''​);​
   * continuă cu litera ''​F''​ (majusculă)   * continuă cu litera ''​F''​ (majusculă)
Line 118: Line 118:
 Astfel, comanda ''​grep''​ pentru a extrage studenții al căror prenume începe cu litera ''​F''​ este Astfel, comanda ''​grep''​ pentru a extrage studenții al căror prenume începe cu litera ''​F''​ este
 <code bash> <code bash>
-student@uso:​~/​uso-lab/​06-auto/​00-basics$ grep '[ -]F[a-z]\+[^\.]'​ students.txt ​+student@uso:​~/​uso-lab/​06-auto/support/00-basics$ grep '[ -]F[a-z]\+[^\.]'​ students.txt ​
 ONEA I. Flavia-Katilina 311CC 7 6.5 4.33 ONEA I. Flavia-Katilina 311CC 7 6.5 4.33
 EPURE P. Andi-Florin 314CC 8 9.5 3.67 EPURE P. Andi-Florin 314CC 8 9.5 3.67
Line 205: Line 205:
 Kernel Interface ​ Kernel Interface ​
 Iface MTU RX-OK Iface MTU RX-OK
-eth0 1500 2029+eth0 1500 1955
 lo 65536 359 lo 65536 359
 </​code>​ </​code>​
Line 332: Line 332:
    
 === Constructia while read === === Constructia while read ===
 +
 +Creați un nou script ​ ''​extract-name''​ cu conținutul de mai jos:
 +<file Bash>
 +#!/bin/bash
 +
 +IFS=','​
 +while read name group final_grade test_grade practical_grade;​ do
 +    echo "​$name"​
 +done < students.csv
 +</​file>​
  
 Pentru parsare în shell folosim construcția ''​%%while read ...%%''​. Construcția este urmată de numele variabilelor în care vom reține câmpurile parsate din cadrul fiecărei linii. Folosim la intrare fișierul ''​students.csv''​ aflat în directorul părinte; este un fișier în format CSV (//Comma Separated Values//) folosind ca separator caracterul virgulă ('','',​ //comma//). Pentru a extrage doar numele studenților din fișierul de intrare vom rula scriptul ''​extract-name'':<​code>​ Pentru parsare în shell folosim construcția ''​%%while read ...%%''​. Construcția este urmată de numele variabilelor în care vom reține câmpurile parsate din cadrul fiecărei linii. Folosim la intrare fișierul ''​students.csv''​ aflat în directorul părinte; este un fișier în format CSV (//Comma Separated Values//) folosind ca separator caracterul virgulă ('','',​ //comma//). Pentru a extrage doar numele studenților din fișierul de intrare vom rula scriptul ''​extract-name'':<​code>​
Line 353: Line 363:
 Informații și pe [[http://​en.wikipedia.org/​wiki/​Internal_field_separator|Wikipedia]]. Informații și pe [[http://​en.wikipedia.org/​wiki/​Internal_field_separator|Wikipedia]].
 </​spoiler>​ </​spoiler>​
- 
-Să extindem scriptul pentru a afișa și numele și grupa. Conținutul noului script va fi: 
-<file Bash> 
-#!/bin/bash 
- 
-IFS=','​ 
-while read name group final_grade test_grade practical_grade;​ do 
-    echo "​$name,​$group"​ 
-done < students.csv 
-</​file>​ 
  
 Pașii de mai sus puteau fi realizați și cu ajutorul comenzii ''​cut''​. Dar, în cazul parsării folosind construcția ''​while read''​ avem două avantaje: Pașii de mai sus puteau fi realizați și cu ajutorul comenzii ''​cut''​. Dar, în cazul parsării folosind construcția ''​while read''​ avem două avantaje:
uso/laboratoare/new/06-auto/basics.1573109476.txt.gz · Last modified: 2019/11/07 08:51 by costin.carabas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0