This shows you the differences between two versions of the page.
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: |