This shows you the differences between two versions of the page.
uso:laboratoare:new:06-auto:basics [2019/11/07 08:36] costin.carabas [tr & sed] |
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 181: | Line 181: | ||
Am văzut în laboratoarele precedente cum putem extrage informații structurate pe linii și coloane folosind utilitarul **cut**. | Am văzut în laboratoarele precedente cum putem extrage informații structurate pe linii și coloane folosind utilitarul **cut**. | ||
<code Bash> | <code Bash> | ||
- | student@ubuntu:~/uso-lab/06-auto/00-basics$ cat /etc/passwd | cut -d':' -f1,6 | head -3 | + | student@ubuntu:~/uso-lab/06-auto/support/00-basics$ cat /etc/passwd | cut -d':' -f1,6 | head -3 |
root:/root | root:/root | ||
daemon:/usr/sbin | daemon:/usr/sbin | ||
Line 190: | Line 190: | ||
<code Bash> | <code Bash> | ||
- | student@ubuntu:~/uso-lab/06-auto/00-basics$ netstat -i | + | student@ubuntu:~/uso-lab/06-auto/support/00-basics$ netstat -i |
Kernel Interface table | Kernel Interface table | ||
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg | Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg | ||
Line 196: | Line 196: | ||
lo 65536 0 359 0 0 0 359 0 0 0 LRU | lo 65536 0 359 0 0 0 359 0 0 0 LRU | ||
- | student@ubuntu:~/uso-lab/06-auto/00-basics$ netstat -i | cut -d' ' -f1,2 | + | student@ubuntu:~/uso-lab/06-auto/support/00-basics$ netstat -i | cut -d' ' -f1,2 |
Kernel Interface | Kernel Interface | ||
Iface | Iface | ||
Line 202: | Line 202: | ||
lo | lo | ||
- | student@ubuntu:~/uso-lab/06-auto/00-basics$ netstat -i | awk -F' *' '{print $1,$2,$4}' | + | student@ubuntu:~/uso-lab/06-auto/support/00-basics$ netstat -i | awk -F' *' '{print $1,$2,$4}' |
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 239: | Line 239: | ||
Dorim sa facem o sortare numerica descrescatoare după notă, urmata de o sortare alfabetică după grupă (adică să fie toate notele de 10 la început dar sortate în ordinea grupelor). Astfel, pentru a sorta intrările în ordinea notei, vom folosi separatorul '','' (virgulă, //comma//) și coloana a 3-a pentru cheie: | Dorim sa facem o sortare numerica descrescatoare după notă, urmata de o sortare alfabetică după grupă (adică să fie toate notele de 10 la început dar sortate în ordinea grupelor). Astfel, pentru a sorta intrările în ordinea notei, vom folosi separatorul '','' (virgulă, //comma//) și coloana a 3-a pentru cheie: | ||
<code Bash> | <code Bash> | ||
- | student@uso:~/uso-lab/06-auto/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | + | student@uso:~/uso-lab/06-auto/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv |
GEORGIU V. Alexandra-Maria,311CC,10,10,9.67 | GEORGIU V. Alexandra-Maria,311CC,10,10,9.67 | ||
MUȘATESCU V. Alexandru-Petrișor,311CC,10,8.5,9 | MUȘATESCU V. Alexandru-Petrișor,311CC,10,8.5,9 | ||
Line 257: | Line 257: | ||
</file> | </file> | ||
<code Bash> | <code Bash> | ||
- | student@uso:~/uso-lab/06-auto/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | wc -l | + | student@uso:~/uso-lab/06-auto/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | wc -l |
93 | 93 | ||
- | student@uso:~/uso-lab/06-auto/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | uniq | wc -l | + | student@uso:~/uso-lab/06-auto/support/00-basics$ sort -t ',' -k 3,3nr -k 2,2 students.csv | uniq | wc -l |
92 | 92 | ||
- | student@uso:~/uso-lab/06-auto/00-basics$ uniq students.csv | wc -l | + | student@uso:~/uso-lab/06-auto/support/00-basics$ uniq students.csv | wc -l |
93 | 93 | ||
</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> | ||
- | student@uso:~/uso-lab/06-auto/00-basics$ ./extract-name | + | student@uso:~/uso-lab/06-auto/support/00-basics$ ./extract-name |
VLĂDUȚU I. Liviu-Alexandru | VLĂDUȚU I. Liviu-Alexandru | ||
GEORGIU V. Alexandra-Maria | GEORGIU V. Alexandra-Maria | ||
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: |