Gyakorlat Követelményei
-
Kötelező programok: (10+15 pont)
- Vezeték név szerint A-K-ig: 1. feladatsor
- Vezeték név szerint L-Z-ig: 2. feladatsor
- Megoldásokat a Bíró rendszerre kell feltölteni.
- Határidő: 13. hét vasárnap éjfél, egészen pontosan: 2010. 05. 02. 23:59:30
-
ZH: (25 pont) Az utolsó gyakorlaton számítógépes környezetben megírt feladatsor.
- Shell + AWK
- Fényképes igazolvány
- 1 alkalommal megismételhető (igazolt hiányzás, ill. nem szerezte meg az elérhető pontok felét). Külön időpontban irt "módosító" zh eredménye számít a pontozásban.
- A zárthelyi dolgozat 1 alkalommal megismételhető: 2010. május 19. (szerda) 9:00-10:00. Helye: Irinyi Kabinet 222-es terem.
Gyakorlat
Rodek Lajos gyakorlati jegyzeteRodek Lajos példái
További példák - 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 használ ú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.
#!/bin/bash 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 m=$1 b=$2 x=$(( 0 - b / m )) echo x=$x
Feladat
Hányadik napja van az évnek (szökőéveket nem számítva...)
#!/bin/bash ho=`date +%b` case $ho in jan) nap=0;; febr) nap=31;; mar) nap=59;; apr) nap=90;; esac n=`date +%d` nap=$((nap + n)) echo napok szama eddig: $napvagy :)
date +%b
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 *.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 $LS; do #vegig megy a htm-eken mv $i ${i}l #vagy akár: mv "$i" "$i"l done
Feladat
Nevezzük át az összes .html kiterjesztésű fájlt .htm kiterjesztésűre!
#! /bin/bash for i in *.html do if [ -f $i ] then name=`echo $i | cut -d. -f1` mv $i ${name}.htm fi 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
Írjunk scriptet, amely kiírja az aktuális könyvtárban található összes szöveges file nevét
#!/bin/bash for x in * do if test -f "$x" && { file "$x" | grep "text"; } > /dev/null then echo $x fi done
Feladat
Írjunk scriptet, amely kiírja az aktuális könyvtárban található összes szöveges file
nevét és hosszát valamint 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 SOR=`cat $x | wc -l` echo $x hossza: $SOR 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} donevagy
#! /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. else exit fi head1=`head -n 1 $1` head2=`head -n 1 $2` tlen1=$((`cat $1 | wc -l` - 1)) tlen2=$((`cat $2 | wc -l` - 1)) tail1=`tail -n $tlen1 $1` tail2=`tail -n $tlen2 $2` echo "$head1" > $2 echo "$tail2" >> $2 echo "$head2" > $1 echo "$tail1" >> $1
Feladat
Írjunk shellscriptet amelyik folamatosan figyeli a bejelentkezések számát.
A szám megváltozásakor írja ki a több vagy a kevesebb szót.
#!/bin/bash ido=${1:-5} elozo=`who | wc -l` for ((;;)); do aktualis=`who | wc -l` if test $aktualis -gt $elozo; then echo Tobb; elif test $aktualis -lt $elozo; then echo Kevesebb; fi; elozo=$aktualis sleep $ido; done
Feladat
Írj egy shellszkriptet amely a paramétereként megadott alkönyvtár állományainak
utolsó sorát összegyűjti az utolso.txt állományba.
#!/bin/bash rm utolso.txt 2> /dev/null for a in $1/*; do tail -n 1 $a >> utolso.txt; done
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}’ szovegvagy
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 }