Weboldal keresés

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.txt

Az awk használata:

awk '/U.untu/' mytextfile.txt

2. 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.txt

Sed használata:

sed -n '/^K/p' mytextfile.txt

Az awk használata:

awk '/^K/' mytextfile.txt

A 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.txt

Sed használata:

sed -n '/u$/p' mytextfile.txt

Awk használata:

awk '/u$/' mytextfile.txt

A 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.txt

Sed használata:

sed -n '/tu*/p' mytextfile.txt

Az awk használata:

awk '/tu*/' mytextfile.txt

Pé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.txt

A fenti parancs -E része az kiterjesztett regexnek.

Sed használata:

sed -nE '/Ub?/p' mytextfile.txt

A fenti parancs -E része az kiterjesztett regexnek.

Awk használata:

awk '/Ub/' mytextfile.txt

A 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.txt

Sed használata:

sed -n '/\s/p' mytextfile.txt

Awk használata:

awk '/\s/' mytextfile.txt

Tová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.txt

Sed használata:

sed -nE '/(untu)/p' mytextfile.txt

Az awk használata:

awk '/(untu)/' mytextfile.txt

A 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.txt

Sed használata:

sed -nE '/l{2}/p' mytextfile.txt

Az awk használata:

awk '/l{2}/' mytextfile.txt

A 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.txt

P 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.txt

Vagy :

sed -n '/[[:digit:]]/' mytextfile.txt

Az awk használata:

awk '/[0-9]/' mytextfile.txt

Vagy :

awk -n '/[[:digit:]]/' mytextfile.txt

Pé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.txt

Sed használata:

sed -nE '/k|a/p' mytextfile.txt

Az awk használata:

awk '/k|a/' mytextfile.txt

11. 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.txt

Sed használata:

sed -n '/^....$/p' mytextfile.txt

Az awk használata:

awk '/^....$/' mytextfile.txt

12. 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/hosts

Vagy :

grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/hosts

Sed használata:

sed -nE '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' /etc/hosts

Az awk használata:

awk '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' /etc/hosts

Pé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.txt

A \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.txt

Az awk használata:

awk '/[0-9]*\.[0-9]+$/' mytextfile.txt

A 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.txt

Sed használata:

sed -nE '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/p' mytextfile.txt

Az awk használata:

awk '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/' mytextfile.txt

Pé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.txt

Sed használata:

sed -nE '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/p' mytextfile.txt

Awk használata:

awk '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/' mytextfile.txt

Pé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.txt

A 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.txt

A 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.