Követelmények
Gyakorlat
A gyakorlat látogatása kötelező!
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}’ 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 }
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} 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. 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