Operációs rendszerek gyakorlat 2010 levelező

Gyakorlat Követelményei

Gyakorlat

Rodek Lajos gyakorlati jegyzete
Rodek 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: $nap
vagy :)
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}
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.
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]’ szoveg
vagy
egrep ’[A-Z]{1}’ szoveg
vagy
egrep ’[A-Z].*’ szoveg
vagy
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
}