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