Pași
- scripturi shell
- shebang:
#!/bin/bash
- permisiunea de executare:
chmod +x script
- parametri:
$1
, $2
, �
- atribuiri: ex.
a="un text"
if ...; then ...; fi
for var in `seq 1 10`; do ...; done
for f in `ls`; do cat $f; done
- Detalii suplimentare despre bash gasiti aici.
- expresii regulate
- grep
- sed
- awk
Expresii regulate
- regulat vs regular (�regular� e �false friend� / arhaism)
- secvențe speciale:
.
= orice caracter
[...]
= clasă de caractere (o poziție, oricare dintre caracterele enumerate) - ex. [abf-h13]
[^...]
= orice cu exceptia caracterelor enumerate
^
/ $
= �nceput / sf�rșit de buffer (text)
\<
/ \>
= �nceput / sf�rșit de cuv�nt
- grupare:
(...)
- alternare:
|
(�sau�)
- repetiții:
*
= 0 sau mai multe apariții
+
= 1 sau mai multe apariții
?
= 0 sau 1 apariții
N
= exact N apariții
{min,max}
= �ntre min și max apariții, oricare poate lipsi (ex. a{,3}
= maxim 3 apariții ale lui a
)
- Online regex tester
grep
- extrage dintr-un text liniile ce conțin patternul dat
- sintaxa:
grep [optiuni] pattern [fisier]
- dacă
fisier
nu e transmis, lucrează pe STDIN
- exemplu:
sed --help|grep -P '[aeiou]{2}'
=> liniile din manualul sed ce conțin minim două vocale consecutive
- parametri:
- extragere exclusiv match, nu toata linia:
-o
- case-insensitive (nu distinge litere mari de litere mici):
-i
- returnare linii care NU fac match:
-v
- recursiv:
-R
- sintaxa PCRE:
-P
sed
- procesează liniile dintr-un text (permite substituții)
- sintaxa:
sed [optiuni] expresie [fisier]
- exemplu:
sed s/da/nu/g -i fisier.txt
=> sunt �nlocuite toate secvențele �da� cu �nu� �n fișierul fisier.txt
- expresie:
[operatie]/pattern/[pattern2/]sufix
- operatie:
s
= substituție (trebuie specificat și pattern2/
, care poate referi grupuri cu \0
, \1
etc. - \0
este primul grup)
- sufix:
g
= global
- parametri:
- procesare inline a fisierului dat parametru:
-i
- sintaxa PCRE:
-r
awk
- procesează un text ca tabel delimitat de spații (coloane)
- sintaxa:
awk 'program' fisier
- parametri:
-f fis
: preluare program din fișierul fis
-F<c>
: folosește ca separator caracterul <c>
(�n loc de whitespace)
- structura �program�:
selector bloc
- selectori (condiții)
- regex:
/.../
- speciali:
BEGIN
(�nainte de prima linie), END
(după ultima linie)
- operatori similari cu C (
||
, &&
, !
, (...)
)
- blocuri:
{...}
(lipsa bloc = print
)
- conțin instrucțiuni separate prin
;
- mai multe perechi
selector bloc
vor fi separate de enter (��)
- variabile predefinite:
NR
: numărul de ordine al liniei curente
NF
: numărul de c�mpuri (coloane) �n linie
$1
, $2
, �: valorile din colonele 1, 2, .. ($0
= toată linia)
OFS
: separatorul c�mpurilor de ieșire
- funcții:
length(s)
: lungimea șirului s
substr(s, idx, len)
: subșirul din s
de la poziția idx
de lungime len
index(s, sub)
: poziția subșirului sub
�n șirul s
- instrucțiuni:
print ... [>fis]
: afișare pe ecran (sau scriere �n fișierul fis
dacă se dă)
- valorile sunt separate de
OFS
, default spațiu
var = val
: asignare de valori
if
, for
, while
similare cu cele din C
- exemple:
- afișarea primei �coloane� din fișierul
fis
: awk '{print $1}' fis
- afișarea primului cuv�nt din liniile de 3 cuvinte care au ultimul cuvant
aaa
: awk 'NF == 3 && $NF == "aaa" {print $1}' fis
awk �length>5 {x[++n]=$0;}
END {for ( ; n>=0; n�) print x[n];}� nume_fis
Probleme
- grep:
- Găsiți toate liniile care conțin cuvantul �cat� dintr-un fișier dat.
- Găsiți toate liniile care �ncep cu un cuv�nt cu prefixul �ing� dintr-un fișier dat.
- Găsiți toate liniile cu număr impar de caractere dintr-un fișier dat.
- Extrageți cuvintele cu 3 consoane consecutive dintr-un text.
- sed:
- Prefixați fiecare linie dintr-un fișier cu �abc�.
- Inlocuiți fiecare linie goală dintr-un fișier cu �empty�.
- Convertiți taburile �n 3 spații �ntr-un text dat.
- Rotiți cu o poziție fiecare triplet de caractere dintr-un fișier.
- awk:
- Sa se afiseze DOAR numele si prenumele utilizatorilor connectati la server
- sa se numere cati utilizatori dintr-o anumita grupa sunt conectati la server si sa se afiseze mesajul: "Din grupa xxxx sunt nnnn utilizatori conectati"
- xxxx - identificatorul grupei
- nnnn - numarul de utilizatori din grupa respectiva
- se foloseste 'who'
- D�ndu-se un fișier �n care fiecare linie conține cel puțin două numere separate de spații, calculați următoarele:
- suma primelor două numere de pe fiecare linie
- suma primelor două numere de pe liniile impare
- suma primelor două numere de pe liniile impare și cu mai mult de 5 numere
- suma numerelor din prima coloană a fișierului
- suma tuturor numerelor din fișier
- Afișați prima zi din săptăm�nile care au toate zilele �n luna curentă (calendar:
ncal -MC
).
- Să se afișeze �utilizatorul � are shell-ul �� pentru toți utilizatorii care au home folder-ul �nafara
/home
(sed
și/sau awk
).
- Să se scrie o comandă shell care afișează o statistică a numărului de procese per utilizator folosind comenzile
ps
, awk
(sau cut
), sort
și uniq
.
- Probleme suplimentare gasiti aici