A grep kimenetén kiírja az összes "találatot" - vagyis azokat a sorokat, amelyek tartalmaznak legalább egy, a feltételt kielégítõ szót. A szintaxis nagyon egyszerû, meg kell adni, hogy mit hol keressen:
grep mit_keressen hol_keressePéldául: barátaink és üzletfeleink nevet és e-mail címét egy .addressbook nevû szöveges fájlban tartjuk, és szeretnénk megnézni Kovacs nevû barátunk (vagy üzletfelünk) e-mail címét. A megoldás: "kigrepeljük" a szövegfájlból azokat a sorokat, amelyekben elõfordul a "Kovacs" név.
orlando% grep Kovacs .addressbook Kovacs Istvan pistike@badguys.hell.gov Kovacsuzem h06789@kalapacs.uzem.com orlando%A nagy kezdõbetûs Kovacs - a Unixtól megszokott módon - nem azonos a nemecsekernõs kovacs névvel. Ha azt szeretnénk, hogy a grep a keresés során ne különböztesse meg a kis- és nagybetûket, akkor a -i kapcsolót kell használnunk. A kapcsolókat a parancssorban az elsõ argumentum (keresési minta) elõtt kell megadni. A fenti példában a grep két sort írt ki, hiszen a "Kovacs" szó a "Kovacsuzem"-nek is része. Ha ezt el akarjuk kerülni, mert azt akarjuk, hogy a grep csak a teljes szavakat találja meg, akkor használjuk elõszeretettel a -x kapcsolót.
Két további hasznos kapcsoló: az egyik (-n) hatására a grep a megtalált sorok elé kiírja a sorszámot is, a másikkal (-v) pedig fordított mûködésre lehet kapcsolni. Ilyenkor azokat a sorokat írja ki, amelyek NEM tartalmazzák a megadott mintát, a többit pedig lenyeli.
orlando% w | grep -v gyevi_biroA fenti példa kilistázza az összes bejelentkezett felhasználót (w parancs), kivéve a gyevi_biro-t. A példán az is látszik, hogyan használhatjuk a grepet egy másik parancs kimenetének megszûrésére.
A hol_keresse mezõben használhatjuk a *, ?, stb karaktereket, azaz a grep több fájlban is kutathat a feltételnek megfelelõ sorok után. A félreértések elkerülése végett a sorok elé kiírja azt is, hogy melyik fájlban találta õket. (Vigyázat! A grep nem rekurzív, tehát nem nézi meg azokat a fájlokat, amelyek a megadott könyvtárból nyíló alkönyvtárakban vannak.)
A dolog nagyon hasonló a * és ? karaktereket tartalmazó fájlnevekhez. A reguláris kifejezés egy olyan különleges karaktersorozat, amit a grep (és számos más) parancs mintaként értelmez. Ha egy szó megfelel a mintának, azt mondjuk rá, hogy "illeszkedik a reguláris kifejezésre".
A legegyszerûbb eset, mikor a reguláris kifejezés nem tartalmaz semmilyen speciális karaktert. Az ilyen kifejezés csak önmagára illeszkedik. Vegyük példaként Csocsi és Vonyi egyik hal(l)hatatlan kétsorosát:
Romeo Julian topreng: Fivere venne csak zokon a romancot! Leverne rolam e rokon a zomancot.Ezek után a
orlando% grep zokon romeoCsak az elsõ sort találja meg. Az alábbi parancs viszont mindkét sort kiírja:
orlando% grep '[zr]okon' romeomert a [zr]okon reguláris kifejezésre mind a rokon, mint a zokon szó illeszkedik. Ezek után lássuk, milyen feltételek szerepelhetnek a reguláris kifejezésekben:
orlando% grep '[tf]arka'Kiírja az összes olyan sort, amelyben a tarka, vagy a farka szó elõfordul.
orlando% grep '^\^' kalapKiírja az összes olyan sort a kalap nevû fájlból, amely ^ jellel kezdõdik. (Figyeljük meg a ^ jel használatát! Az elsõ jelenti azt, hogy az utána következõ kifejezésnek a sor elején kell lennie, a második pedig maga a keresendõ karakter, amelyet most \ jellel hatástalanítunk, hiszen különleges karakter.)
orlando% ls -l | grep '^d........x'Ez egy bonyolult, de nagyon praktikus példa. Az ls -l parancs kimenetébõl azokat a sorokat írjuk ki, amelyek eleget tesznek a következõ feltételeknek:
- d betûvel kezdõdnek
- második-kilencedik karakterük bármi lehet
- tizedik karakterük x
Könnyû rajönni, hogy így azon alkönyvtárak listáját kapjuk, amelyekbe mindenki beléphet.
orlando% ls -l | grep '[^.xdh]$'Megint az ls parancs kimenetében keresgélünk; ezúttal azokat a fájlokat szûrjük ki, amelyek NEM .xdh-ra végzõdnek.
Majdnem ugyanez történik, ha egyszeres idézõjelek helyett kétszerest (") használunk. A különbség annyi, hogy a shell ilyenkor megnézi, hogy van-e a stringben hivatkozás shell változóra. Ha van, akkor annak az értékét behelyettesíti és úgy adja tovább a kifejezést a grepnek.
Van egy harmadik fajta idézõjel is, a visszafele döntött idézõjel (`). Az ilyen jelek közé zárt kifejezést a shell megpróbálja parancsként lefuttatni és a végrehajtás eredménye kerül át a grephez.
Ennek szellemében:
orlando% cat >animals $eger (ez egy gazdag eger) fakutya vasmacska Microsoft mouse <Ctrl-d>Ezzel létre is hoztuk az "adatbázist", amin most gyakorlatozni fogunk. A shell változók kezelésének kipróbálására hozzunk létre egy "eger" nevû változót:
orlando% set eger=mouse orlando% grep '$eger' animals $eger (ez egy gazdag eger) orlando% grep "eger" animals Microsoft mouse orlando%Látható, hogy míg az egyszeres idézõjeleknél a grep a $eger reguláris kifejezést kapta meg, addig a kétszeres idézõjelek használata esetén a shell változó értékét, azaz a mouse szót - ezért jelent meg a második grep parancs végrehajtása után a "Microsoft mouse" sor.
Nézzük most a ` jelet! A végrehajtandó parancs legyen az echo, írassuk ki vele a kutya szót, s ezt adjuk át a grepnek!
orlando% grep `echo kutya` animals fakutya orlando%
find keresési-útvonalak kifejezésekNézzünk néhány példát! Tegyük fel, hogy egy valami.o nevû fájlt keresünk, amely valahol a home directorynkban, vagy az abból nyíló alkönyvtárak egyikében van. Ezt így találhatjuk meg:
orlando% find $HOME -name valami.o -printA -name kapcsoló után kell megadni a keresett fájl nevét. Természetesen nem egyértelmû nevet is megadhatunk a * és a ? segítségével, de ilyenkor a nevet ' jelek közé kell tenni. A -print kapcsoló azt mondja meg a find programnak, hogy ha talált olyan fájlt, ami megfelel a keresési feltételek, akkor írja ki a nevét a teljes elérési útjával együtt.
A keresés helyeként megadhatunk több könyvtárat is: ilyenkor mindegyiket végignézi, az összes alkönyvtárával együtt.
Egyszerre több keresési feltételt is megadhatunk, ehhez azonban zárójeleket kell használnuk, amelyeket meg kell védenünk attól, hogy a shell saját belátása szerint értelmezze õket. A következõ példa megkeresi az aktuális könyvtárban és az abból nyíló alkönyvtárakban található .c-re és .o-ra végzõdõ nevû fájlokat.
orlando% find . \( -name '/*.c' -o -name '*.o' \) -printAz egész logikus, bár elsõ ránézésre kissé kuszának tûnik. Derítsünk fényt a homályra: A pont (.) jelenti a keresési útvonalat, jelen esetben az aktuális könyvtárat. Több könyvtárat is megadhatunk, szóközökkel elválasztva. Ezután következik a zárójel, amit -a grepnél tanultak alapján- a \ jellel védünk meg a shelltõl. A -name kapcsolók már ismertek. A -o mondja meg a findnak, hogy a két -name-val elõírt feltételt hozza vagy kapcsolatba; azaz keresse meg mindazon fájlokat, melyek vagy az egyik, vagy a másik (vagy mindkét) feltételnek eleget tesznek.
Nézzünk most egy fokkal bonyolultabb példát. A
korábbi leckékbõl már tudjuk, hogy a home
directoryban lehet egy .plan nevû fájl,
aminek tartalma megjelenik
a képernyõn, ha valaki lefingerel minket.
Nézük
végig, hogy
kinek van ilyen .plan
fájlja!
A megtalált .plan fájlokat
irassuk ki a képernyõre!
orlando% find /usr1/public/users -name '.plan' -print -exec cat {} \;
Feltételezzük, hogy a felhasználók
home könyvtáraiA paraméterlista a -exec kapcsolónál kezdõdik és a pontosvesszõnél (;) ér véget. A {} szimbolummal lehet hivatkozni a find által megtalált fájlra. A cat-nak jelen esetben nincs paramétere, de ha az rm parancsot hajtanánk végre, megadhatnánk a -i kapcsolót, amire a shell minden megtalált fájl törlése elõtt rákérdezne szándékunk komolyságára:
orlando% find /usr1/public/users -name '*.gif' -print -exec rm -i {} \;
Megjegyzés: e példához teljesen
hasonló paraméterezésû find
parancsot használnak a fasiszta tipusú
rendszergazdák a felhasználók
alkönyvtáraiban található több
megabyte-os .gif kiterjesztésû
(általában pucér lányokat
ábrázoló) digitalizált képek
automatikus törlésére.
A parancs végrehajtása során
melléktermékként több oldal hibaüzenetet
kapunk, mivel a find megpróbál minden
alkönyvtárba belelépni, és
ha ez nem sikerül neki (mert az alkönyvtár
le van tiltva), akkor a
"Permission denied"
üzenettel szórakoztat minket.
Szerencsére a
standard error csatornát - s vele együtt a
hibaüzeneteket is - át
lehet irányítani. Erre a célra most a
/dev/null egység látszik a
legalkalmasabbnak, ez ugyanis nyomtalanul elnyeli a neki
küldütt
karaktereket. Keressuk meg a gépen található
összes C programot!
A megoldás sh-ban így néz ki
(A 2-es azt jelenti, hogy most kivételesen
nem a standard outputot (1), hanem a standard error
(2) csatornát
irányítjuk át):
orlando% sh $ find / -name '*.c' -print 2>/dev/null $ <Ctrl-d> orlando%Az sh-t itt csak a keresés idejére indítottuk el, mert nem biztos, hogy az alapértelmezett shellünkben ugyanígy kell átirányítani a standard error csatornát (próbáljuk ki! Ha nem mûködik, nézzünk utána a manualban, hogyan kell csinálni!).
orlando% sed 's/mit/mire/g' hol >hovaA fenti parancs végignézi a "hol" fájlt, kicseréli benne az összes "mit" szót "mire"-re és az eredményt a "hova" nevû fájlba (átirányítás jel és fájlnev megadása nélkül a képernyõre) írja. A sed egy nagytudású szövegszerkesztõ, de sajnos szinte lehetetlen kezelni, ezért csak a legelvetemültebb buherátoroknak javasoljuk, hogy parancsait elsajátítsák. A mindennapi életben elég, ha a fenti példát megjegyezzûk, valamint azt, hogy "hol" és a "hova" fájlként SOHA ne adjuk meg ugyanazt a nevet!!
orlando% awk '{print $1 $2}' .addressbook
Az idézõjelek között található
a "program", ami most egy print
utasításból és két
mezõhivatkozásból áll. Az
awk a kimenetén kiírja
a .addressbook fájl minden sorának elsõ
és második mezõjét, más szóval
a táblázat elsõ két oszlopát.
Az awk sokkal bonyolultabb, mint amire egy átlagos felhasználónak élete során szüksége van. A kiváncsi buherátor-jelölteknek ismét azt javasoljuk, hogy olvassák szorgalmasan az awk parancs man oldalát.
% rm -rf `du -s * | sort -rn | head -1 | awk '{print $2}'`;
************************************************************************* *= =* *= SZERZOI JOGOK =* *= =* *= Ez a dokumentum a Unix operacios rendszer es a szamitogepes =* *= halozatok elterjedeset kivanja elosegiteni, ezert dijmentesen =* *= terjesztheto. Nem szabad azonban a terjesztes soran a szoveget =* *= megvaltoztatni, barmilyen modon megcsonkitani es a szerzoi =* *= jogokra vonatkozo megjegyzest eltavolitani! Sem a dokumentum, =* *= sem annak barmely resze nem hasznalhato fel segedanyagkent vagy =* *= tankonyvkent profitorientalt intezmenyekben vagy tanfolyamokon, =* *= a szerzok elozetes irasbeli engedelye nelkul! =* *= =* *= (C) Csaky Istvan és Mork Peter Miskolc, 1994. januar 19 =* *= =* *************************************************************************