You are on page 1of 14

Решени задачи

за колоквиум

1. Креирај именик vezbi во твојот именик, а потоа од тековниот именикот


ископирај ги сите извршни датотеки во него.

# Kopiranje na site izvrsni datoteki


mkdir vezbi
pateka="/home/knoppix/Desktop/"
for i in `ls $pateka`
do
if [ -f $i -a -x $i ]
then
cp $i $pateka/vezbi
fi
done

2. Направете скрипта која ги печати имињата на сите поддиректориуми од


домашниот директориум, а на крај печати “ Brojot na poddirektoriumi e n”, каде n
е нивниот број.

echo "Poddirektoriumite na domasniot direktorium se:"


cd $HOME
echo
br=0
for i in `ls`
do
if [ -d $i ]
then
echo $i
br=`expr $br + 1`
fi
done
echo
echo "Brojot na poddirektoriumite e: $br."

3. Направете скрипта која на секои 10 секунди ќе проверува дали корисникот


student е најавен на системот, се додека тој не се најави (со користење на
наредбата sleep n , каде n е бројот на секунди).

# v=`who -q|grep -c " student "`


koj="vole"
v=`grep -c "$koj" najaveni`
while [ $v = 0 ]
do
echo "$koj ne e najaven na sistemot."
v=`grep -c "$koj" najaveni`
sleep 3
done
echo
echo "$koj e najaven na sistemot."

1
4. Направете скрипта која ги печати имињата на сите извршни датотеки од
тековниот директориум во датотека izvrsni.txt, а на крај го печати и нивниот
број.

br=0
for i in `ls -l`
do
if [ -f $i -a -x $i ]
then
echo $i >> izvrsni.txt
br=`expr $br + 1`
fi
done
echo "Brojot na datotekite e: $br." >> izvrsni.txt

5. Да претпоставиме дека сакате да испратите едно исто писмо на повеќе луѓе со


корисничко име на системот на кој сте најавени, со тоа што при обраќање кон
личноста сакате да го користите нејзиното лично име, кое е исто како
корисничкото. Направете скрипта која ќе користи две датотеки: една iminja.txt во
која се наоѓаат имињата на вашите пријатели и една poraka.txt во која наместо
името стои IME, и со едно извршување на скриптата писмото ќе биде испратено
до сите, со лично обраќање до секого.

for i in `cat iminja.txt`


do
touch $i.proba
echo "Zdravo $i" >> $i.proba
cat poraka.txt >> $i.proba
mail $i < $i.proba
done

6. Да се најде колку меморија зафаќаат датотеките во тековниот директориум


кои имаат наставка .txt.

c=0
sum=0
for i in `ls -l *.txt`
do
c=`expr $c + 1`
if [ $c -eq 5 ]
then
sum=`expr $sum + $i`
fi
if [ $c -eq 9 ]
then
c=0
fi
done
echo "Vkupnata golemina e: $sum"
echo
echo "So gotova funkcija goleminata e: `du -bc *.txt | tail -1 | awk
'{ print $1 }'`" # Resenieto na Boki

2
7. Да се направи скрипта во која ќе се бришат интерактивно извршните
датотеки, и на крајот да се прикаже бројот на избришаните и неизбришаните
датотеки.

v=0
for i in `ls`
do
if [ -f $i -a -x $i ]
then
v=`expr $v + 1`
rm -i $i
fi
done
v1=0
for i in `ls`
do
if [ -f $i -a -x $i ]
then
v1=`expr $v1 + 1`
fi
done
echo "Brojot na izbrisani izvrsni datoteki e: `expr $v - $v1`"
echo "Brojot na neizbrisani izvrsni datoteki e: $v1"

8. Да се најдат (временски) најновите 7 датотеки во тековниот директориум


чиешто име започнува со poc.

i=7
s="poc"
echo "-------------------------------------------"
echo "Datoteki koi zapocnuvaat na $s se slednive"
echo "---------------Detalna Lista---------------"
echo
ls -l $s* | grep ^-.* | sort -k 7
echo
echo "-------------------------------------------"
echo "Znaci ima `ls -l $s* | grep ^-.* | wc -l` takvi datoteki."
echo "-------------------------------------------"
echo "Od koi najnovi $i se:"
ls -l $s* | grep ^-.* | sort -k 7 | tail -$i

9. Да се напише командна процедура која го испечатува следното:

12345
****
123
**
1
**
123
****
12345

3
i=5
while [ $i -ge 1 ]
do
j=1
if [ `expr $i % 2` -eq 1 ]
then
while [ $j -le $i ]
do
echo -n "$j"
j=`expr $j + 1`
done
echo " "
else
while [ $j -le $i ]
do
echo -n "*"
j=`expr $j + 1`
done
echo " "
fi
i=`expr $i - 1`
done
#
i=2
while [ $i -le 5 ]
do
j=1
if [ `expr $i % 2` -eq 1 ]
then
while [ $j -le $i ]
do
echo -n "$j"
j=`expr $j + 1`
done
echo " "
else
while [ $j -le $i ]
do
echo -n "*"
j=`expr $j + 1`
done
echo " "
fi
i=`expr $i + 1`
done

10. Напиши програма која ќе го прикаже бројот на сите корисници дефинирани


на системот, а потоа ќе прикаже колку корисници се моментално најавени.

echo
echo "Ova e brojot na site korisnici definirani na sistemot `who -a|
wc -l`."
echo
echo "Ova se korisnicite momentalno najaveni na sistemot:"
echo
who
echo "Ova e brojot na momentalno najavenite na sistemot: `who|wc
-l`."
11. Да се направи командна процедура која користејки FOR циклуси печати
стринг Dzvezda, а потоа печати ѕвезди на следниот начин:

4
$ ./dzvezda
Dzvezda
*
**
***
****
*****
*****
****
***
**
*

echo
echo "Dzvezda"
for i in "*" "**" "***" "****" "*****"
do
echo "$i"
done
for i in "*****" "****" "***" "**" "*"
do
echo "$i"
done

12. Да се направи скрипта која прво проверува дали во тековниот директориум


постои поддиректориум backup и доколку не постои го креира. Потоа сите
датотеки од тековниот директориум ги копира во директориумот backup при сто
им додава наставка .backup.

echo
echo "Tekovniot direktorium e `pwd`."
if [ -d backup ]
then
echo "Postoi datoteka backup i vo nea ke gi smestam
datotekite!"
else
echo "Kreiram datoteka backup..."
mkdir backup
fi
echo "Kopiram datoteki..."
for i in `ls`
do
if [ -f $i ]
then
cp $i backup/
fi
done
cd backup/
echo "Im dodavam nastavka .backup na datotekite..."
for i in `ls`
do
mv $i "$i.backup"
done
cd ..
13. Напиши програма која ќе формира две датотеки: една (datoteki) со имињата
на сите датотеки во тековниот именик и друга (imenici) со имињата на сите
именици во тековниот именик.

5
echo "Tekovniot direktorium e `pwd`."
for i in `ls`
do
if [ -f $i ]
then
echo $i >> datoteki
fi
done
for j in `ls`
do
if [ -d $j ]
then
echo $j >> imenici
fi
done

14. Со командата date може да се добие денешниот датум. Да претпоставиме


дека во вашиот (тековниот) директориум се наоѓаат 3 датотеки со имиња
neparen, paren, vikend. Да се направи скрипта која во деновите понеделник, среда
и петок ќе ја печати на екран содржината на датотеката neparen, во вторник и
четврток датотеката paren и во сабота и недела датотеката vikend.

echo "Tekovniot direktorium e `pwd`."


v=`date|cut -c1-3` # Moze i so v=`date|awk ‘{ print $1 }’`
case $v in
Mon)
cat neparen
;;
Tue)
cat paren
;;
Wed)
cat neparen
;;
Thu)
cat paren
;;
Fri)
cat neparen
;;
Sat)
cat vikend
;;
Sun)
cat vikend
;;
esac

15. Напиши скрипта која од секоја датотека со наставка .txt во тековниот именик
ќе ги додаде првите пет реда во датотека која се вика zaglavija.txt.

echo "Tekovniot direktorium e `pwd`."


for i in `ls *.txt`
do
head -5 $i >> zaglavija.txt
done

6
16. Да се направи скрипта која што од логираните корисници ќе ги прикаже
корисниците на кои што корисничкото име НЕ им почнува со i973. во опаѓачки
редослед.

echo "Ova se logiranite korisnici na koi korisnickoto ime ne im


pocnuva na i973."
echo
who | grep -v "^i973. " | sort -rk 1 | more
echo

17. Да се направи скрипта која датотеките од домашниот директориум, кои сите


корисници можат да ги извршуваат, ќе ги ископира во директориумот Zaednicki,
кој ќе се наоѓа исто така во домашниот директориум. Доколку директориумот
Zaednicki претходно постои, скриптата да го пребрише, во спротивно да го
креира.

if [ -d Zaednicki ]
then
echo "Postoi takov direktorium i go brisam..."
rm -r Zaednicki
fi
echo "Kreiram direktorium Zaednicki..."
mkdir Zaednicki

echo "Kopiram..."
for i in `ls -l | grep "^-........x " | awk '{ print $9 }'`
do
cp $i Zaednicki/
done

18. Да се направи скрипта која што ќе ги ископира сите датотеки од вашиот


home директориум во директориумот podDeset доколку нивниот број е помал од
10, а во спротивно во директориумот nadDeset.

br=0
for i in `ls`
do
if [ -f $i ]
then
br=`expr $br + 1`
fi
done
echo "Ima vo domasniot direktorium $br datoteki."
if [ $br -lt 10 ]
then
echo "Kreiram podirektorium podDeset..."
mkdir podDeset
echo "Kopiram..."
for i in `ls`
do
if [ -f $i ]
then
cp $i podDeset/
fi
done
fi
if [ $br -ge 10 ]

7
then
echo "Kreiram poddirektotium nadDeset..."
mkdir nadDeset
echo "Kopiram..."
for i in `ls`
do
if [ -f $i ]
then
cp $i nadDeset/
fi
done
fi

19. Да се изведе рекурзивно листање на домашниот именик на следниов начин:


прво се печатат датотеките и подимениците на тековниот именик, па потоа се
печати: “Vo imenikot imenik se naogjaat: f1,f2,…” (значи, преордер поминување на
домашниот директориум). Излезот треба да се наоѓа во датотеката listing.

cd $HOME
if [ -f listing ]
rm listing
fi
touch listing
echo "Vo imenikot $HOME se naogaat:" >> listing
ls -l >> listing
for i in `ls`
do
if [ -d $i ]
then
echo "" >> listing
echo "Vo imenikot $i se naogaat:" >> listing
ls -Rl $i >> listing
fi
done

20. Излистајте ги во посебна датотека сите датотеки во вашиот домашен


директориум кои се модифицирани во тековниот ден (потешка но
незадолжителна варијанта: модифицирани во последните 24 часа. Уште
потешка: наместо во домашниот директориум, во неговото дрво).

if [ -f modificirani ]
then
rm modificirani
fi
touch modificirani
mesec=`date | awk '{ print $2 }'`
datum=`date | awk '{ print $3 }'`
for i in `ls`
do
if [ -f $i ]
then
m=`ls -l $i | awk '{ print $6 }'`
d=`ls -l $i | awk '{ print $7 }'`
if [ $mesec = $m -a $datum = $d ]
then
echo $i >> modificirani
fi
fi
done

8
21. Направете, во вид на скрипта, команда за безбедно бришење. Датотеките
дадени како аргументи на скриптата не се отстрануваат, туку се преместуваат во
директориумот ~/gjubre.На крај, скриптата ги отстранува сите датотеки од овој
директориум кои се постари од еден ден.

mesec=`date | awk '{ print $2 }'`


datum=`date | awk '{ print $3 }'`
if [ -d ~/gjubre ]
then
rm -r ~/gjubre
fi
mkdir ~/gjubre
for i in $*
do
mv $i ~/gjubre
done
cd ~/gjubre
for j in `ls`
do
m=`ls -l $j | awk '{ print $6 }'`
d=`ls -l $j | awk '{ print $7 }'`
if [ ! $mesec = $m -o ! $datum = $d ]
then
echo "Ja brisam $j"
rm $j
fi
done

22. Напиши командна процедура која ќе креира именик stari во тековниот


именик и сите датотеки во тековниот именик кои не се од тековната година ќе
ги премести во именикот stari (може да ја користите наредбата date).

if [ -d stari ]
then
echo "Postoi imenik stari i go brisam!"
rm -r stari
fi
echo "Kreiram imenik stari!"
mkdir stari
pom=`date | awk '{ print $6 }'`
for i in `ls`
do
if [ -f $i ]
then
k=`ls -l $i | awk '{ print $8 }'`
if [ ! $pom = $k ]
then
cp $i stari/
fi
fi
done

23. Да се испечатат, една по една, сите датотеки поголеми од 100К во тековниот


директориум. Дајте му на корисникот опција да ја брише датотеката. Во logfile
да се испечатат имињата на сите избришани датотеки и времето на бришење.

touch logfile

9
for i in `ls`
do
if [ -f $i ]
then
k=`ls -l $i | awk '{ print $5 }'`
if [ $k -ge 100 ]
then
echo $i
echo "Dali sakas da ja brises $i (y/n): "
read odg
if [ $odg = "y" ]
then
echo "datoteka $i izbrisana na data `date`"
>> logfile
rm $i
fi
fi
fi
done

24. Да се отстранат сите коментари од скрипта чие име е аргумент на вашата


скрипта.

if [ $# -ne 1 ]
then
echo "Vnesi eden argument"
exit 1
fi
if [ ! -f $1 ]
then
echo "Ne postoi takva datoteka"
exit 1
fi
sed "s/#.*//" $1 > $1_
rm $1
cp $1_ $1
rm $1_

25. За секој активен процес да се излистаат сите негови деца.

spid=`ps -AF --no-heading | awk '{ print $2 }'`


sppid=`ps -AF --no-heading $i | awk '{ print $3 }'`

for i in $spid
do
br=1
echo "Na proces $i deca se:"
for j in $sppid
do
if [ $i = $j ]
then
g=`ps -AF --no-heading | head -$br | tail -1`
echo "$g"
br=`expr $br + 1`
else
br=`expr $br + 1`
fi
done
done

10
26. Направете скрипта која за секој активен процес прво го печати неговиот ID,
па бројот на неговиот татко, па ве прашува дали да го убие процесот, и во
зависност од одговорот изведува соодветна акција.

spid=`ps -AF --no-heading | awk '{ print $2 }'`

for i in $spid
do
echo $i
sppid=`ps -F --no-heading $i | awk '{ print $3 }'`
echo "proces: $i, tatko: $sppid"
echo "dali da go ubieme procesot? (d/n)"
read x
if [ $x = "d" ]
then
kill $pid
fi
done

27. Да се креира скрипта avtomat со следново својство: под претпоставка дека во


тековниот директориум постои скриптата skripta, која се повикува со еден
аргумент, скриптата avtomat ќе ја извршува skripta со аргумент кој го задава
корисникот за време на извршувањето на avtomat.. Извршувањето ќе се
повторува се додека корисникот не го внесе зборот kraj. Излезот од секое
извршување на skripta да се пренасочува во датотеката izlez.txt.
На пример, ако skripta го печати својот аргумент, тогаш ако кoрисникот ги
внесува последователно зборовите Denes, Utre, Zadutre, kraj, во датотеката izlez
треба да се наоѓаат зборовите Denes, Utre, Zadutre, секој во нов ред.

avtomat

if [ -f izlez.txt ]
then
rm izlez.txt
fi
touch izlez.txt
while true
do
echo "Vnesete argument za skriptata, a kraj za izlez!"
read odg
case $odg in
kraj) exit 0
;;
*) skripta $odg >> izlez.txt
;;
esac
done

skripta

echo $1

28. Направете програма која генерира процес дете кое испечатува матрица 5х5
од ѕвездички, т.е. ислезот треба да биде од облик:
$ process tatko, sega vleguvam vo process dete

11
$ proces dete
*****
*****
*****
*****
*****
$ pak sum vo process tatko

#include<stdio.h>
#include<sys/wait.h>

int main()
{
int i,j,pid;
pid=fork();
if(pid > 0)
{
printf("proces tatko, sekga vleguvam vo dete\n");
wait(NULL);
printf("pak sum vo process tatko\n");
}
else
if(pid == 0)
{
printf("proces dete\n");
for(i=1;i<=5;i=i+1)
{
for(j=1;j<=5;j=j+1)
printf("*");
printf("\n");
}
}
}

29. Да се направи програма во С во која во првите две наредби, се креираат нови


процеси. Потоа најстариот процес печати “Jas sum tatko na xxxx i yyyy”, a двата
процеса кои се директи деца на најстариот процес печатат “Jas sum prvoto dete”
и “Jas sum vtoroto dete”.

# include <stdio.h>

int main()
{
int pid1,pid2;
pid1=fork();
pid2=fork();

if((pid1>0) && (pid2>0))


{
printf(" Jas sum tatkotooo...so deca \n");
printf(" Dete1: %i \n Dete2: %i \n",pid1,pid2);
exit(0);
}

if((pid1==0) && (pid2>0))


{
printf("Jas sum dete1 \n");
exit(0);

12
}

if((pid1>0) && (pid2==0))


{
printf("Jas sum dete2 \n");
exit(0);
}

if((pid1==0) && (pid2==0))


{
printf("Jas sum dete na deteto1 \n");
exit(0);
}

30. Некои податочни бази користат датотеки во кои податоците се одделени со


запирки, после кои следи празно место. Потребно е секој ред од датотеката да се
сними во посебна датотека, именувана според првиот збор, при што доколку
зборот се повторува, името на датотеката да завршува со соодветен реден број,
почнувајќи од 0. Во датотеката сите зборови од соодветната линија одделени со
запирки се пишуваат во нов ред. На пример, ако влезната датотека е следнава:

John, Doe, 1555, Main St., Baltimore, MD 21228, (410) 222-3333,


Mary, Moe, 9899, Jones Blvd., Warren, NH 03787, (603) 898-3232,
Richard, Roe, 856, E. 7th St., New York, NY 10009, (212) 333-4567,
Sam, Roe, 956, E. 8th St., New York, NY 10009, (212) 444-5678,
Zoe, Zenobia, 4481, N. Baker St., San Franciso, SF 94338, (415) 501-1631,
Richard, Zenobia, 856, E. 7th St., New York, NY 10009, (212) 333-4567,

тогаш се креираат датотеките John, Mary, Richard1, Sam, Zoe, Richard2 , така што
во John се наоѓа
John
Doe
1555
Main St.
Baltimore
MD 21228
(410) 222-3333

концепт, не решение

x=-1
for i in john, doe, ny,
do
x=`expr $x + 1`
b=`expr $x % 3`

zbor=`echo $i | sed "s/,//"`

case $b in
0)
echo "Ime: $zbor"
echo $zbor >> $zbor
;;
1)
echo "Prezime: $zbor"

13
;;
2)
echo "Grad: $zbor"
;;
esac

done

14

You might also like