Operációs rendszerek 2 3. alkalom - Reguláris kifejezések, grep, sed Windisch Gergely windisch.gergely@nik.uni-obuda.hu 2010-2011 2. félév
Reguláris kifejezések Reguláris kifejezésekkel lehet keresni egy szövegben hatékony módon. Pl: tegyük fel, hogy megváltozik a telefonszámunk, és át szeretnénk írni minden fájlban (fejléces papír, névjegykártya stb). Sima keres cserél nem jó, mert van, ahol 063011111111 van írva, máshol 363011111111, (3630..), 36-30/1-11111 stb. Reguláris kifejezéssel ez megoldható.
grep Keresni tudunk vele Fájlban keresés grep filenév string, vagy cat filenév grep string Szabványos bemenetére sorokat küldhetünk, azt fogja kiírni, amelyikben megtalálható a keresett kifejezés pl: listázzuk ki a könyvtárban található mp3 fájlokat ls -l grep 'mp3' grep -v : negáció - csak akkor írja ki a sort, ha nem szerepel benne a keresett kifejezés Szabályos kifejezések: grep -E, vagy egrep
grep hasznos kapcsolók: -v : negált keresés -c : az eredményhalmaz számosságát adja vissza -h : több fájlban kereséskor megadja a fájlnevet is -i : kis- és nagybetű érzékenységet kapcsolja ki -w : csak egész szóra keres -n : sor számát elhelyezi a találat mellett Fájlban keresés cat file grep... - hordozhatóbb grep '..' file - gyorsabb
regexp alapok Regular expressions, reguláris kifejezések, szabványos kifejezések karakterek: önmaguknak felelnek meg.. egrep 'alma' speciális karakterek: \ kell eléjük, ha őket keressük *., [ ] \ ^ $ : ezek a speciális jelek. (\*, \. stb.) ^ (önmagában): mintát a sor elejére igazítja cat telefon egrep '^ki' $: mintát a sor végére igazítja cat telefon egrep 'os$' ^barmi$ : konkrét sor keresése '\<': szó eljeje, '\>': szó vége
Feladat Listázzuk ki csak a könyvtárakat, grep segítségével
ls -l egrep '^d' Feladat megoldása
Feladat A /etc/debconf.conf fájlból szedjük ki a kikommentezett sorokat, és az eredményt tároljuk el egy fájlban. (egyszerű linuxos konfigurációs fájl, a # jellel kezdődő sorok kommentek)
Feladat megoldás cat /etc/debconf.conf egrep -v '^#' > ujfile
. : Minden karakterre (kivéve újsor) illeszkedik. (..) egrep '...' : olyan sort keres, amiben legalább három tetszőleges karakter van. Ha olyan sort keresnénk, amiben három pont van: (..) egrep '\.\.\.' Ha olyan sort keresünk, ami pontosan három karakerből áll: (..) egrep '^...$'
Feladat Listázza ki az összes olyan szót a /usr/share/dict/ könyvtárbeli szótárfájlból, ami c betűvel kezdődik, f betű a vége, és 5 betűből áll
Feladat megoldás grep '\<c...h\>' /usr/share/dict/words
[ ] : A benne levő betűk közül valamelyiket keresi k[oae]s: kos, kas, kes ^[abc]: a, b vagy c-vel kezdődő sorok ^[^abc]: negálás, sorok, amik NEM a, b-vel kezdődnek [ - ]: tartomány (angol abc szerint) [a-z] : kisbetűk [A-Z]: nagybetűk [a-za-z]: kicsi és nagy betűk [0-9]: számok
Feladat Írjunk olyan shell scriptet, ami kilistázza azokat a fájlokat, amelyek nagybetűvel kezdődnek
Feladat megoldás ls -1 egrep '^[A-ZÁÉŐÚÓÜÖÍ]'
Jelentésmódosító jelek (1) A korábbiakban bemutatottakkal együtt használható? : az előtte álló karakter opcionális (0 vagy 1) colou?r - színt keres brit és amerikai szövegben * : az előtte levő karakterből tetszőleges darabszámot keres (nullát is!) (...) egrep '1[0-9]*' - olyan sorokat keres, amelyekben van olyan szám, ami 1-gyel kezdődik + : az előtte levő karakterből keres tetszőleges számút, de legalább 1-et. (...) grep '1\+' (kell a \, hogy ne stringként kezelje)
Jelentésmódosító jelek (2) { }: pontos számú egyezést vár el (..) egrep '[0-9]\{3\}' : pontosan 3 szám (..) egrep '[0-9]\{3,\}' : legalább 3 szám (..) egrep '[0-9]\{4,6\}' : 4-6 között ( ) : csoportokat képezhetünk. A jelentésmódosítók a csoportokra vonatkoznak. (..) egrep '[\(cd\)\(ef\)]' (..) egrep '(ab)\+' Olyan sorokat keres, ahol az ab többször előfordul : vagy kapcsolat (..) egrep 'asztal\(on\ ban\ hoz\ ra\ nak\)'
Ide tartozó parancsok grep sed beérkezett szövegben keres parancssoros szövegszerkesztő awk find szövegszerkesztő, szebb parancsok fájlokat keres
sed parancssoros szövegszerkesztő program... sed 'program' sed 'program' bejovofajl > kimenofajl soralapú, az aktuális feldolgozott sor a mintatérbe kerül amennyiben a kimenetet fájlban szeretnénk tárolni, ne ugyanaz legyen, mint a bemenet! sed 'program' feldolgozando > feldolgozando bash kapásból nullázza a kimeneti fájlt, a sed pedig csak utána fog nekiállni a munkának
sed p : mintatér kiírása cat akarmi sed 'p' minden sor kétszer jelenik meg -n kapcsolóval kiiktatható az eredeti kiírás címzés: cat akarmi sed -n '5p' : csak az ötödik sort írja ki cat akarmi sed -n '1,5 p' : 1-5. sorokat írja ki d: mintatér törlése ugyanaz a paraméterezése, mint a p-nek cat akarmi sed '1,5 d' : az 1-5 sorokat nem jeleníti meg (fájlba átirányítva kvázli kitörlődik)
sed s: szöveg helyettesítés formátum: cat akarmi sed s/eztcsereld/emerre/ csak az első találatot cseréli ki (a sorban) összeset: cat akarmi sed s/eztcsereld/emerre/g az elválasztó karakter lehet bármi. Célszerű olyat, ami nem szerepel a cserélendőben s/http:\/\/www.index.hu\//http:\/\/www.nik.hu/ s!http://www.index.hu!http://www.nik.hu!
Feladat Készítsen egy shell scriptet, ami egy fájlban kicserél valamit valami másra. Ezzel a feladattal kicsit még dolgozni kéne :-)
További parancsok cut : szétvágja a kimenetet oszlopokra. pl: csoportok kilistázása: cat /etc/group cut -d: -f 1 awk: szövegszerkesztő wc: awk '{print $3}' - a harmadik oszlop kivágása A cut nem kezeli egybe a szóközöket - ls -l cut -d' ' -f7 nem jó kimenet karaktereit, sorait számolja.. grep wc -l : hány találat volt head, tail : a kimenet első (utolsó) néhány sorát írja ki messages.log új bejegyzései: cat m.log tail tac: szöveges fájl kiírása, fordított sorrendben friss logbejegyzések megjelenítésére
Feladat Irassuk ki a rendszerrel a felhasználóink számát.
cat /etc/passwd wc -l Feladat megoldás De mi van az inaktív felhasználókkal? (első nem szóköz karakter # - kikommentezett userek) csak azokat listázzuk ki, akik nincsenek kikommentezve
Megoldás 2 cat /etc/passwd egrep -v '^ *#' wc -l
Feladat Készítsen script fájlt, ami bemeneti paraméterként egy fájl nevét kapja, és kiírja a fájl tulajdonosát.
Feladat megoldás #!/bin/bash tulaj=`ls -l "$1" cut '-d ' -f3` echo "A fájl tulajdonosa: $tulaj"
Feladat megoldás (kicsit szebb) #!/bin/bash if [ -e "$1" ] then tulaj=`ls -l "$1" cut '-d ' -f3` echo "A fájl tulajdonosa: $tulaj" else echo "Nem létező fájl" fi
Feladat Készítsen shell scriptet, ami megállapítja a paraméterben megadott fájl tulajdonosát, és amennyiben az a hallgato, akkor átadja az állományt a root felhasználónak.
#!/bin/bash Feladat megoldás if [ "`ls -l $1 cut '-d ' -f3`" = "hallgato" ] then chown root $1 fi
Bővítse ki az előző feladatot, hogy csak akkor adja át a rootnak, amennyiben a tulajdonos az aktuális felhasználó.
Feladat megoldás #!/bin/bash if [ "`ls -l $1 cut '-d ' -f3`" = "$USER" ] then chown root $1 fi
Bővítse ki az előző feladatot úgy, hogy második paraméterként megadható legyen az új felhasználó, aki a fájlt megkapja, de csak akkor hajtsa végre a program az átadást, amennyiben a megadott felhasználó létezik a rendszerben.
Feladat megoldás #!/bin/bash if [ "`cat /etc/passwd cut -d: -f1 egrep -c "^$2$"`" -eq 1 ] then if [ "`ls -l $1 cut '-d ' -f3`" = "$USER" ] then chown $2 $1 fi else echo No such user. You idiot. fi