Exercitii suplimentare
1)
if [ $# -eq 2 ]
then
dir=$1
ext=$2
if test -d "$dir"
then
files=`ls -1a $dir | grep ".$ext$"`
numbers=0
digits=0
for file in $files
do
fis=`cat $dir/$file`
echo $file
for line in $fis
do
if [[ $line =~ ^[0-9]+$ ]]
then
numbers=`expr $numbers + 1`
curent=${#line}
digits=`expr $digits + $curent`
fi
done
done
echo $digits
echo $numbers
else
echo "Nu este director"
exit 2
fi
else
echo "Usage $0 <cale> <ext>"
exit 1
fi
2)
Sa se scrie un shell script care primeste in linia de comanda nume de cale. Daca nu exista cel putin un argument, se afiseazsa un mesaj de utilizare si se incheie executia. Pentru fiecare argument care nu este cale de director, se afiseaza cate un mesaj. Se parcurge fiecare director dat in linia de comanda si, pentru fiecare fisier intalnit, se numara cate linii cu propozitii contine. O propozitie incepe cu majuscula si contine doar litere sau caracterul spatiu. Se calculeaza si se afiseaza numarul total de linii cu propozitii, pentru toate directoarele date.
Se calculeaza si se afiseaza numarul de legaturi simbolice din fiecare director dat, de aceasta data fara a parcurge directorul.
if test $# -lt 1
then
echo "Nu sunt suficiente argumente"
exit 1
else
totalLinii=0
totalLegaturiSimbolice=0
for i
do
if ! test -d $i
then
echo "$i nu este director"
else
legaturiSimbolice= $(find $i -type l | wc -l)
echo "Legaturi simbolice $i : $legaturiSimbolice"
totalLegaturiSimbolice= `expr $totalLegaturiSimbolice + legaturiSimbolice`
for file in `find $i`
do
if test -f $file
then
contor=0
n=`cat $file | grep -E '^[A-Z][a-zA-Z, ]+$' | wc -l`
echo "$file numar linii: $n"
totalLinii=`expr $totalLinii + $n`
fi
done
fi
done
echo "Total linii: $totalLinii"
echo "Total legaturi simbolice: $totalLegaturiSimbolice"
fi
3)
Sa se scrie un shell script care primeste un fisier file in linia de comanda. Daca nu exista un argument, se afiseaza mesaj de utilizare si se incheie executia. Se citest siruri de caractere de la tastatura(stdin) pana la intalnirea sirului "End". Se afiseaza acele siruri din lista ce reprezinta numere intregi strict pozitive pe masura ce sunt introduse. Se calculeaza suma numerelor care au cel putin 3 cifre si se afiseazsa aceasta suma. Daca file reprezinta numele unui fisier obisnuit, se scrie in file suma. Daca nu, se afiseaza un mesaj de eroare: file nu este fisier obisnuit.
if test $# -lt 1
then
echo "Avem nevoie de cel putin un argument"
exit 1
else
suma=0
while read linie
do
x=`echo "End"`
if test "$linie" = "$x"
then
break
fi
numere=`echo $linie | grep -E '[-]?[1-9]+[0-9]*$'`
if test "$linie" = "$numere"
then
if test $numere -gt 0
then
echo "Numarul pozitiv: $numere"
fi
if test $numere -gt 99
then
suma=`expr $suma + $numere`
fi
if test $numere -lt -99
then
suma=`expr $suma + $numere`
fi
fi
done
if ! test -f $1
then
echo "$1 nu este un fisier obisnuit"
else
echo $suma>$1
fi
fi
4)
Sa se scrie un shell script. Se primesc doua argumente. Primul trebuie sa fie un director, iar al doilea un fisier obisnuit, de output. Sa se caute in toata structura arborescenta de subdirectoarele a directorului primit ca parametru, acele fisiere obisnuite care au numele de forma "log.an.luna.zi.log", unde an este intre 1950-2019, luna 1-9, ziua 10-29. Pentru aceste fisiere sa se determine numarul de linii, dimensiunea, ultimele 5 linii si permisiunile acestuia. Toate acestea vor fi printate in fisierul de output.
if test $# -lt 2
then
echo "Trebuie doua argumente"
exit 1
else
if ! test -d $1
then
echo "Primul argument trebuie sa fie director"
exit 1
fi
if ! test -f $2
then
echo "Al doilea argument trebuie sa fie un fisier obisnuit"
exit 1
fi
for file in `find $1`
do
if test -f $file
then
x=`echo $file | grep -E 'log.(19[5-9][0-9])|(20[0-1][0-9]).[1-9].[1-2][0-9].log'`
if test "$x" = "$file"
then
numarLinii=`cat $file | wc -l`
dimensiune=`cat $file | wc -c`
ultimeleLinii=`cat $file | tail -n 5`
if test -w $file
then
W="Has write permision"
else
W="Does not have write permision"
fi
if test -r $file
then
R="Has read permision"
else
R="Does not have read permision"
fi
if test -x $file
then
X="Has execute permision"
else
X="Does not have execute permision"
fi
echo "Fisierul $file: numarLinii:$numarLinii
dimensiune:$dimensiune
ultimele 5 linii:$ultimeleLinii
permisiuni:$W
$R
$X">>$2
fi
fi
done
fi
sol2
#director toate fisierele al caror nume indeplineste un regex
#log.an-luna-zi.log
#an = 1950-2019
#luna = 1-9
#zi = 10-29
#arg2 = fisierul de iesire
#permisiuni - nr linii - dimensiune
#ultimele 5 linii din fisier
if [[ ! $# -eq 2 || ! -d $1 || ! -f $2 ]]
then
echo "Usage ./$0 <dir> <fis_out>"
else
dir=$1
out=$2
for file in `ls -1a $dir`
do
if [[ -d $dir/$file || ! $file =~ log.((19[5-9][0-9])|(20[0-1][0-9])).[1-9].(1|2)[0-9].log ]]
then
continue
else
[ -w $dir/$file ] && W="Write = yes" || W="Write = No"
[ -x $dir/$file ] && X="Execute = yes" || X="Execute = No"
[ -r $dir/$file ] && R="Read = yes" || R="Read = No"
size=`cat $dir/$file | wc -c`
lines=`cat $dir/$file | wc -l`
last=`tail -n 5 $dir/$file`
echo -e "$file\n$W $R $X - $lines - $size\n$last" >> $out
fi
done
fi
5)
#!/bin/sh
#Sa se scrie un shell. Dir, fisOutput, limita. Scriptul parcurge directorul, doar la primul nivel. Pentru fiecare fisier
#care contine in numele sau cuvantul log si are extensia .txt.
#Aceste fisiere au liniile in forma urmatoare
#username: luna.zi.IP
#cale fisier
#username: incepe cu litera mica, litere mici, litere mari, cifre, caracterul ".", "_"
#luna: 0-5
#zi: 1-19
#IP: a.b.c.d ; a:0-199; b:0-99 ; c:0-9 ; d: 200-239
#limita 0-99
#Daca liniile impare respecta restrictiile, se vor afisa in fisierul de output calea fisierului si data ultimei modificari
#Altfel, se vor numara si se va da un mesaj de avertizare daca numarul acesta este mai mare ca limita primita la stderr
if ! test $# -eq 3
then
echo "Trebuie sa fie 3 parametri";
exit 1
fi
if ! test -d $1
then
echo "Primul argument trebuie sa fie director"
exit 1
fi
if ! test -f $2
then
echo "Al doilea argument trebuie sa fie un fisier obisnuit"
exit 1
fi
if test $3 -lt 0
then
echo "limita trebuie sa fie intre 0 si 99"
exit 1
fi
if test $3 -gt 99
then
echo "Limita trebuie sa fie intre 0 si 99"
exit 1
fi
numar=0
for file in `find $1`
do
if test -f $file
then
x=`echo $file | grep -E '[.]*(log)+[.]*[.txt]$'`
if test "$x"="$file"
then
while read line1 && read line2
do
chestii=`echo $line | grep -E '^[a-z][a-zA-Z._]*.[0-5].(([1-9])|(1[0-9])).(([0-9])|([1-9][0-9])|(1[0-9][0-9])).[0-9].(2[0-3][0-9])$'`
if test "$chestii"="$line1"
then
echo "$line2">>$2
else
numar=`expr $numar +1`
fi
done <$file
fi
fi
done
if test $numar -gt $3
then
echo "Avertizare"
fi