Operációs rendszerek 2 3. alkalom - Reguláris kifejezések, grep, sed Windisch Gergely
[email protected] 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ó.
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2
grep • hasznos kapcsolók: – – – – – –
-v -c -h -i -w -n
: negált keresés : az eredményhalmaz számosságát adja vissza : több fájlban kereséskor megadja a fájlnevet is : kis- és nagybetű érzékenységet kapcsolja ki : csak egész szóra keres : sor számát elhelyezi a találat mellett
• Fájlban keresés – cat file | grep... – grep '..' file
- hordozhatóbb - gyorsabb
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2
Feladat • Listázzuk ki csak a könyvtárakat, grep segítségével
Windisch Gergely - Operációs rendszerek 2
Feladat megoldása ls -l | egrep '^d'
Windisch Gergely - Operációs rendszerek 2
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)
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás cat /etc/debconf.conf | egrep -v '^#' > ujfile
Windisch Gergely - Operációs rendszerek 2
. : 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 '^...$'
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás grep '\
' /usr/share/dict/words
Windisch Gergely - Operációs rendszerek 2
• [ ] : 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
Windisch Gergely - Operációs rendszerek 2
Feladat • Írjunk olyan shell scriptet, ami kilistázza azokat a fájlokat, amelyek nagybetűvel kezdődnek
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás ls -1 | egrep '^[A-ZÁÉŐÚÓÜÖÍ]'
Windisch Gergely - Operációs rendszerek 2
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)
Windisch Gergely - Operációs rendszerek 2
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\)'
Windisch Gergely - Operációs rendszerek 2
Ide tartozó parancsok • grep – beérkezett szövegben keres
• sed – parancssoros szövegszerkesztő
• awk – szövegszerkesztő, szebb parancsok
• find – fájlokat keres
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2
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)
Windisch Gergely - Operációs rendszerek 2
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!
Windisch Gergely - Operációs rendszerek 2
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 :-)
Windisch Gergely - Operációs rendszerek 2
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ő – 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ó
• wc: – 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
Windisch Gergely - Operációs rendszerek 2
Feladat • Irassuk ki a rendszerrel a felhasználóink számát.
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás cat /etc/passwd | wc -l 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
Windisch Gergely - Operációs rendszerek 2
Megoldás 2 cat /etc/passwd | egrep -v '^ *#' | wc -l
Windisch Gergely - Operációs rendszerek 2
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.
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás #!/bin/bash tulaj=`ls -l "$1" | cut '-d ' -f3` echo "A fájl tulajdonosa: $tulaj"
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2
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.
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás #!/bin/bash if [ "`ls -l $1 | cut '-d ' -f3`" = "hallgato" ] then chown root $1 fi
Windisch Gergely - Operációs rendszerek 2
• Bővítse ki az előző feladatot, hogy csak akkor adja át a rootnak, amennyiben a tulajdonos az aktuális felhasználó.
Windisch Gergely - Operációs rendszerek 2
Feladat megoldás #!/bin/bash if [ "`ls -l $1 | cut '-d ' -f3`" = "$USER" ] then chown root $1 fi
Windisch Gergely - Operációs rendszerek 2
• 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.
Windisch Gergely - Operációs rendszerek 2
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
Windisch Gergely - Operációs rendszerek 2