Követelmények
Gyakorlat
A gyakorlat látogatása kötelező!
A gyakorlaton teljesítendő 1 db 50 pontos zárthelyi dolgozat (ZH).
A félév aláíráshoz teljesítendő minimális pontszám 25. A feladatok
megoldásához semmilyen segédanyag sem használható.
ZH-t az írhat aki,
- az 1 db kötelező programot megírta, és időben leadta.
- a gyorsteszteken összesen elérhető pontszámoknak legalább a felét megszerezte. A gyorsteszten elért eredmények a félév végi pontszámba nem számítanak bele. A gyorstesztek kb. 10 percesek és a gyakorlaton addig elhangzott összes témát felölelik.
Előadás
Az előadás követelményei megtalálhatóak
az előadó honlapján.
Reguláris kifejezések
Feladat
Az aktuális könyvtár közönséges állományainak hosszú (bővített) kilistázása.
ls -l | egrep ’^-’
Feladat
A tulajdonos által futtatható közönséges állományok hosszú kilistázása az
aktuális könyvtárban.
ls -l | egrep ’^-..x’
Feladat
Az olyan sorok megjelenítése, amelyek tartalmaznak (legalább) egy
nagybetűt (és esetleg azon kívül még bármi egyebet is).
egrep ’[A-Z]’ szovegvagy
egrep ’[A-Z]{1}’ szoveg
vagy
egrep ’[A-Z].*’ szovegvagy
egrep ’[A-Z]+’ szoveg
Feladat
Azoknak a soroknak a megjelenítése, amelyek tartalmaznak egy nagybetűt, majd valahol később tartalmaznak egy számjegyet is.
egrep ’[A-Z].*[0-9]’ szoveg
Feladat
Azoknak a nem üres soroknak a megjelenítése, amelyek csak kisbetűket és szóközt tartalmaznak.
egrep ’^[ a-z]+$’ szoveg
Feladat
Listáztassuk ki a /dev könyvtárból azokat a fileokat amelyek pontosan 1 db
számjegyet tartalmaznak.
ls /dev | egrep '^[^0-9]*[0-9][^0-9]*$'
AWK
Feladat
Írassuk ki azokat a könyvtárakat amelyek láncszama > 4.
ls -l | awk '$0 ~ /^d/ && $2 > 4'Ha csak a könyvtár nevét szeretnénk
ls -l | awk '$0 ~ /^d/ && $2 > 4 {print $NF}'
Feladat
Írassuk ki az aktualis időt úgy, hogy az óra után álljon, hogy "ora" a perc utan
hogy "perc". Pl: 11 ora 13 perc.
date | awk '{print $4}' |
awk 'BEGIN {FS=":"} {print $1, "ora", $2, "perc"}'
Feladat
Számoltassuk össze, hogy az alkönyvtárak láncszáma összesen mennyi.
ls -l |
awk '$0 ~ /^d/ { d+=$2; n++}
END { print "alkonyvtarak szama: ", n
print "lancszam osszesen: ", d}'
Feladat
Számoljunk átlagot! Tfh. az input minden sora köv képpen néz ki: NÉV;EREDMÉNY
#!/bin/awk -f
BEGIN { FS=";" }
{ ossz += $2 }
END { print ossz / NR }
Feladat
Tfh. az orosz nevek mind nagybetűvel kezdődnek, és "vics"-re végződnek. Írjunk programot, ami
kiírja az Anna Kareninában szereplő orosz neveket.
#!/bin/awk -f
{
for ( i = 1; i <= NF; i++ ) {
if ( $(i) ~ /^[A-Z][a-z]*vics$/ ) print $i
}
}
Feladat
Keressük meg egy file leghosszabb szavát!
#!/bin/awk -f
{
for ( i = 1; i <= NF; i++ ) {
if ( length($i) > maxl ) {
maxl = length($i)
max = $i
}
}
}
END {
print maxl, max
}
Feladat
Készítsünk szóstatisztikát! Listázzuk ki, hogy melyik szó hányszor fordult elő az inputban.
#!/bin/awk -f
{
for ( i = 1; i <= NF; i++ ) {
t[$i]++
}
}
END {
for ( elem in t ) {
print elem, t[elem]
}
}
Feladat
Írjunk AWK programot amely a bemenetet forditott sorrendben írja ki.
{line[NR] = $0}
END { for (i=NR; i>0; i--) print line[i]}
Feladat
Írassuk ki a /dev könyvtár csoportjait és, hogy az egyes csoportokhoz hány fájl tartozik.
ls -l /dev |
awk ' {group[$4]++}
END {for ( g in group) print g, group[g]}'
Feladat
U.a. mint az előbb, csak a szám szerinti növekvő sorrendben.
ls -l /dev |
awk ' {group[$4]++} \
END {for ( g in group) print group[g], g }' |
sort -gb |
awk '{print $2, $1}'
Feladat
Listázzuk ki a könyvtár tartalmát úgy, hogy a páros sorok beli szavak fordított sorrendben
jelenjenek meg, míg a páratlan sorok normálisan!
ls -l |
awk 'NR %2 == 0 {for ( i=NF; i>0 ; i--)
printf("%s ", $i); printf("\n") }
NR %2 == 1 {print}'
Feladat
Hány fájlra van írasi jogod?
BEGIN { o= 0; g = 0; a = 0;
user = "user"; group = "group" }
/^..w......./ && $3 == user {o++}
/^.....w..../ && $3 != user && $4 == group {g++}
/^........w./ && $3 != user && $4 != group {a++}
END {
print "o= ",o," g= ", g, " a= ", a, " sum= ", o+g+a
}
Shell programozás
Feladat
Az átadott parametereket soroljuk 3 kategóriába: könyvtár, regfájl és egyéb.
#!/bin/bash
for i; do
if test -d $i; then
echo konyvtar : $i
elif test -f $i ; then
echo regfile: $i
else
echo egyiksem: $i
fi
done
Feladat
Írjunk shellszkriptet, mely végigmegy az összs parameteren, es nem hasznal új változót!
#!/bin/bash while test $# -gt 0; do echo A parameter neve: $1 echo Parameterek szama: $# shift done
Feladat
Írjunk shellszkriptet, amely az 0 = mx + b egyenletet oldja meg: m -et es b-t parameterül kapja.
usage="usage: egyenlet par1 par2"
if test $# -lt 2
then echo $usage
exit 0
fi
if test $1 -eq 0
then
if test $2 -eq 0
then
echo "vegtelen sok megoldas van"
exit 1
else
echo "nincs megoldas"
exit 1
fi
fi
x=`expr 0 - $2 / $1`
echo x=$x
Feladat
Hányadik napja van az évnek (szökőéveket nem számítva...)
#!/bin/bash
ho=`date|awk '{print $2}'`
case $ho in
Jan) nap=0;;
Feb) nap=31;;
Mar) nap=59;;
Apr) nap=90;;
May) ....stb
esac
n=`date|awk '{print $3}'`
let "nap += n"
echo napok szama eddig: $nap
Feladat
Írjunk olyan shellszkriptet, ami csak számokat fogad el paraméterként! Tipp:
valami akkor szám, ha vagy nem egyenlő 0-val, vagy egyenlő 0-val. Másik tipp:
valami akkor szam, ha hozzá tudunk adni 1-et hiba nélkül.
#!/bin/bash
for i;
do
test "$i" -ne 0 -o "$i" -eq 0 2>/dev/null
if test $? -ne 0
then
echo Usage: only integers are allowed!
exit 1
fi
echo $i OK
done
echo all OK
Feladat
Készitsünk shell skriptet, ami a parametereiben megadott számokon elvégzi az
első paramétereben átadott műveletet ( +, -, *, / ).
Pl: osszead + 1 2 43 3
#!/bin/bash muv=$1 sum=0 shift for i; do let "sum $muv= $i" done echo $sum
Feladat
Ha van az aktualis alkönyvtárban htm kiterjesztesű fájl, akkor nevezzük át azokat
html kiterjesztésűre, ha nincs, írjuk ki, hogy nincs.
#!/bin/bash
LS=`ls | awk '/.*\.htm$/'` #LS-be az osszes htm
if test -z "$LS" #Itt ki is lep, ha LS ures
then
echo nincs htm
exit
fi
for i in *.htm; do #vegig megy a htm-eken
mv $i ${i}l
#vagy akár: mv "$i" "$i"l
done
Feladat
Írjunk beszélgető programot!
#!/bin/sh
echo "Please talk to me ..."
while true
do
read INPUT_STRING
case $INPUT_STRING in
hello)
echo "Hello yourself!"
;;
bye)
echo "See you again!"
break
;;
f*)
echo "nasty word!"
;;
*)
echo "Sorry, I don't understand"
;;
esac
done
echo
echo "That's all folks!"
Feladat
Nevezzük át az összes .html kiterjesztésű fájlt .htm kiterjesztésűre!
#! /bin/bash
for i in *.txtt
do
if [ -f $i ]
then
name=`echo $i | cut -d. -f1`
echo $i to ${name}.txt
fi
done
Feladat
Írjunk scriptet, amely kiírja az aktuális könyvtárban található összes szöveges file tartalmát
#!/bin/bash
for x in *
do
if test -f $x && { file $x | grep "text"; } > /dev/null
then
echo $x tartalma:
cat $x
echo "----------------------"
fi
done
Feladat
Írjunk scriptet, amely kiírja az aktuális könyvtárban található összes szöveges file
tartalmát és közben számolja meg, hogy hány sorból állnak összesen
#!/bin/bash
OSSZESEN=0
for x in *
do
if test -f $x && { file $x | grep "text"; } > /dev/null
then
echo "------------" $x tartalma:
cat $x
SOR=`cat $x | wc -l`
OSSZESEN=$(( OSSZESEN + SOR ))
fi
done
echo $OSSZESEN
Feladat
Írjunk scriptet, amely kiírja a paramétereit és azok sorszámát.
#! /bin/bash
for ((i=1;i<=$#;i++))
do
echo $i. param : ${!i}
done
vagy
#! /bin/bash
PARCOUNT=$#
for ((i=1;i<=$PARCOUNT;i++))
do
echo $i. param : $1
shift
done
Feladat
Írjunk scriptet, amely megcseréli két fájlnak az első sorát.
A többi sor nem változik.
#!/bin/bash if [ -f $1 -a -f $2 ] then echo parameters ok. h1=`head -n 1 $1` h2=`head -n 1 $2` lc1=$(( `cat $1 | wc -l` - 1 )) lc2=$(( `cat $2 | wc -l` - 1 )) echo lc1 : $lc1 echo lc2 : $lc2 cp $1 $1.temp echo $h2 > $1 tail -n $lc1 $1.temp >> $1 cp $2 $2.temp echo $h1 > $2 tail -n $lc2 $2.temp >> $2 rm $1.temp rm $2.temp fi
English