Operációs rendszerek 2010 levelező

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]’ 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
}

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