Operációs Rendszerek II. labor 2. alkalom
Mai témák • (e)grep • Shell programozás (részletesebben, példákon keresztül)
grep • Alapvető működés: mintákat keres a bemeneti csatorna (STDIN vagy fájl) soraiban, az illeszkedő sorokat kiírja – …vagy a nem illeszkedőket írja ki – …vagy csak a találatok számát adja meg
• grep vs egrep: használt reguláris kifejezéseket leíró nyelv összetettsége eltérő (egrepé komplexebb)
Mintaillesztés • Legegyszerűbb minta: illesztendő szöveg – Pl. „alma”. Erre illeszkedik: „alma”, „alalma”, ”almalé”. Nem illeszkedik: „Alma”, „aLMa”, stb. – Vannak „tiltott” karakterek (‘.’,’?’, stb.) – „\.” jó
• Példák: – – – –
grep „apple” words grep –w „apple” words grep –c „apple” words grep –v –c „apple” words • wc –l words
Alap… Teljes szavakra keres Találatok száma „Nem-találatok” száma Hány sorból áll a fájl?
Kis- és nagybetűk • grep alapértelmezés szerint érzékeny rá
• A „-i” kapcsolóval ez letiltható (de…) Tesztfájl (a.txt) – – – – – –
grep „alma” a.txt grep „ALMA” a.txt grep –i „alma” a.txt grep –i „aLmA” a.txt grep „almád” a.txt grep –i „almád” a.txt
alma ALMA AlMA almád ALMÁD
Illesztés sor elejére, végére • Két speciális karakter, ami a sor elejét és a végét jelöli: – Sor eleje: ^ – Sor vége: $
• Példák: – grep „^apple” words – grep „apple$” words – grep „^apple$” words
Így kezdődik Így végződik Pont ez a szó
„Igazi” minták • Tartományok megadása: [x-y] vagy [xyz] – grep “^*a-c+w” words – grep “*aA+w” words
• Tagadás: [^x-y] – grep “*^b-zA-Z+w” words
• Speciális „helyettesítők” – – – –
. (pont) : tetszőleges karakter [:alnum:] [:alpha:] [:digit:]
Ismétlődések és egrep • Ismétlődések – Pont egyszer: ez az alapértemezett – 0 vagy egy alkalommal: ? – 0…n alkalommal: * – Alsó és felső határok: {x,y}
„Igazi” minták – példákkal • Mintafájl (minta.txt) egrep “^*0-9+*$” minta.txt egrep “^**:digit:++*$” minta.txt egrep “^*0..9-+*$” minta.txt egrep “^**:digit:+-+*$” minta.txt egrep “^**:alpha:++*$” minta.txt egrep “^**:alnum:++*$” minta.txt egrep “^*0-9]{4}-[0-9]{2}-[0-9+,2-$”…
19920820 1992-08-20 a1c4e abcde
Ismétlődések – példák • Mintafájl (minta.txt)
alma ananasz barack citrom dio eper korte
– „a” vagy „c” betűvel kezdődik egrep “^*ac+” minta.txt – 6 betűből áll (pont) egrep “^*a-z+,6-$” minta.txt – Legalább 5 betűből áll egrep “^*a-z+,5,-$” minta.txt egrep “^*a-z+,5-” minta.txt ↔ “^*a-z+,5-$” – “a” betűvel kezdődik és végződik egrep “^a*a-z+*a$” minta.txt egrep “^a.*a$” minta.txt
Egyszerű shell script alma.sh fájl (vi, pico, stb.): #!/bin/bash echo “Hello!” Futtatás: > chmod +x alma.sh > ./alma.sh
Változók • • • • •
Értékadás: a=Hello Hivatkozás: echo $a Mindig szöveges: a=2; b=3; echo $a + $b Számok: a=2; b=3; expr $a + $b Változóba írás: c=`expr $a + $b`
„Fontos” változók • • • • • • •
$0 $1, $2, … shift parancs $* ($0…$n) $@ ($1…$n) $# (számosság) $? (státusz) stb. (pl. $HOME, $PWD)
Változó behelyettesítés • • • • • •
unset alma echo $alma echo ${alma:-Semmi} echo $alma echo ${alma:=Semmi} echo $alma
Shell program vezérlési szerkezetei • • • • •
if – then – [ elif, else] – fi for – do – done while – do – done until – do – done stb.
Feltételes elágazás: if • Változó értéke: /test parancs/ if [ $0 –ne 2]; then echo “Használat: $0 ” exit
fi
• Parancslefutás: if grep „alma” korte.txt 1>/dev/null 2>&1; then echo “Talalt” fi
Test parancs • test vagy [ ] • Tipikus: if * xyz +; then “echo OK” • Fájlokra vonatkozó tesztesetek (néhány) - True if… -d file: file exists and is a directory. -e file: file exists (regardless of type). -f file: file exists and is a regular file. -r file: file exists and is readable. -s file: file exists and has a size greater than zero. -w file: file exists and is writable. -x file: file exists and is executable. file1 -nt file2: file1 exists and is newer than file2.
Test folytatás • „Szöveges” tesztesetek -n string the length of string is nonzero. -z string the length of string is zero. string string is not the null string. s1 = s2 the strings s1 and s2 are identical. s1 != s2 the strings s1 and s2 are not identical. s1 < s2 string s1 comes before s2 based on the ASCII value of their characters. s1 > s2 string s1 comes after s2 based on the ASCII value of their characters.
Még tovább • „Numerikus” tesztesetek n1 -eq n2 the integers n1 and n2 are algebraically equal. n1 -ne n2 the integers n1 and n2 are not algebraically equal. n1 -gt n2 the integer n1 is algebraically greater than the integer n2. n1 -ge n2 the integer n1 is algebraically greater than or equal to the integer n2. n1 -lt n2 the integer n1 is algebraically less than the integer n2. n1 -le n2 the integer n1 is algebraically less than or equal to the integer n2.
Test és if • Írjon egy programot, ami kiírja a paraméterben megadott fájl legfontosabb adatait, így: – – – – – –
Létezik? fájl vagy könyvtár? Nullánál nagyobb a mérete? Írható? Olvasható? Futtatható?
• Ha a parancsot nem egy paraméterrel indították, akkor rövid help-et írjon ki a használatáról!
Megoldási javaslat if [ $# -ne 1 ]; then echo "Hasznalat: $0 " exit 1 fi if [ -e $1 ]; then echo "$1 letezik" if [ -f $1 ]; then echo "-mezei fajl"; else if [ -d $1 ]; then echo "-konyvtar"; fi fi if [ -r $1 ]; then echo "-olvashato"; else echo "-nem olvashato"; fi … exit 0 else echo "$1 nem letezik“ exit 1 fi
Ciklusok - for • Nem a „klasszikus” for ciklus, listákon lépked! for a in alma korte barack; do echo $a; done
• Primitív ls for a in *; do echo $a; done
• Parancssori paraméterek for a in $*; do echo $a; done
• Mégis számolunk for i in `seq 2 6`; do echo $i; done