3.2 Lecke 2
Tanúsítvány: |
Linux Essentials |
---|---|
Verzió: |
1.6 |
Témakör: |
3 A Paranccsor Erősségei |
Fejezet: |
3.2 Adatok Keresése és Kinyerése Fájlokból |
Lecke: |
2/2 |
Bevezetés
Ebben a leckében olyan eszközökkel fogunk megismerkedni, amelyeket szövegek manipulálására használhatunk. Ezeket az eszközöket a rendszergazdák vagy programok gyakran használják visszatérő információk automatikus monitorozására vagy azonosítására.
Fájlokon Belüli Keresés A grep
-pel
Az első eszköz, amiről a leckében beszélni fogunk, a grep
parancs. A grep
egy rövidítés a “global regular expression print” (globális reguláris kifejezések kiíratása) kifejezésre, és a legfőbb funkciója egy meghatározott minta fájlokon belüli keresésére. A parancs pirossal kiemelve adja vissza azt a sort, amely tartalmazza az adott mintázatot.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
A grep
, ahogy a legtöbb parancs, kapcsolókkal módosítható. Íme a leggyakoribbak:
-i
-
a keresés kis/nagybetű érzékeny
-r
-
a keresés rekurzív (a megadott mappában és annak almappáiban az összes fájlban keres)
-c
-
a keresés megszámolja a találatokat
-v
-
találatok megfordítása, azokat a sorokat írja ki, amelyek nem felelnek meg a keresésnek
-E
-
kiterjesztett reguláris kifejezések bekapcsolása (néhány fejlettebb metakarakter használata, mint a
|
,+
és?
)
A grep
még több hasznos kapcsolóval rendelkezik. A man oldalán még többet tudhatunk meg róluk.
Reguláris Kifejezések
A második eszköz nagyon hatásos. Fájlokban lévő szövegdarabok leírására szolgál, reguláris kifejezés néven ismerjük. A reguláris kifejezések rendkívül hasznosak, ha szövegfájlokból adatokat kell kinyernünk minták segítségével. Gyakran használjuk őket szkriptekben, vagy magasszintű programozási nyelvekben, mint a Perl vagy a Python.
Ha reguláris kifejezésekkel dolgozunk, nagyon fontos tudnunk, hogy minden karakter számít és az általunk megadott minta, amely meghatározott karaktereknek felel meg, egy sztring. A legtöbb minta ASCII szimbólumokat használ, mint betűk, számok, írásjelek, vagy egyéb szimbólumok, de használhatunk Unicode karaktereket bármilyen más típusú szöveg esetén.
Az alábbi listában láthatjuk a reguláris kifejezések metakaraktereit, amelyeket a mintákban használhatunk.
.
-
Bármilyen karakternek megfelel (kivéve az új sor)
[abcABC]
-
Bármelyik karakternek megfelel, amik a zárójelen belül vannak
[^abcABC]
-
Bármelyik karakternek megfelel, amik a zárójelen kívül vannak
[a-z]
-
Bármelyik karakternek megfelel a sorozatból
[^a-z]
-
Bármelyik karakternek megfelel, ami nincs a sorozatban
sun|moon
-
A felsorolt sztringek egyikét keresi
^
-
Sor kezdete
$
-
Sor vége
A reguláris kifejezések minden funkciója implementálható a grep
parancsban. Láthatjuk a fenti példában, hogy a szót nem határolják idézőjelek. Hogy megelőzzük, hogy a shell magát a metakaraktert is értelmezze, ajánlott, hogy a bonyolultabb mintát dupla idézőjelek közé rakjuk (" "). A gyakorlatban dupla idézőjeleket fogunk használni a reguláris kifejezések implementálása során. A többi típusú idézőjel megtartja a szokásos funkcionalitását, ahogy azt az előző leckékben láthattuk.
A következő példákkal a reguláris kifejezések funkcionalitását emeljük ki. A fájlon belüli adatokra van szükségünk, így ezért a következő parancsok különböző sztringeket fűznek a text.txt
fájlhoz.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Az első példa a fájlban történő keresést mutatja meg reguláris kifejezéssel és reguláris kifejezés nélkül. Annak érdekében, hogy teljesen megértsük a reguláris kifejezéseket, nagyon fontos látnunk a különbséget. Az első parancs pontosan a sztringet keresi, bárhol a sorban, a második parancs olyan karaktereket keres, ami a tartalmazza a zárójelek közötti karaktereket. Emiatt a parancsok eredménye eltérő lesz.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
A második példasor a sor kezdetét és végét jelző metakaraktert mutatja be. Nagyon fontos, hogy a 2 karaktert a kifejezésen belül a megfelelő helyre írjuk. Amikor meghatározzuk a sor kezdetét, a metakarakternek a kifejezés előtt kell szerepelnie, amikor a sor végét, a metakarakternek a kifejezés után.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
A fentebb látott metakarakterekhez hasonlóan a reguláris kifejezésekhez tartoznak olyanok is, amik lehetővé teszik a meghatározott minta ismétlődését:
*
-
Nulla vagy több az előző mintából
+
-
Egy vagy több az előző mintából
?
-
Nulla vagy egy az előző mintából
Az ismétlő metakaraktereknél az alábbi parancs olyan sztringet keres, ami tartalmazza az ab
-t, egy vagy több karakter előzőleg megtalálásra került. Az eredményből láthatjuk, hogy a grep
megtaláta az aaabbb1
sztringet, és egyezett az abbb
rész, akárcsak az abab2
. Mivel a +
egy kiterjesztett karakter a reguláris kifejezésben, a -E
kapcsolót kell használnunk a grep
parancsban.
$ grep -E "ab.+" text.txt aaabbb1 abab2
A legtöbb metakarakter magától értetődik, de az első használat során okozhatnak meglepetéseket. A fenti példák csak egy kis részét mutatják be a reguláris kifejezések hasznosságának. Próbáljuk ki az összes metakaraktert, hogy megértsük, hogyan működnek.
Gyakorló Feladatok
A grep
és a /usr/share/hunspell/en_US.dic
fájl segítségével találjuk meg azokat a sorokat, amelyek megfelelnek az alábbi követelményeknek:
-
Minden sor, ami tartalmazza a
cat
szót bárhol. -
Minden sor, ami nem tartalmazza az alábbi karakterek valamelyikét:
sawgtfixk
. -
Minden sor, ami bármely 3 betűvel és a
dig
szóval kezdődik. -
Minden sor, ami legalább egy
e
betűre végződik. -
Minden sor, amely tartalmazza az alábbi szavak valamelyikét:
org
,kay
vagytuna
. -
Azon sorok száma, amelyek nulla vagy egy
c
betűvel kezdődnek, melyet azati
sztring követ.
Gondolkodtató Feladatok
-
Találjuk meg azt a reguláris kifejezést, ami egyezik az “Include” sorban található szavakkal és nem egyezik meg az “Exclude” sor szavaival:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
-
-
Melyik az a másik hasznos parancs, amellyel fájlokon belül kereshetünk? Milyen további funkciói vannak?
-
Visszagondolva az előző leckére, használjuk az egyik példát és próbáljunk meg egy adott mintát megkeresni a parancs kimenetében a
grep
segítségével!
Összefoglalás
Ebben a leckében megtanultuk:
-
A reguláris kifejezések metakaraktereit
-
Hogyan hozzunk létre mintákat reguláris kifejezésekkel
-
Hogyan keressünk fájlokon belül
A gyakorlatok során használt parancsok:
grep
-
Karaktereket vagy sztringeket keres egy fájlon belül
Válaszok a Gyakorló Feladatokra
A grep
és a /usr/share/hunspell/en_US.dic
fájl segítségével találjuk meg azokat a sorokat, amelyek megfelelnek az alábbi követelményeknek:
-
Minden sor, ami tartalmazza a
cat
szót bárhol.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Minden sor, ami nem tartalmazza az alábbi karakterek valamelyikét:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Minden sor, ami bármely 3 betűvel és a
dig
szóval kezdődik.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Minden sor, ami legalább egy
e
betűre végződik.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Minden sor, amely tartalmazza az alábbi szavak valamelyikét:
org
,kay
vagytuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Azon sorok száma, amelyek nulla vagy egy
c
betűvel kezdődnek, melyet azati
sztring követ.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Válaszok a Gondolkodtató Feladatokra
-
Találjuk meg azt a reguláris kifejezést, ami egyezik az “Include” sorban található szavakkal és nem egyezik meg az “Exclude” sor szavaival:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
Válasz:
pot$
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
Válasz:
p+
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
Válasz:
arc|cap|zoo
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
Válasz:
[0-9]th.+
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
Válasz:
^[A-Z]a.*i+
-
-
Melyik az a másik hasznos parancs, amellyel fájlokon belül kereshetünk? Milyen további funkciói vannak?
A
sed
parancs. A parancs képes keresni és cserélni egy karaktert vagy egy karaktersorozatot egy fájlon belül. -
Visszagondolva az előző leckére, használjuk az egyik példát és próbáljunk meg egy adott mintát megkeresni a parancs kimenetében a
grep
segítségével!A példánk a Gondolkodtató Feladatokból van, megkerestük azt a sort, amely az olvasás, írás és a végrehajtás jogosultságát adta meg a csoport tagjainak. A válasz eltérő lehet, ha másik feladatot választottunk.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Ez a példa azt mutatja be, hogy a
grep
kaphat inputot más parancsokból is és segíthet a generált információ szűrésében.