4. gyakorlat

Szűrők - beveztő

  • A Linux parancsok jó része nem csinál mást, mint olvassa a standard inputját (jellemzően soronként), a beolvasott inputtal "csinál vmit" majd az átalakított indputot kiküldi a standard outputjára, az esetleges hibaüzeneteket pedig a standard error-ra.
  • A legegyszerűbb szűrő(k): cat, (more, less)
  • Kicsit érdekesebb: wc (egyenlőre még csak önmagában)
  • Érdekesség:
    more file_nev
    more < file_nev

    Különbség: az első esetben a more program 1db parancssori paramétert kap, ő maga intézi, hogy kiolvassa a fileból az inputot. A második esetben a more-nak nincs parancssori paramétere, az input-átirányítást a shell végzi.

Pipe-ok

ls -l > tmpfile
more < tmpfile
[nézelődés]
rm tmpfile

  • Ügyesebb megoldás -> pipe használata
  • Mire jó? Az egyik program standard outputját egy másik program standard inputjára irányítjuk.
    ls -l | more
  • Felmerül a kérdés: nem ugyanaz történik, mint az előbb? Csak épp a temp állományt mi "nem látjuk". NEM
  • Itt a shell egyszerre indítja el a két programot, tehát nem az történik, mint az előbb, hogy először lefut az ls -l, és aztán írja ki a valahol eltárolt kimenetet a more: itt az ls futása közben, amint megjelenik valami kimenet, a more rögtön megkapja azt és elkezdi "feldolgozni".
    cat f1 | wc
    cat f1 | wc -l ('-w', '-c')
    cat f1 | sort

Metakarakterek

  • A metakarakterek helyettesítését a shell végzi még a parancs meghívása előtt!! A parancsot a már megfelelően behelyettesített filenevekkel hívja meg.
  • * : 0 vagy több tetszőleges karakter
    echo *
    cat m*a*
  • ? : pontosan 1db tetszőleges karakter cat al?a
  • [ ] : halmazok
    ?[afu]?
    [0-9]
    [a-z], [A-Z], [A-z]
    [0-9A-Z]
    [0-9][A-Z]
    [^0-9]
  • Pédák:
    ls -l [Vv]*
    cp /usr/share/pixmaps/*.pxm ~/
  • Használhatók még az ún. POSIX karakterosztályok is [[:CLASS:]] formában: "alnum", "alpha", "ascii", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "word", "xdigit"
  • Példák:
    ls -ld [[:alpha:]]*.[[:digit:]]
    ls -ld *[[:upper:]]

Speciális karakterek semlegesítése (Quoting)

  • Szükség lehet arra, hogy bizonyos, a shell számára speciális jelentéssel bíró karaktereket megvédjünk a shell helyettesítő hatásától
  • Mikre kell gondolni: pl. $,*,?,[] stb.

Lehetőségek

Egyetlen karakter levédése: \

datum=20050212
echo $datum
echo \$datum

cat al*
cat al\*
cat >ab\*c
rm a* !!
rm a\* !!

Hosszabb string TELJES levédése: ' '

Használható az előző esetekben is, azaz
echo '$datum'
cat 'al*'
rm 'a*'

ls -l [Vv]*
ls -l '[Vv]*'

Hosszabb string RÉSZLEGES levédése: " "

Első megközelítésben ugyanaz, mint az előbb, csak a körny. változók kiértékelése megengedett
echo "$datum"
cat "al*"
ls "${HOME}/*" : azt nézi meg, van-e a saját könyvtárunkban * nevű file

Kicsit pontosabban: ugyanaz, mint a ' ', kivételek: $, ` ` (backticks), \
echo "$datum"
echo "`date`"
echo "Dante: \"Ki itt belépsz, hagyj fel minden reménnyel!\""
echo 'Dante: \"Ki itt belépsz, hagyj fel minden reménnyel!\"'

Beágyazott parancsvégrehajtás

echo "Ebben a könyvtárban `ls -l | wc -l` db file van"
Megjegyzés: nem a pontos értéket adja

Használható a $(parancs) forma is

Programok csoportosítása

Lehetőségünk van a futtatandó programjaink csoportosítására: ez annyit tesz, ohy a zárójelbe tett shell parancsot egy utasításként kezelhetjük
(cat f1; ls) | wc
cat f1 | (echo "Most történik a file írás"; cat > f2)

sort parancs

Egy szöveges file sorait rendezhetjük
sort f1

Kapcsolók

  • -o: A kiemeneti file nevét adhatjuk meg
    sort f1 -o f1
    ls -la | sort -o rendezett_lista
    (ls -la | sort > rendezett_lista)
  • -m: Rendezett fileok összefésülése
    sort -m f1 f2
    Fontos, hogy ez nem rendez, csak összefésül két rendezett álományt
  • -c: Ellenőrzi, hogy az adott állomány rendezett-e
    sort -c f1
  • -b: Figyelmen kívül hagyja a bevezető WP-eket
    sort -b f1
  • -d: Csak a WP-eket és az alfanumerikus karaktereket veszi figyelembe
    sort -d f1
  • -f: Nem különbözteti meg a kis -és nagybetűket
    sort -f f1
  • -r: Fordított sorrendű rendezés
    sort -r f1
  • -u: Az azonos sorok csak egyszer fognak szerepelni a (rendezett) kimenetben
  • -t char: A megadott karaktert használja mezőelválasztónak. Alapértelmezés szerint a sorban található egyes mezőket WP-ek választják el egymástól
    sort -t : f1
  • -k[num]: Megadhatjuk, hogy melyik mező legyen a rendezés kulcsa, azaz eszerin a mező szerint fog rendezni. A mezők és a karakterpozíciók számozása 1-től kezdődik
    sort -k2 f1
    Megadható egy mezőcsoport is:
    sort -k2,4 f1
    sort -t/ -k3 f1

cut parancs

Megadott részeket tudunk kivágni egy sorból

Kapcsolók

  • -b: Csak a megadott byte-okat adja vissza
    cut -b1 f1
    cut -b2-4 f1
    cut -b2,4 f1
  • -c: Csak a megadott karaktereket adja vissza. Jelenleg azonos a -b -vel
  • -f: Csak a megadott mezőket adja vissza. Alaphelyzetben a mezőket TAB karakterek választják el egymástól, de ezt át lehet állítani.
    Fontos: kiírja azokat a sorokat is, amikben nem szerepel a mezőelválasztó karakter, azaz egyetlen mezőből állnak!
  • -d: Az alapértelmezett mezőelválasztó karaktert tudjuk megváltoztatni
    cut -d: -f2 file1
    cut -d'\' -f1 file1
    cut -d' ' -f3 file1
  • -s: -f esetén nem írja ki azokat a sorokat, melyek nem tartalmazzák a megadott mezőelválasztó karaktert

uniq parancs

Eltávolítja a duplicált sorokat a bemenetéről
uniq f2
uniq f1 f2
(Ilyenkor f2-be a kimenet kerül!!!)

Kapcsolók

uniq -u f2
Csak a nem duplicált sorokat írja ki
uniq -d f2
Csak a duplicált sorokat írja ki
uniq -c f2
Kiírja minden sor elé, hogy az hányszor fordult elő
uniq -i f2
A kis és nagybetűket figyelmen kívül hagyja
uniq -f[num] f2
Figyelmen kívül hagyja az első num mezőt
uniq -s[num] f2
Figyelmen kívül hagyja az első num karaktert
uniq -w[num] f2
Maximum num db karaktert vesz figyelembe

head parancs

A inputnak csak az első "pár" sorát írja ki
head f1
head f1 f2
head -5 f1 (már nem használatos)
head -n5 f1

tail parancs

Az inputnak csak az utolsó "pár" sorát írja ki
tail f1
tail f1 f2
tail -3 f1
tail -n3 f1
tail +2 f1

Gyakorló feladatok

  • Listázd ki a home könyvtáradban található p-t tartalmazó fileokat/könyvtárakat!
  • Hány .-tal kezdődő file található a home könyvtáradban?
  • Lépj be a PATH körny. változóban található 3. könyvtárba!
  • Irasd ki a "$USER/*" szöveget! Ez a karaktersorozat jelenjen meg a képernyőn!
  • Irasd ki a home könyvtáradban lévő összes filet teljes leérési úttal együtt! (Használd a $HOME környv. változót)
  • Töltsd le a következő fileokat: gyak1, gyak2, gyak3 (pl.: wget http://people.inf.elte.hu/spala/unix_gyak/gyak1)
  • Rendezd a fileokat "helyben", azaz a rendezés eredménye az eredeti fileba kerüljön
  • Készítsd el a gyak1 és gyak2 fileok összefűzését (gyak4)! Hány karakterből áll a gyak4 file?
  • Hány különböző sorból áll a gyak4?
  • Irasd ki a képernyőre a gyak3 olyan rendezését, amelyben a második oszlop szerint rendezel!
  • Melyik sor fordul elő a legtöbbször és hányszor a gyak4-ben?
  • Melyik karakterrel kezdődik a legtöbb sor a gyak1-ben?