16 Bash Reguláris Kifejezés (RegEx) Példa grep, sed és awk Parancsokkal
A reguláris kifejezés vagy Regex egy speciális karakterekből álló sorozat, amely egy mintát alkot, hogy megtalálja a fájlban a konkrét mintáknak megfelelő példányokat és manipulálja őket. Főként speciális karakterek, szavak keresésére, szűrésre vagy szövegműveletekre használják egy fájlban.
A reguláris kifejezések (regex) nagymértékben használatosak a programozási nyelvekben, beleértve a Linux Bash szkriptek írását is. Ebben az útmutatóban bemutatom, hogyan lehet reguláris kifejezéseket használni a Bash-ben, a főbb reguláris kifejezéseket, és hogyan használhatók különböző regex feldolgozó motorok.
- Mi az a Regex
- Regex verziók
- A reguláris kifejezések szintaxisa
- A regex szintaxis összetevői
- 16 példa a regex használatára Linuxban
- Regex csalóka lap
- Következtetés
Mi az a Regex
A reguláris kifejezés, vagy regex Linuxban egy minta, amely speciális metakarakterekből áll, hogy illeszkedjen egy adott mintához egy karakterláncban vagy szöveges fájlban.
Nézzük meg egy valós példával, tegyük fel, hogy szeretnél egy kódot írni, amely megtalál egyes specifikus változókat, majd manipulálni őket egy másik kódfájlban, akkor ilyen helyzetben szükséged lehet reguláris kifejezésekre.
Regex verziók
Különböző regex verziók léteznek, és fontos megjegyezni, hogy nem minden regex feldolgozó parancs támogat minden regexet.
- Alapvető reguláris kifejezés (BRE)
- Kiterjesztett reguláris kifejezés (ERE)
- Perl Kompatibilis Reguláris Kifejezés (PCRE)
A BRE és az ERE további kategóriákra osztható:
- POSIX BRE/ERE
- GNU BRE/ERE
A POSIX BRE és a POSIX ERE a GNU BRE és ERE részhalmazai, míg a GNU BRE/ERE a PCRE részhalmaza.
A reguláris kifejezések szintaxisa
Különböző parancssori segédprogramokat használnak reguláris kifejezésekkel, például:
- grep
- sed
- awk
Ezeket a parancsokat regex motoroknak is nevezik, amelyek segítenek a bonyolult reguláris kifejezések fordításában és az eredmény megadásában.
Regex szintaxis grep-pel
grep [options] 'pattern' [string/filename]Regex szintaxis sed-dal
sed [options] '/pattern/' [string/filename]Regex szintaxis awk-val
awk [options] '/pattern/' [string/filename]A Regex szintaxis összetevői
A reguláris kifejezések szintaxisának hat fő összetevője van:
- Karakterek
- Metakarakterek
- Mennyiségek
- Karakterosztályok
- Csoportosítás
- Körbenézések
Karakterek: Ezek az összetevők mintázatokat alkotnak, bármely egyes karakter vagy több karakter felhasználásával, hogy pontos mintázatokat keressenek a szövegben vagy fájlban. Például a H karakter a fájlban a H-ra keres, hasonlóan a Linux betűi pontos Linux szót keresnek a fájlban. Azonban a -i jelző használható a keresés kis- és nagybetű érzéketlenebbé tételéhez.
Meta-karakterek: Ezek az összetevők speciális karaktereket tartalmaznak, és konkrét funkcióval rendelkeznek. Például a pont meta-karaktert a karakter keresésére használják, míg a ^az adott sor elejét egyezteti le, a $ pedig a sor végét. Egy másik meta-karakter, a pipe a|b az a és b egyezésére szolgál a fájlban.
Kvántorok: Ezeket az elemeket arra használják, hogy megtudják, hányszor kell egy adott mintát megismételni. Például a kérdőjel ? csak nulla vagy egy alkalommal ismétli meg az előző karaktert, míg a csillag a korábbi karaktert nullától több alkalommal is megkeresi.
Karakterosztályok: A négyzetes zárójelekbe ([]) zárt karaktercsoportokat karakterosztály-összetevőknek nevezik. Például a [0-9] a 0-tól 9-ig terjedő számokat jelzi, hasonlóképpen a [A-Z] a nagybetűs A-tól Z-ig terjedő összes betűt jelzi.
Csoportosítás: Ez az összetevő segít a minták kerek zárójelek közé() történő csoportosításában. Különösen hasznos a telefon számok vagy e-mail címek ismétlődő szekvenciáinak megtalálásához.
Nézőkörök: Ez a komponens arra szolgál, hogy egy minta körüli pozitív és negatív nézőkört készítsen, amelyet egy másik minta előz meg vagy követ. Például, a(?=b) megkeresi az összes a-t , ha azok b előtt állnak.
16 példa a regex használatára Linuxban
A következő példák a különböző metakarakterek, kvantorok, csoportok és néhány egyedi minta használatát fedezik fel.
Példa 1: Pont (.) kifejezés használata
A pont a reguláris kifejezések alapvető metakaraktere, amelyet egyetlen karakter megjelenítésére használnak. Például:
A grep használata:
grep 'U.untu' mytextfile.txt
sed használata:
sed -n '/U.untu/p' mytextfile.txtAz awk használata:
awk '/U.untu/' mytextfile.txt2. példa: A caret (^) kifejezés használata
A ^ metakaraktert arra használják, hogy megtalálja azokat a sorokat, amelyek a megadott mintától kezdődnek. Például:
Grep használata:
grep '^K' mytextfile.txtSed használata:
sed -n '/^K/p' mytextfile.txtAz awk használata:
awk '/^K/' mytextfile.txtA fenti parancsok az összes bejegyzést kiírják a fájlban, kezdve a K-től.
Példa 3: Dollár ($) kifejezés használata
Ez a metakarakter arra szolgál, hogy megtalálja az összes olyan karakterláncot, amely a megadott karakterre végződik. Például:
Grep használata:
grep 'u$' mytextfile.txtSed használata:
sed -n '/u$/p' mytextfile.txtAwk használata:
awk '/u$/' mytextfile.txtA fenti parancsok megadják az összes olyan karakterláncot a fájlban, amely u-val végződik.
Példa 4: Csillag (*) kifejezés használata
A csillag * kvantáló a megelőző karakterek előfordulását a karakterláncban nulla vagy több alkalommal egyezteti. Ez egyenértékű a {0,}-val. Például:
Grep használata:
grep 'tu*' mytextfile.txtSed használata:
sed -n '/tu*/p' mytextfile.txtAz awk használata:
awk '/tu*/' mytextfile.txtPélda 5: Kérdőjel (?) kifejezés használata
A kérdőjel (?) mennyiségi jelzőt arra használják, hogy megkeressük, hogy az előző karakter nulla vagy egyszer fordul-e elő. Ez egy opcionális kvalifikátorként működik.
Grep használata:
grep -E 'Ub?' mytextfile.txtA fenti parancs -E része az kiterjesztett regexnek.
Sed használata:
sed -nE '/Ub?/p' mytextfile.txtA fenti parancs -E része az kiterjesztett regexnek.
Awk használata:
awk '/Ub/' mytextfile.txtA csillag és a kérdőjel kvantor közötti különbség az alábbi képen látható:
A csillag (*) az előző karakternek megfelelő összes karaktert keres, míg a kérdőjel (?) az előző karaktert csak egyszer találja meg.
Példa 6: A visszaperjel (\) kifejezés használata
Ez a visszaper jel \ metakarakter a speciális karakter képviseletére szolgál. Például a csillag * maga is speciális karakter, hogy a csillagot szó szerint használjuk, visszaper jelet fogunk használni.
Keressük meg az összes Linux disztribúciót a mytextfile.txt fájlban, amelynek nevében szóköz van.
Grep használata:
grep '\s' mytextfile.txtSed használata:
sed -n '/\s/p' mytextfile.txtAwk használata:
awk '/\s/' mytextfile.txtTovábbá, a visszaperjel más különböző escape karakterekkel is használatos.
Példa 7: Minták csoportosítása kerek zárójelek() használatával
A kerek zárójelek() arra szolgálnak, hogy összepárosítsák a bennük lévő kifejezések csoportját. Nézzük meg egy példával:
Grep használata:
grep -E '(untu)' mytextfile.txtSed használata:
sed -nE '/(untu)/p' mytextfile.txtAz awk használata:
awk '/(untu)/' mytextfile.txtA fenti parancsokban a motor olyan bejegyzéseket fog, amelyek megegyeznek a (untu) csoporttal. A csoport más mintával is használható, amely követheti azt. Például, ha a (untu) csoportot (unt)u csoporttal helyettesítjük, az eredmény ugyanaz lesz.
8. példa: Tartományi minták létrehozása kapcsos zárójelek {} használatával
A curly bracek {} ismétlődési kvantorok. Három különböző módon használhatja őket:
{x}: {x} alkalommal való megjelenés
{x,y} vagy {min,max}: Megjelenik x alkalommal, de nem többször, mint y
{x,}: Megjelenik x alkalommal és annál többször
Grep használata:
grep -E l\{2} mytextfile.txtSed használata:
sed -nE '/l{2}/p' mytextfile.txtAz awk használata:
awk '/l{2}/' mytextfile.txtA fenti parancs olyan bejegyzéseket talál, amelyek tartalmazzák l karaktert kétszer, például Bill és Skill.
9. példa: \d használata számok keresésére
A \d kifejezést arra használják, hogy megtalálják a számjegyekkel rendelkező karakterláncot egy karakterláncban vagy fájlban. Például:
Grep használata:
grep -P '\d' mytextfile.txtP azt jelzi, hogy ez egy Perl-kompatibilis reguláris kifejezés, további részletekért olvassa el itt.
A sed és awk esetében a \d nem használható, mert a sed POSIX reguláris kifejezés, és nem Perl PCRE, ezért a \d megfelelője a sed és awk esetében a [0-9] vagy [[:digit:]].
Sed használata:
sed -n '/[0-9]/p' mytextfile.txtVagy :
sed -n '/[[:digit:]]/' mytextfile.txtAz awk használata:
awk '/[0-9]/' mytextfile.txtVagy :
awk -n '/[[:digit:]]/' mytextfile.txtPélda 10: Logikai VAGY operátor használata |
A reguláris kifejezés ugyanúgy működik, mint a logikai VAGY kapu. Például, ha a|o-t használunk, akkor ez a minta megtalálja az összes olyan szót, amely tartalmazza vagy az 'a' karaktert, vagy az 'o' karaktert.
Grep használata:
grep -E 'k|a' mytextfile.txtSed használata:
sed -nE '/k|a/p' mytextfile.txtAz awk használata:
awk '/k|a/' mytextfile.txt11. példa: Minden olyan szó megtalálása, amely egy adott karakterhosszal rendelkezik
A pontos karakterrel (.) lehetőség van arra, hogy megtaláljuk az összes szót egy adott számú karakterrel. A pont metakarakter egy karakter megtalálására szolgál, de több karakter keresésére is használható. Az összes négy karakterből álló sort a következőképpen találhatja meg:
Grep használata:
grep '^....$' mytextfile.txtSed használata:
sed -n '/^....$/p' mytextfile.txtAz awk használata:
awk '/^....$/' mytextfile.txt12. példa: IP-cím keresése egy fájlból
Az IP-cím az egyik kulcselem, amelyet ki szeretnénk nyerni egy fájlból regex segítségével. Mivel egy IP-cím pontokat tartalmaz, a regex használatával történő keresés nem egy egyszerű feladat: a pontot (.) vissza kell escape-elnünk per jellel. Nézzük meg, hogyan lehet IP-címeket kinyerni a /etc/hosts fájlból.
Grep használata:
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hostsVagy :
grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/hostsSed használata:
sed -nE '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' /etc/hostsAz awk használata:
awk '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' /etc/hostsPélda 13: A tizedes számok megtalálása
A tizedes szám egy egész szám és a pont (.) utáni tört rész kombinált száma. A tizedes szám kinyeréséhez egy fájlból regex segítségével, lásd az alábbi parancsot:
Grep használata:
grep -P '^\d*\.\d+$' mytextfile.txtA \d egyenértékű a [[:digit:]]-el és a [0-9]-el, de a grep támogatja a PCRE reguláris kifejezéseket, így használhatjuk a -P zászlóval.
Sed használata:
sed -nE '/[[:digit:]]*\.[[:digit:]]+$/p' mytextfile.txtAz awk használata:
awk '/[0-9]*\.[0-9]+$/' mytextfile.txtA fenti parancsokban a [[:digit:]] helyett [0-9] használható.
Példa 14: Az idő megtalálása HH:MM 12 órás formátumban
A reguláris kifejezések használhatók időpontok megtalálására egy fájlban; nézzük meg, hogyan lehet időt kinyerni egy fájlból grep, sed és awk parancsok segítségével:
Grep használata:
grep -E '^(0?[1-9]|1[0-2]):[0-5][0-9]$' mytextfile.txtSed használata:
sed -nE '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/p' mytextfile.txtAz awk használata:
awk '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/' mytextfile.txtPélda 15: Dátum keresése YYYY-MM-DD formátumban
Az idő kinyeréséhez egy fájlból a következő reguláris kifejezést fogjuk használni a grep-pel:
Grep használata:
grep -P '([12]\d{3}:(0[1-9]|1[0-2]):(0[1-9]|[12]\d|3[01]))' mytextfile.txtSed használata:
sed -nE '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/p' mytextfile.txtAwk használata:
awk '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/' mytextfile.txtPélda 16: Minták keresése és cseréje
A helyettesítés egy másik regex módszer, amelyet a minta keresésére és cseréjére használnak. Például:
Sed használata:
Szintaxis:
sed -i 's/[pattern]/[replacement]/' [filename]Az eredeti szövegfájl a következő:
Futtassa a parancsot:
sed -i 's/KaOS/Peepin/' mytextfile.txtA fenti parancsban a -i a meglévő fájl módosítására szolgál, ennek a jelzőnek a hiányában a fájl csak az eredményt jeleníti meg a terminálon, a fájl módosítása helyett.
Ellenőrizze a fájlt az ellenőrzéshez:
A keresést tovább lehet javítani a g használatával a kifejezés végén; a g minden előfordulást kicserél. Míg nélküle csak az első előfordulás kerül kicserélésre.
Az awk használata:
Szintaxis:
awk '{sub([pattern]/[replacement]); print}' [filename] > [new_filename]Hajtsd végre a parancsot:
awk '{sub(Peepin/,"KaOS"); print}' mytextfile.txt > newtextfile.txtA hitelesítéshez ellenőrizd az új fájlt:
Peepin most visszatért a KaOS-hoz az új fájlban.
Ezt a gsub használatával is tovább lehet fejleszteni a sub helyett, hogy a minta összes előfordulását cseréljük.
Egy másik fontos dolog, amit figyelembe kell venni, hogy az awk parancs csak a terminálban jeleníti meg az eredményt anélkül, hogy módosítaná az eredeti fájlt. Az eredmény mentéséhez használja a kimeneti irányító operátort, és adja meg a fájl nevét.
Regex Segédlet
A reguláris kifejezések sok metakaraktert és kvantorokat kínálnak a bonyolult minták létrehozására, hogy a keresést még jobban végezhessük. Soroljuk fel a gyakran használt regex szabályokat.
Regex karakterosztályok
Menynyiségi határozók és alternáció
Horgonyok
Előljáró Karakterek
Csoportok és Figyelőszolgálatok
Következtetés
A reguláris kifejezés egy karakterekből álló sorozat, amelyet mintázatok létrehozására használnak, amelyek segítenek információk keresésében egy fájlban és azok feldolgozásában. A Linuxban többféle reguláris kifejezés motor található, például a grep, a sed és az awk. Ez az útmutató az alapvető és haladó reguláris kifejezéseket fedi le mindhárom Linux parancs használatával. Fontos megjegyezni, hogy nem minden Linux reguláris kifejezés motor támogatja az összes reguláris kifejezés típust; például a sed és az awk nem támogatja a PCRE-t, míg minden motor támogatja a BRE-t, ERE-t és PCRE-t.



























































