Jó időt, vendégek!
A mai cikkben egy olyan hatalmas témát szeretnék érinteni, mint Reguláris kifejezések. Azt hiszem, mindenki tudja, hogy a reguláris kifejezések témája (ahogy a reguláris kifejezéseket a szlengben nevezik) óriási egy bejegyzésben. Ezért megpróbálom röviden, de a lehető legvilágosabban összeszedni a gondolataimat, és átadni azokat Önnek.
Először is a reguláris kifejezéseknek több fajtája létezik:
Reguláris kifejezések magába foglal minták, vagy inkább állítsa be a mintát keresés. A sablon áll tól től szabályokat keresések, amelyek abból állnak szimbólumokÉs metakarakterek.
Keresési szabályok a következők határozzák meg tevékenységek:
Függőleges sáv (|) elválasztja az érvényes opciókat, mondhatjuk - logikai VAGY. Például a "szürke|szürke" egyezik szürke vagy szürke.
Kerek zárójelek az operátorok hatókörének és elsőbbségének meghatározására szolgálnak. Például a "grey|grey" és a "gr(a|e)y" különböző minták, de mindkettő olyan halmazt ír le, amely tartalmaz szürkeÉs szürke.
Kvantifikátor miután egy karakter vagy csoport meghatározza, hogy hányszor előző kifejezés fordulhat elő.
általános kifejezés, ismétlés lehet m-től n-ig bezárólag.
általános kifejezés, m vagy több ismétlés.
általános kifejezés, legfeljebb n ismétlés.
siman ismétlés.
Kérdőjel eszközök 0 vagy 1 alkalommal, ugyanaz, mint {0,1} . Például a "colou?r" egyezik és szín, És szín.
Csillag eszközök 0, 1 vagy bármilyen szám egyszer ( {0,} ). Például a „go*gle” egyezik ggle, Google, Google satöbbi.
Plusz eszközök legalább 1 egyszer ( {1,} ). Például a „go+gle” egyezik Google, Google stb. (de nem ggle).
A reguláris kifejezések pontos szintaxisa megvalósításfüggő. (azaz be alapvető reguláris kifejezések szimbólumok (és)- fordított perjel megszökött)
Metakarakterek, mondván egyszerű nyelv olyan szimbólumok, amelyek nem felelnek meg valódi jelentésüknek, azaz szimbólumnak. (pont) nem pont, hanem bármely karakter stb. Kérem, hogy ismerkedjen meg a metakarakterekkel és jelentésükkel:
. | megfelel egyedül bármilyen karakter |
[valami] | Megfelel bármely egyén karakter a zárójelben szereplők közül. Ebben az esetben: A "-" karakter csak akkor értelmezhető szó szerint, ha közvetlenül a nyitó vagy a záró zárójel előtt található: vagy [-abc]. Ellenkező esetben egy karakterintervallumot jelöl, például megfelel az "a", "b" vagy "c" karaktereknek. a latin ábécé kisbetűinek felel meg. Ezek a jelölések kombinálhatók is: megfelel a, b, c, q, r, s, t, u, v, w, x, y, z. A „[” vagy „]” karakterek megfeleltetéséhez elegendő, ha a záró zárójel az első karakter volt a nyitó karakter után: „]”, „[”, „a” vagy „b” egyezik. egyetlen karakter azok közül amelyek nincsenek zárójelben. Például az [^abc] az "a", "b" vagy "c" kivételével bármilyen karakterre egyezik. Az [^a-z] a latin ábécé kisbetűi kivételével bármely karakterrel megegyezik. |
^ | Megegyezik a szöveg elejével (vagy bármely sor elejével, ha a mód soronként). |
$ | Illik a szöveg végére (vagy bármely sor végére, ha a mód beágyazott). |
\(\) vagy () | Egy "megjelölt részkifejezést" (csoportosított kifejezést) deklarál, amely később használható (lásd a következő elemet: \ n). A „megjelölt részkifejezés” egyben „blokk” is. A többi operátorral ellentétben ez (a hagyományos szintaxisban) fordított perjelet igényel, kiterjesztett és Perl esetén a \ - karakter nem szükséges. |
\n | Ahol n egy szám 1-től 9-ig; megfelel n megjelölt részkifejezés (pl. (abcd)\0, azaz az abcd karakterek nullával vannak jelölve). Ez a kialakítás elméleti szabálytalan, nem fogadták el a kiterjesztett reguláris kifejezés szintaxisában. |
* |
A "\(" és "\)" karakterek közé zárt, majd a "*" jelet követő kifejezést érvénytelennek kell tekinteni. Egyes esetekben a zárójeles karakterlánc nulla vagy több előfordulásával egyezik. Más esetekben megegyezik a zárójelben lévő kifejezéssel, mivel a "*" karaktert. |
\{x,y\} | Megfelel az utolsónak ( közelgő) legalább előforduló blokkhoz xés nem több y egyszer. Például az "a\(3,5\)" egyezik az "aaa", "aaaa" vagy "aaaaa" kifejezéssel. A többi operátorral ellentétben ez (a hagyományos szintaxisban) fordított perjelet igényel. |
.* | A reguláris kifejezés két része között tetszőleges számú karakter jelölése. |
A metakarakterek segítenek a különféle megfelelések használatában. De hogyan ábrázolható egy metakarakter egy közönséges karakterrel, vagyis a [ (szögletes zárójel) karakter egy szögletes zárójel értékével? Éppen:
Egyes karakterkészletek feladatának egyszerűsítése érdekében egyesítették az ún. karakterosztályok és kategóriák. A POSIX szabványosította bizonyos karakterosztályok és -kategóriák deklarálását, amint azt az alábbi táblázat mutatja:
POSIX osztály | hasonlóképpen | kijelölés |
[:felső:] | nagybetűs karakterek | |
[:Alsó:] | kisbetűk | |
[:alpha:] | kis- és nagybetűs karakterek | |
[:alnum:] | számok, kis- és nagybetűk | |
[:számjegy:] | számok | |
[:xdigit:] | hexadecimális számjegyek | |
[:pont:] | [.,!?:…] | központozás |
[:üres:] | [\t] | szóköz és TAB |
[:hely:] | [\t\n\r\f\v] | karakterek kihagyása |
[:cntrl:] | vezérlő szimbólumok | |
[:grafikon:] | [^ \t\n\r\f\v] | pecsét szimbólumok |
[:nyomtatás:] | [^\t\n\r\f\v] | karakterek nyomtatása és karakterek kihagyása |
A regexben van ilyen:
Megpróbálom a lehető legvilágosabban leírni. Tegyük fel, hogy mindent meg akarunk találni HTML címkék valamilyen szövegben. A probléma lokalizálása után meg akarjuk találni a közötti értékeket< и >, azokkal a zárójelekkel együtt. De tudjuk, hogy a címkék különböző hosszúságúak, és maguk is legalább 50. Mindegyik felsorolása, metakarakterekbe zárása túlságosan fáradságos feladat. De tudjuk, hogy van egy kifejezésünk.* (csillagpont), amely egy karakterlánc tetszőleges számú karakterét jellemzi. Ezzel a kifejezéssel megpróbáljuk megtalálni a szövegben (
Így, Hogyan kell létrehozni RAID szint 10/50 az LSI MegaRAID vezérlőn (a következőre is vonatkozik: Intel SRCU42x, Intel SRCS16):
) minden érték között< и >. Ennek eredményeként a TELJES karakterlánc megegyezik ezzel a kifejezéssel. miért, mert a reguláris kifejezés mohó, és MINDEN közötti számú karaktert megpróbál befogni< и >, illetve a teljes sort, kezdve < p> Szóval...és véget ér ...> ehhez a szabályhoz fog tartozni!Remélem, a példa világossá teszi, mi a kapzsiság. Hogy megszabaduljon ettől a kapzsiságtól, a következő módon járhat:
A fentieket szeretném kiegészíteni. kiterjesztett reguláris kifejezés szintaxisa:
A POSIX reguláris kifejezései hasonlóak a hagyományos Unix szintaxishoz, de néhány metakarakter hozzáadásával:
Plusz azt jelzi előző szimbólum ill csoport megismétlődhet egy vagy több alkalommal. A csillaggal ellentétben legalább egy ismétlés szükséges.
Kérdőjel csinál előző karakter vagy választható csoport. Más szóval, a megfelelő sorban azt hiányozhat vagy jelen van sima egy egyszer.
függőleges sáv megoszt alternatívák reguláris kifejezések. Egy karakter két alternatívát ad meg, de lehet több is, elég több függőleges vonalat használni. Emlékeztetni kell arra, hogy ez az operátor a kifejezés lehető legnagyobb részét használja. Emiatt az alternatív operátort leggyakrabban zárójelben használják.
A fordított perjelek használata szintén elavult: \(…\) lesz (…), \(…\) pedig (…).
A bejegyzés végén íme néhány példa a regex használatára:
$ macska szöveg1 1 alma 2 körte 3 banán $ grep p szöveg1 1 alma 2 körte $ grep "pp*" szöveg1 1 alma 2 körte $ macska szöveg1 | grep "l\|n" 1 alma 3 banán $ echo -e "keress egy\n*-t itt" | grep "\*" * itt $ grep "pl\?.*r" text1 # p, a sorokon r 2 körte $ grep "a.." text1 # sorok a következővel legalább 2 karakter 1 alma 3 banán $ grep "" text1 # 3 vagy p szót tartalmazó sorok keresése 1 alma 2 körte 3 banán $ echo -e "keressen egy\n*-t itt\nvalahol." | grep "[.*]" * itt valahol..név]$ echo -e "123\n456\n789\n0" | grep "" 123 456 789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # cserélje ki a-t A-ra minden olyan sorban, ahol utána a jön a vagy utána p jön p 1 Alma 2 körte 3 bAnAnA *\./ LAST WORD./g" First. A LAST WORD. This is a LAST WORD.
Üdvözlettel: Mc.Sim!
A bash szkriptekben lévő szövegek sed és awk segítségével történő teljes feldolgozásához csak meg kell értenie a reguláris kifejezéseket. Ennek megvalósításai leghasznosabb eszköze szó szerint mindenhol megtalálhatók, és bár minden reguláris kifejezés hasonló módon van elrendezve, ugyanazon ötletek alapján, a velük való munkavégzésnek vannak bizonyos jellemzői különböző környezetekben. Itt azokról a reguláris kifejezésekről lesz szó, amelyek alkalmasak Linux parancssori szkriptekben való használatra.
Ez az anyag a reguláris kifejezések bevezetését szolgálja azok számára, akik esetleg nem ismerik a reguláris kifejezéseket. Ezért kezdjük a legelejéről.
Szerintünk egy abszolút kezdő is azonnal megérti, hogyan működik és miért van rá szükség :) Ha nem egészen érted, csak olvass tovább, és minden a helyére kerül.
A reguláris kifejezés egy olyan minta, amelyet a sed vagy az awk programok a szöveg szűrésére használnak. A sablonok szokásos ASCII-karaktereket használnak, amelyek önmagukat reprezentálják, és úgynevezett metakaraktereket, amelyek különleges szerepet játszanak, például lehetővé teszik bizonyos karaktercsoportokra való hivatkozást.
A POSIX ERE szabványt gyakran programozási nyelveken implementálják. Lehetővé teszi számos eszköz használatát reguláris kifejezések fejlesztése során. Ezek lehetnek például speciális karaktersorozatok gyakran használt mintákhoz, például egyes szavak vagy számkészletek keresése a szövegben. Az awk támogatja az ERE szabványt.
A reguláris kifejezések fejlesztésének számos módja van, a programozó véleményétől és a létrehozási motor jellemzőitől függően. Nem könnyű olyan általános reguláris kifejezéseket írni, amelyeket bármely motor megért. Ezért a leggyakrabban használt reguláris kifejezésekre fogunk összpontosítani, és megvizsgáljuk azok megvalósításának sajátosságait a sed és az awk esetében.
$ echo "Ez egy teszt" | sed -n "/test/p" $ echo "Ez egy teszt" | awk "/test/($0 nyomtatása)"
Szöveg keresése minta szerint a sed-ben
Észreveheti, hogy egy adott minta keresése anélkül történik, hogy figyelembe vennék a szöveg pontos helyét a karakterláncban. Ráadásul az előfordulások száma nem számít. Miután a reguláris kifejezés megtalálja az adott szöveget bárhol a karakterláncban, a karakterlánc megfelelőnek minősül, és továbbadja a további feldolgozásnak.
Amikor reguláris kifejezésekkel dolgozik, ne feledje, hogy ezek megkülönböztetik a kis- és nagybetűket:
$ echo "Ez egy teszt" | awk "/Test/(print $0)" $ echo "Ez egy teszt" | awk "/test/($0 nyomtatása)"
A reguláris kifejezések megkülönböztetik a kis- és nagybetűket
Az első reguláris kifejezés nem talált egyezést, mivel a nagybetűvel kezdődő "teszt" szó nem fordul elő a szövegben. A második, amely úgy volt beállítva, hogy egy nagybetűvel írt szót keressen, megfelelő karakterláncot talált az adatfolyamban.
A reguláris kifejezésekben nem csak betűket, hanem szóközöket és számokat is használhat:
$ echo "Ez megint egy teszt 2" | awk "/test 2/(nyomtatás $0)"
Szóközöket és számokat tartalmazó szövegrész keresése
A szóközöket a reguláris kifejezés motorja reguláris karakterként kezeli.
.*^${}\+?|()
Ha ezek valamelyikére szükség van a mintában, akkor azt egy fordított perjellel (backslash) - \ billentyűvel kell megszakítani.
Például, ha egy dollárjelet kell találnia a szövegben, akkor azt szerepeltetni kell a sablonban, egy escape karakter előtt. Tegyük fel, hogy van egy myfile fájl a következő szöveggel:
10 dollár van a zsebemben
A dollárjel a következő mintával érzékelhető:
$ awk "/\$/(print $0)" saját fájl
Speciális karakter használata sablonban
Ráadásul a fordított perjel is egy speciális karakter, így ha sablonban akarjuk használni, akkor azt is el kell távolítani. Úgy néz ki, mintha két perjel követné egymást:
$ echo "\ egy speciális karakter" | awk "/\\/($0 nyomtatása)"
Hátsó perjel szökés
Bár a perjel nem szerepel a speciális karakterek fenti listájában, a sed-re vagy awk-ra írt reguláris kifejezésben történő használatának kísérlete hibát eredményez:
$ echo "3/2" | awk "///($0 nyomtatása)"
A perjel helytelen használata a sablonban
Ha szükséges, akkor ki is kell szökni:
$ echo "3/2" | awk "/\//($0 nyomtatása)"
Menekülés egy perjel elől
$ echo "üdvözöljük a likegeeks weboldalán" | awk "/^likegeeks/($0 nyomtatása)" $ echo "likegeeks webhely" | awk "/^likegeeks/(nyomtasson $0)"
Keressen egy mintát a karakterlánc elején
A ^ szimbólumot arra tervezték, hogy egy mintát keressen a sor elején, miközben figyelembe veszi a karakterek kis- és nagybetűit is. Nézzük meg, hogyan befolyásolja ez egy szöveges fájl feldolgozását:
$ awk "/^this/(print $0)" myfile
A sed használatakor, ha a mintán belül bárhol elhelyez egy escape karaktert, a rendszer úgy kezeli, mint bármely más normál karaktert:
$ echo "Ez egy teszt" | sed -n "/s ^/p"
A sapka nincs a minta elején a sed-ben
Az awk-ban ugyanazon minta használatakor az adott karaktert meg kell szökni:
$ echo "Ez egy teszt" | awk "/s \^/($0 nyomtatása)"
A fedél nem az awk minta elején található
A sor elején található szövegrészletek keresésével rájöttünk. Mi van, ha valamit a sor végén kell találnia?
Ebben segít nekünk a dollárjel - $ , amely a sor végének horgony karaktere:
$ echo "Ez egy teszt" | awk "/teszt$/($0 nyomtatása)"
Szöveg keresése a sor végén
Mindkét horgonykarakter használható ugyanabban a mintában. A következő reguláris kifejezéssel dolgozzuk fel a myfile fájlt, amelynek tartalma az alábbi ábrán látható:
$ awk "/^ez egy teszt$/(nyomtasson $0)" saját fájl
Amint látható, a sablon csak olyan karakterláncra reagált, amely teljes mértékben megfelelt az adott karaktersorozatnak és azok helyének.
A következőképpen szűrheti ki az üres sorokat horgonykarakterek használatával:
$ awk "!/^$/(nyomtassa $0)" saját fájl
Ebben a sablonban a tagadó jelet, a felkiáltójelet használtam - ! . Egy ilyen minta használatával olyan karakterláncokat keres a rendszer, amelyek nem tartalmaznak semmit a karakterlánc eleje és vége között, és köszönhetően felkiáltójel csak azokat a sorokat nyomtatja ki, amelyek nem egyeznek ezzel a mintával.
$ awk "/.st/(print $0)" saját fájl
Amint a kimenetből látható, a fájlból csak az első két sor egyezik a mintával, mivel ezek az "st" karaktersorozatot tartalmazzák, amelyet egy másik karakter előz meg, míg a harmadik sor nem tartalmaz megfelelő sorozatot, a negyedik sor pedig igen, de a sor legelején van.
Ennek a megközelítésnek köszönhetően megszervezheti az adott készlet bármely karakterének keresését. A karakterosztály leírásához szögletes zárójeleket használunk:
$ awk "/th/(print $0)" saját fájl
Itt egy "th" karaktersorozatot keresünk, amelyet az "o" vagy az "i" karakter előz meg.
Az osztályok hasznosak, ha olyan szavakat keresünk, amelyek kezdődhetnek nagy- vagy kisbetűvel:
$ echo "ez egy teszt" | awk "/az ő egy teszt/($0 nyomtatása)" $ echo "Ez egy teszt" | awk "/ő egy teszt/(nyomtasson $0)"
Keressen olyan szavakat, amelyek kis- vagy nagybetűvel kezdődhetnek
A karakterosztályok nem korlátozódnak a betűkre. Más karakterek is használhatók itt. Lehetetlen előre megmondani, hogy milyen helyzetben lesz szükség az osztályokra - minden a megoldandó problémától függ.
$ awk "/[^oi]th/(print $0)" saját fájl
BAN BEN ez az eset meg fogja találni a „th” karaktersorozatokat, amelyeket nem „o” vagy „i” előz meg.
$ awk "/st/(print $0)" saját fájl
BAN BEN ezt a példát a reguláris kifejezés megegyezik az „st” karaktersorozattal, amelyet az „e” és „p” karakterek között ábécé sorrendben elhelyezkedő karakterek előznek meg.
Tartományok számokból is létrehozhatók:
$ echo "123" | awk "//" $ echo "12a" | awk "//"
reguláris kifejezés erre keress hármat bármilyen számot
Egy karakterosztály több tartományt is tartalmazhat:
$ awk "/st/(print $0)" saját fájl
Ez a reguláris kifejezés illeszkedni fog az összes "st" szekvenciához, amelyeket a következő karakterek előznek meg tartomány a-fés m-z .
$ echo "abc" | awk "/[[:alpha:]]/($0 nyomtatása)" $ echo "abc" | awk "/[[:digit:]]/($0 nyomtatása)" $ echo "abc123" | awk "/[[:számjegy:]]/($0 nyomtatása)"
$ echo "teszt" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/($0 nyomtatása)"
Ezt a helyettesítő karaktert általában olyan szavakkal való munkavégzésre használják, amelyeket folyamatosan hibásan írnak, vagy olyan szavakhoz, amelyek lehetővé teszik különböző változatok helyes írásmód:
$ echo "Szeretem a zöld színt" | awk "/colou*r/(print $0)" $ echo "Szeretem a zöld színt" | awk "/colou*r/(nyomtatás $0)"
Különböző írásmódú szó keresése
Ebben a példában ugyanaz a reguláris kifejezés felel meg a „szín” és a „szín” szónak is. Ez annak a ténynek köszönhető, hogy az "u" karakter, amelyet egy csillag követ, vagy hiányzik, vagy többször előfordulhat egymás után.
A csillag karakterből fakadó másik hasznos funkció a ponttal való kombinálása. Ez a kombináció lehetővé teszi, hogy a reguláris kifejezés tetszőleges számú karakterre válaszoljon:
$ awk "/this.*test/(print $0)" myfile
Ebben az esetben nem mindegy, hogy a „this” és a „test” szavak között hány és milyen karakter található.
A csillag karakterosztályokkal is használható:
$ echo "st" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/(nyomtatás $0)"
Mindhárom példában a reguláris kifejezés működik, mert a karakterosztály utáni csillag azt jelenti, hogy ha tetszőleges számú "a" vagy "e" karakter található, vagy ha nem találhatók, akkor a karakterlánc illeszkedni fog az adott mintához.
Itt megnézzük az ERE mintákban leggyakrabban használt karaktereket, amelyek hasznosak lehetnek a saját reguláris kifejezések létrehozásakor.
$ echo "tet" | awk "/tes?t/(print $0)" $ echo "teszt" | awk "/tes?t/(print $0)" $ echo "teszt" | awk "/tes?t/($0 nyomtatás)"
Mint látható, a harmadik esetben az „s” betű kétszer fordul elő, így a reguláris kifejezés nem reagál a „teszt” szóra.
A kérdőjel karakterosztályokkal is használható:
$ echo "tst" | awk "/t?st/(print $0)" $ echo "teszt" | awk "/t?st/(print $0)" $ echo "íz" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "teest" | awk "/t?st/(print $0)"
Ha a karakterláncban nincsenek az osztályból származó karakterek, vagy valamelyik egyszer előfordul, akkor a reguláris kifejezés működik, de amint két karakter megjelenik a szóban, a rendszer már nem talál megfelelőt a szövegben lévő mintára.
$ echo "teszt" | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(print $0)"
Ebben a példában, ha nincs „e” karakter a szóban, a reguláris kifejezés motorja nem talál egyezést a szövegben. A plusz szimbólum a karakterosztályokkal is működik - így hasonló a csillaghoz és a kérdőjelhez:
$ echo "tst" | awk "/t+st/(print $0)" $ echo "teszt" | awk "/t+st/(print $0)" $ echo "teast" | awk "/t+st/(print $0)" $ echo "teeast" | awk "/t+st/($0 nyomtatása)"
Ebben az esetben, ha a karakterlánc tartalmaz bármilyen karaktert az osztályból, a szöveg a mintával megegyezőnek minősül.
$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "teszt" | awk "/te(1)st/(print $0)"
Göndör zárójelek mintákban, az előfordulások pontos számának megtalálása
Az awk régebbi verzióiban a --re-interval parancssori kapcsolót kellett használni ahhoz, hogy a program felismerje az intervallumokat a reguláris kifejezésekben, de az újabb verziókban nem.
$ echo "tst" | awk "/te(1,2)st/(print $0)" $ echo "teszt" | awk "/te(1,2)st/(print $0)" $ echo "teest" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/(print $0)"
Ebben a példában az "e" karakternek 1-2 alkalommal kell előfordulnia a karakterláncban, ekkor a reguláris kifejezés reagál a szövegre.
A göndör kapcsos zárójelek karakterosztályokkal is használhatók. Az Ön számára már ismert alapelvek itt érvényesek:
$ echo "tst" | awk "/t(1,2)st/(print $0)" $ echo "teszt" | awk "/t(1,2)st/(print $0)" $ echo "teest" | awk "/t(1,2)st/(print $0)" $ echo "teeast" | awk "/t(1,2)st/(print $0)"
A sablon akkor reagál a szövegre, ha az "a" vagy az "e" karakter egyszer-kétszer előfordul benne.
$ echo "Ez egy teszt" | awk "/test|exam/(print $0)" $ echo "Ez egy vizsga" | awk "/test|exam/(print $0)" $ echo "Ez valami más" | awk "/teszt|vizsga/($0 nyomtatása)"
Ebben a példában a reguláris kifejezés úgy van beállítva, hogy a "teszt" vagy "vizsga" szavakat keresse a szövegben. Ügyeljen arra, hogy a sablontöredékek és az őket elválasztó | szimbólum között. ne legyenek szóközök.
A reguláris kifejezés fragmensei zárójelek használatával csoportosíthatók. Ha egy bizonyos karaktersorozatot csoportosít, azt a rendszer szabályos karakterként fogja fel. Azaz például ismétlési metakarakterek alkalmazhatók rá. Így néz ki:$ echo "Tetszik" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(nyomtassa: $0)"
Ezekben a példákban a „Geeks” szó zárójelben van, amit egy kérdőjel követ. Emlékezzünk vissza, hogy a kérdőjel "0 vagy 1 ismétlést" jelent, ennek eredményeként a reguláris kifejezés megegyezik a "Like" és a "LikeGeeks" karakterlánccal is.
$ echo $PATH | sed "s/:/ /g"
A helyettesítő parancs támogatja a reguláris kifejezéseket mintaként a szöveges kereséshez. Ebben az esetben minden rendkívül egyszerű, kettőspont szimbólumot keresünk, de itt senki sem törődik mással - minden a konkrét feladattól függ.
Most egy ciklusban át kell mennünk a kapott listán, és végre kell hajtanunk a szükséges műveleteket az ott található fájlok számának megszámlálásához. Általános séma a forgatókönyv a következő lesz:
Mypath=$(echo $PATH | sed "s/:/ /g") a $mypath könyvtárhoz do done
Most írjuk meg a szkript teljes szövegét az ls paranccsal, hogy információt kapjunk az egyes könyvtárakban található fájlok számáról:
#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 a $mypath könyvtárban do check=$(ls $könyvtár) a $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 kész
A szkript futtatásakor kiderülhet, hogy néhány könyvtár a PATH-ból nem létezik, ez azonban nem akadályozza meg, hogy a meglévő könyvtárakban lévő fájlokat számolja.
A példa fő értéke az, hogy ugyanazt a megközelítést alkalmazva sokkal összetettebb problémákat is megoldhat. Hogy melyik az Ön igényeitől függ.
[e-mail védett]
A felhasználónév, felhasználónév , alfanumerikus karakterekből és néhány más karakterből állhat. Ez ugyanis egy pont, kötőjel, aláhúzás, pluszjel. A felhasználónevet a @ jel követi.
Ezzel a tudással felvértezve kezdjük el a reguláris kifejezés összeállítását a bal oldaláról, ami a felhasználónév ellenőrzésére szolgál. Íme, amit kaptunk:
^(+)@
Ez a reguláris kifejezés a következőképpen olvasható: "A sor elején legalább egy karakternek kell lennie a szögletes zárójelben szereplő csoportból, és utána egy @ jelnek kell lennie."
Most ez a hostname queue - hostname . Itt ugyanazok a szabályok érvényesek, mint a felhasználónévre, tehát a sablon így néz ki:
(+)
A legfelső szintű domain névre speciális szabályok vonatkoznak. Csak alfabetikus karakterek lehetnek, amelyeknek legalább kettőnek kell lenniük (például az ilyen tartományok általában országkódot tartalmaznak), és legfeljebb öt. Mindez azt jelenti, hogy a cím utolsó részének ellenőrzésére szolgáló sablon a következő lesz:
\.({2,5})$
Ezt a következőképpen olvashatja: "Először egy pontnak kell lennie, majd - 2-5 alfabetikus karakter, és utána a sor véget ér."
Miután elkészítettük a mintákat a reguláris kifejezés egyes részeihez, rakjuk össze őket:
^(+)@(+)\.({2,5})$
Most már csak tesztelni kell, mi történt:
$echo" [e-mail védett]" | awk "/^(+)@(+)\.((2,5))$/($0 nyomtatása)" $ echo " [e-mail védett]" | awk "/^(+)@(+)\.((2,5))$/($0 nyomtatása)"
Az a tény, hogy az awk-nak átadott szöveg megjelenik a képernyőn, azt jelenti, hogy a rendszer e-mail címként ismerte fel.
Ebben az anyagsorozatban általában nagyon egyszerű példákat mutattunk be olyan bash szkriptekre, amelyek szó szerint néhány sorból álltak. Legközelebb nézzünk valami nagyobbat.
Kedves olvasóink! Használ reguláris kifejezéseket, amikor szöveget dolgoz fel parancssori szkriptekben?
Az egyik leghasznosabb és legsokoldalúbb parancs Linux terminál- "grep" parancs. A Grep egy mozaikszó, amely a "globális reguláris kifejezés nyomtatását" jelenti (vagyis "keressen mindenhol megfelelő reguláris kifejezéssorokat, és adja ki őket"). Ez azt jelenti, hogy a grep segítségével ellenőrizhető, hogy a bemenet egyezik-e az adott mintákkal.
Ez a látszólag triviális program nagyon hatékony, ha helyesen használják. Az a képessége, hogy összetett szabályok alapján rendezi a bemenetet, sok parancsláncban népszerű kötőanyaggá teszi.
Ez az oktatóanyag a grep parancs néhány funkcióját tekinti át, majd áttér a reguláris kifejezések használatára. Az ebben az útmutatóban leírt összes technika alkalmazható egy virtuális szerver kezelésére.
A legegyszerűbb formájában a grep szó szerinti minták egyeztetésére szolgál szöveges fájl. Ez azt jelenti, hogy ha a grep parancs keresőszót kap, akkor a fájl minden sorát kinyomtatja, amely ezt a szót tartalmazza.
Példaként a grep segítségével megkeresheti a „GNU” szót tartalmazó sorokat a GNU General Public License 3. verziójában Ubuntu rendszeren.
cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU ÁLTALÁNOS NYILVÁNOS LICENC
13. Használja a GNU Affero General Public License-szel.
a GNU Affero General Public License 3. verziója alatt egyetlen
...
...
Az első argumentum, a "GNU" a keresendő sablon, a második argumentum, a "GPL-3" pedig a keresendő bemeneti fájl.
Ennek eredményeként az összes szövegmintát tartalmazó sor megjelenik. Néhány Linux disztribúciók a keresett minta kiemelve lesz a megjelenített sorokban.
Alapértelmezés szerint a grep egyszerűen megkeresi az erősen meghatározott mintákat a bemeneti fájlban, és kinyomtatja a talált sorokat. A grep viselkedése azonban módosítható néhány további jelző hozzáadásával.
Ha figyelmen kívül szeretné hagyni a keresési paraméter kis- és nagybetűit, és a minta nagy- és kisbetűs változatait is meg szeretné keresni, használhatja a "-i" vagy a "--ignore-case" segédprogramokat.
Például a grep segítségével ugyanabban a fájlban kereshet a "licenc" szóra nagy-, kis- vagy vegyes kisbetűkkel.
grep -i "licenc" GPL-3
GNU ÁLTALÁNOS NYILVÁNOS LICENC
pontjában található, de megváltoztatása nem megengedett.
A GNU General Public License egy ingyenes, copyleft licenc
A legtöbb szoftverhez és más gyakorlati munkához a licencek meg vannak tervezve
a GNU Általános Nyilvános Licenc célja, hogy garantálja az Ön szabadságát
GNU általános nyilvános licenc a legtöbb szoftverünkhöz; arra is vonatkozik
"Ez a licenc" a GNU General Public License 3. verziójára vonatkozik.
A „Program” minden olyan, szerzői jog által védett munkára vonatkozik, amely ennek értelmében engedélyezett
...
...
Amint láthatja, a kimenet tartalmazza a "LICENSE", "licenc" és "License" kifejezéseket. Ha a fájlban van egy "LiCeNsE" példány, akkor az is megjelenne.
Ha meg akarja találni az összes olyan sort, amely nem tartalmazza a megadott mintát, használhatja a "-v" vagy a "--invert-match" jelzőt.
Példaként a következő paranccsal kereshet a BSD-licencben minden olyan sorra, amely nem tartalmazza a "the" szót:
grep -v "a"BSD
Minden jog fenntartva.
Újraelosztás és felhasználás forrás- és bináris formában, akár nélküle
teljesülnek:
felhasználható az ebből a szoftverből származó termékek támogatására vagy népszerűsítésére
külön előzetes írásbeli engedély nélkül.
EZT A SZOFTVERT A REGENSEK ÉS A KÖZREMŰKÖDŐK ÁLTAL BIZTOSÍTJÁK "AHOGY VAN"
BÁRMILYEN KIFEJEZETT VAGY VÉLELMEZETT GARANCIA, BELEÉRTVE, DE NEM KORLÁTOZOTT,
...
...
Amint láthatja, az utolsó két sor úgy lett kiírva, hogy nem tartalmazza a "the" szót, mert a "kis- és nagybetűk figyelmen kívül hagyása" parancsot nem használták.
Mindig hasznos tudni a sorszámokat, ahol találtak egyezést. Megtalálhatók az "-n" vagy a "--line-number" jelzők használatával.
Ha ezt a jelzőt alkalmazza az előző példában, akkor a következő kimenet jelenik meg:
grep -vn "a" BSD
2: Minden jog fenntartva.
3:
4: Újraelosztás és felhasználás forrás- és bináris formában, akár nélküle
6:teljesítenek:
13: felhasználható az ebből a szoftverből származó termékek támogatására vagy reklámozására
14: külön előzetes írásbeli engedély nélkül.
15:
16: EZT A SZOFTVERT A REGENTSEK ÉS KÖZREMŰKÖDŐK NYÚJTJÁTOK ``AHOGY VAN""
17: BÁRMILYEN KIFEJEZETT VAGY VÉLELMEZETT GARANCIA, BELEÉRTVE, de nem korlátozva
...
...
Mostantól szükség szerint hivatkozhat a sorszámra, hogy módosítsa azokat a sorokat, amelyek nem tartalmazzák a „the” szót.
Ahogy a bevezetőben említettük, a grep a "globális reguláris kifejezés nyomtatása" rövidítése. A reguláris kifejezés egy szöveges karakterlánc, amely egy adott keresési mintát ír le.
A különböző alkalmazások és programozási nyelvek kissé eltérő módon használják a reguláris kifejezéseket. Ez az útmutató a Grep-minták leírásának csak egy kis részét fedi le.
A "GNU" és "the" szavak keresésének fenti példái nagyon egyszerű reguláris kifejezéseket kerestek, amelyek pontosan megegyeztek a "GNU" és "the" karaktersorozattal.
Helyesebb ezeket karaktersorozatok egyezéseként ábrázolni, mint szavak egyezéseként. Ahogy megismered az összetettebb mintákat, ez a megkülönböztetés egyre jelentősebb lesz.
Azokat a mintákat, amelyek pontosan megegyeznek az adott karakterekkel, "ábécé"-nek nevezzük, mert betűről betűre, karakterenként egyezik a mintával.
Minden alfabetikus és numerikus karakter (valamint néhány más karakter) szó szerint egyezik, kivéve, ha más kifejezési motorok módosították őket.
A horgonyok olyan speciális karakterek, amelyek a kívánt egyezés karakterláncában jelzik a helyet.
Például megadhatja, hogy a keresés csak a "GNU" szót tartalmazó karakterláncokat keresse a legelején. Ehhez a "^" horgonyt kell használnia a szó szerinti karakterlánc előtt.
Ebben a példában csak azok a sorok jelennek meg, amelyek a "GNU" szót tartalmazzák a legelején.
grep "^GNU" GPL-3
GNU általános nyilvános licenc a legtöbb szoftverünkhöz; arra is vonatkozik
GNU Általános Nyilvános Licenc esetén bármelyik valaha megjelent verziót választhatja
Hasonlóképpen, a "$" horgony használható egy literális karakterlánc után annak jelzésére, hogy az egyezés csak akkor érvényes, ha a keresett karakterlánc a szövegsorozat végén található.
A következő reguláris kifejezés csak azokat a sorokat adja ki, amelyek végén az "és" szerepel:
grep "and$" GPL-3
hogy erre az ingyenes szoftverre nincs garancia. Mindkét felhasználó számára" és
A pontos másolási, terjesztési és terjesztési feltételek
alternatíva csak alkalmanként és nem kereskedelmi céllal engedélyezett, és
hálózat megtagadható, ha a módosítás maga lényegesen és
hátrányosan befolyásolja a hálózat működését vagy megsérti a szabályokat és
ideiglenesen, kivéve, ha és amíg a szerzői jog tulajdonosa kifejezetten és
licencet kap az eredeti licencadóktól a futtatásra, módosításra és
készíteni, használni, eladni, eladásra kínálni, importálni és más módon futtatni, módosítani és
A pont (.) a reguláris kifejezésekben azt jelzi, hogy bármely karakter megjelenhet a megadott helyen.
Például, ha olyan egyezéseket szeretne találni, amelyek két karakterből, majd a "cept" sorozatból állnak, akkor a következő mintát kell használnia:
grep "..cept" GPL-3
használata, amely pontosan ott a leginkább elfogadhatatlan. Ezért mi
a vonatkozó szerzői jogi törvények megsértése, kivéve a végrehajtást a
közli a felhasználóval, hogy a munkára nincs garancia (kivéve a
külön írásos engedély formájában, vagy kivételként feltüntetve;
Ön nem terjesztheti vagy módosíthatja a lefedett művet, kivéve, ha kifejezetten erre utal
9. Elfogadás nem szükséges a másolatok birtoklásához.
...
...
Amint láthatja, az "elfogad" és a "kivéve" szavak jelennek meg az eredményekben, valamint ezeknek a szavaknak a változatai. A minta a „z2cept” szekvenciával is megegyezne, ha van ilyen a szövegben.
Ha egy karaktercsoportot szögletes zárójelbe ("") tesz, jelezheti, hogy a zárójelben lévő karakterek bármelyike ebben a helyzetben lehet.
Ez azt jelenti, hogy ha olyan karakterláncokat kell találnia, amelyek "túl" vagy "kettő"-t tartalmaznak, röviden megadhatja ezeket a változatokat a következő minta segítségével:
grep "to" GPL-3
a programjaidat is.
A GNU GPL-t használó fejlesztők két lépéssel védik jogait:
a számítógépes hálózat másolat átvitele nélkül nem közvetít.
Megfelelő forrás hálózati szerverről díjmentesen.
...
...
Mint látható, mindkét változat megtalálható a fájlban.
A sorozatos karakterek számos hasznos funkciót is kínálnak. Megadhatja, hogy a minta mindenre illeszkedjen, kivéve a zárójelben lévő karaktereket, ha a zárójelben lévő karakterek listáját a "^" karakterrel kezdi.
Ebben a példában az „.ode” sablont használjuk, amely nem egyezhet meg a „code” sorozattal.
grep "[^c]ode" GPL-3
1. Forráskód.
modell, hogy bárkinek, aki rendelkezik az objektumkóddal, megadja vagy (1) a
a termék egyetlen jelentős felhasználási módja.
ezt figyelje meg, amikor interaktív módban indul:
Érdemes megjegyezni, hogy a második kimeneti sor a "kód" szót tartalmazza. Ez nem regex vagy grep hiba.
Inkább erre a sorra következtettek, mert tartalmazza a "model" szóban található mintaillesztő "mode" sorozatot is. Vagyis a karakterlánc azért került kiadásra, mert megfelelt a mintának.
A zárójelek másik hasznos funkciója az a képesség, hogy karaktertartományt adjunk meg ahelyett, hogy minden karaktert külön-külön beírnánk.
Ez azt jelenti, hogy ha minden nagybetűvel kezdődő sort meg szeretne találni, használja a következő mintát:
grep "^" GPL-3
GNU általános nyilvános licenc a legtöbb szoftverünkhöz; arra is vonatkozik
engedély. Minden engedélyes megszólítása „Ön”. "Engedélyek" és
Rendszerkönyvtárak, általános célú eszközök vagy általában ingyenesen elérhetők
forrás.
...
...
Néhány eredendő rendezési probléma miatt a pontosabb eredmény érdekében jobb a POSIX szabványos karakterosztályokat használni a fenti példában használt karaktertartomány helyett.
Számos karakterosztály van, amelyre ez az útmutató nem tér ki; például a fenti példában szereplő eljárás végrehajtásához használhatja a "[:upper:]" karakterosztályt zárójelben.
grep "^[[:upper:]]" GPL-3
GNU általános nyilvános licenc a legtöbb szoftverünkhöz; arra is vonatkozik
Az államok nem engedhetik meg, hogy a szabadalmak korlátozzák a fejlesztést és a felhasználást
engedély. Minden engedélyes megszólítása „Ön”. "Engedélyek" és
Összetevő, és (b) csak arra szolgál, hogy lehetővé tegye a mű ezzel való használatát
Fő komponens, vagy olyan szabványos interfész megvalósítása, amelyhez egy
Rendszerkönyvtárak, általános célú eszközök vagy általában ingyenesen elérhetők
forrás.
A Felhasználói Termék örökre vagy a címzett részére kerül átadásra
...
...
Az egyik leggyakrabban használt metakarakter a "*" karakter, ami azt jelenti, hogy "ismételje meg az előző karaktert vagy kifejezést 0 vagy többször".
Például, ha meg akar találni minden olyan sort, amelyik nyitó vagy záró zárójelekkel rendelkezik, és amelyek csak betűket és szóközöket tartalmaznak, használhatja a következő kifejezést:
grep "(*)" GPL-3
terjesztése (módosítással vagy anélkül), elérhetővé tétele a
mint a mű egésze, hogy (a) a normál alakjában szerepel
Összetevő, és (b) csak arra szolgál, hogy lehetővé tegye a mű ezzel való használatát
(ha van ilyen), amelyen a végrehajtható munka fut, vagy egy fordító, amelyen szokott
(beleértve a fizikai terjesztési közeget is), kíséri a
(beleértve a fizikai terjesztési közeget is), kíséri a
helyet (ingyenes vagy térítés ellenében), és ezzel egyenértékű hozzáférést biztosítanak a
...
...
Néha érdemes keresni egy szó szerinti pontot vagy egy szó szerinti nyitott zárójelet. Mert ezek a karakterek azok bizonyos értéket a reguláris kifejezésekben "el kell menekülnie" tőlük úgy, hogy megmondja a grepnek, hogy ebben az esetben ne használja a speciális jelentésüket.
Ezeket a karaktereket meg lehet szökni egy fordított perjel (\) használatával egy olyan karakter előtt, amelynek általában különleges jelentése van.
Például, ha olyan karakterláncot szeretne találni, amely nagybetűvel kezdődik és ponttal végződik, használhatja a következő kifejezést. Az utolsó pont előtti fordított perjel az „elkerülésre” utasítja a parancsot, így az utolsó pont egy szó szerinti pontot jelent, és nem jelent „bármilyen karaktert”:
grep "^.*\.$" GPL-3
forrás.
A licenc egy vagy több feltétele alóli kivétellel.
Az engedély az lenne, hogy teljes mértékben tartózkodjanak a Program továbbításától.
MINDEN SZÜKSÉGES KARBANTARTÁS, JAVÍTÁS VAGY JAVÍTÁS.
ILYEN KÁROK.
Adjon meg információkat arról is, hogyan lehet kapcsolatba lépni Önnel elektronikus és papíralapú levélben.
A grep parancs a kiterjesztett reguláris kifejezés nyelvével is használható a "-E" jelző használatával, vagy az "egrep" parancs meghívásával a "grep" helyett.
Ezek a parancsok megnyitják a "kibővített reguláris kifejezések" lehetőségeit. A kiterjesztett reguláris kifejezések tartalmazzák az összes alapvető metakaraktert, valamint további metakaraktereket, amelyek bonyolultabb egyezéseket fejezhetnek ki.
A kiterjesztett reguláris kifejezések egyik legegyszerűbb és leghasznosabb funkciója a kifejezések csoportosításának és egészében történő felhasználásának lehetősége.
A zárójelek a kifejezések csoportosítására szolgálnak. Ha a kiterjesztett reguláris kifejezéseken kívül zárójeleket kell használnia, akkor azokat fordított perjellel lehet "megszökni"
grep "\(csoportosítás\)" fájl.txt
grep -E "(csoportosítás)" fájl.txt
egrep "(csoportosítás)" fájl.txt
A fenti kifejezések egyenértékűek.
Ahogy a szögletes zárójelek különböző lehetséges egyezéseket adnak meg egyetlen karakterhez, az alternation lehetővé teszi, hogy alternatív egyezéseket adjon meg karakterláncokhoz vagy kifejezéskészletekhez.
A "|" függőleges sáv karakter a váltakozás jelölésére szolgál. A váltakozást gyakran használják a csoportosításnál annak jelzésére, hogy kettő vagy több közül az egyik lehetőségek véletlennek kell tekinteni.
Ebben a példában meg kell találnia a „GPL” vagy „General Public License” kifejezést:
grep -E "(GPL|General Public License)" GPL-3
A GNU General Public License egy ingyenes, copyleft licenc
a GNU Általános Nyilvános Licenc célja, hogy garantálja az Ön szabadságát
GNU általános nyilvános licenc a legtöbb szoftverünkhöz; arra is vonatkozik
ár. Általános nyilvános licenceink célja, hogy Ön biztosan
A GNU GPL-t használó fejlesztők két lépéssel védik jogait:
A fejlesztők és a szerzők védelmére a GPL egyértelműen elmagyarázza
szerzők" kedvéért a GPL előírja, hogy a módosított verziókat a következőként kell megjelölni
a GPL ezen verzióját úgy tervezték meg, hogy megtiltsák az ilyen gyakorlatot
...
...
A váltakozás két vagy több lehetőség közül választhat; ehhez meg kell adnia a többi opciót a kiválasztási csoportban, mindegyiket "|" csőjellel elválasztva.
A kiterjesztett reguláris kifejezésekben vannak olyan metakarakterek, amelyek azt jelzik, hogy egy karakter milyen gyakran ismétlődik, hasonlóan ahhoz, mint a "*" metakarakter az előző karakter vagy karaktersorozat 0 vagy többszöri egyezését jelzi.
A 0 vagy több karakteres egyezés jelzéséhez használhatja a "?" karaktert. Ez lényegében nem kötelezővé teszi az előző karaktert vagy karakterkészletet.
Ebben a példában a "másolat" sorozat hozzáadásával az opcionális csoporthoz a "copyright" és a "right" egyezések jelennek meg:
grep -E "(másolat)?jobbra" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
Az Ön jogainak védelme érdekében meg kell akadályoznunk, hogy mások megtagadják Önt
ezeket a jogokat, vagy arra kéri Önt, hogy mondjon le jogairól. Ezért van
ismerik a jogaikat.
A GNU GPL-t használó fejlesztők két lépéssel védik jogait:
(1) érvényesítse a szoftver szerzői jogait, és (2) felajánlja Önnek ezt a licencet
A „szerzői jog” a szerzői joghoz hasonló törvényeket is jelent, amelyek más típusú tartalmakra is vonatkoznak
...
...
A „+” szimbólum 1 vagy több alkalommal egyezik a kifejezésekkel. Majdnem úgy működik, mint a "*" karakter, de a "+" használatakor a kifejezésnek legalább 1 alkalommal meg kell egyeznie.
A következő kifejezés megegyezik a "free" karakterlánccal plusz 1 vagy több nem szóköz karakterrel:
grep -E "szabad[^[:szóköz:]]+" GPL-3
A GNU General Public License egy ingyenes, copyleft licenc
hogy elvegye a szabadságot a művek megosztására és megváltoztatására. Ellentétben,
a GNU Általános Nyilvános Licenc célja, hogy garantálja az Ön szabadságát
Amikor szabad szoftverről beszélünk, akkor a szabadságra gondolunk, nem
szabadon terjesztheti az ingyenes szoftverek másolatait (és díjat számíthat fel
szabadságjogokat, amelyeket megkaptál. Biztosítania kell, hogy ők is megkapják
a felhasználók védelme" szabadsága a szoftver megváltoztatására. A szisztematikus
pontjában foglaltaknak megfelelően, a felhasználók szabadságának védelme érdekében.
szabadalmak nem használhatók fel a program ingyenessé tételére.
A göndör kapcsos zárójelek ("( )") segítségével megadható a mérkőzések ismétlődéseinek száma. Ezek a karakterek a pontos szám, tartomány, valamint a kifejezések egyezési számának felső és alsó határának jelzésére szolgálnak.
Ha meg szeretné találni az összes olyan karakterláncot, amely három magánhangzó kombinációját tartalmazza, használja a következő kifejezést:
grep -E "(3)" GPL-3
megváltozott, hogy problémáikat ne tulajdonítsák tévesen
korábbi verziók szerzői.
bármilyen médiumban megkapja, feltéve, hogy feltűnően és
az előző bekezdés értelmében, valamint a birtoklási jog
fedezett munkát, hogy ezzel egyidejűleg eleget tegyen kötelezettségeinek
Ha meg kell találnia az összes 16-20 karakter hosszú szót, használja a következő kifejezést:
grep -E "[[:alpha:]](16,20)" GPL-3
bizonyos felelősségeket, ha Ön a szoftver másolatait terjeszti, vagy ha
módosítod: mások szabadságának tiszteletben tartása iránti felelősség.
c) Az adott anyag eredetének megtévesztő bemutatásának tilalma, vagy
A grep parancs sok esetben hasznos a fájlokon vagy hierarchián belüli minták kereséséhez. fájlrendszer. Sok időt takarít meg, ezért érdemes megismerkednie a paramétereivel és a szintaxisával.
A reguláris kifejezések még sokoldalúbbak, és számos népszerű programban használhatók. Például sok szövegszerkesztők reguláris kifejezésekkel kereshet és cserélhet szöveget.
Ezenkívül a fejlett programozási nyelvek reguláris kifejezéseket használnak az eljárások végrehajtására bizonyos adatokon. A reguláris kifejezésekkel való munka képessége hasznos lesz a számítógéppel kapcsolatos gyakori problémák megoldásában.
Címkék: ,A reguláris kifejezések nagyon hatékony eszközt jelentenek a mintaillesztésre, a karakterláncok feldolgozására és módosítására, amelyek számos probléma megoldására használhatók. Íme a főbbek:
Ez nem egy teljes lista, a reguláris kifejezések sokkal többet tesznek lehetővé. De az új felhasználók számára ezek túl bonyolultnak tűnhetnek, mivel ezek használatával lettek kialakítva speciális nyelv. De tekintettel a lehetőségekre, a Linux reguláris kifejezéseit mindenkinek ismernie és használnia kell. Rendszergazda.
Ebben a cikkben a bash reguláris kifejezésekkel fogunk foglalkozni kezdőknek, hogy megértsék ennek az eszköznek az összes funkcióját.
A reguláris kifejezésekben kétféle karakter használható:
A normál karakterek betűk, számok és írásjelek, amelyek bármilyen karakterláncot alkotnak. Minden szöveg betűkből áll, és ezeket reguláris kifejezésekben használhatja, hogy megtalálja a kívánt helyet a szövegben.
A metakarakterek valami más, ők adják a hatalmat a reguláris kifejezéseknek. A metakarakterekkel sokkal többet tehetsz, mint egyetlen karaktert keresni. Karakterkombinációkat kereshet, dinamikus számú karaktert használhat, és tartományokat választhat ki. Minden speciális karakter két típusra osztható, ezek helyettesítő karakterek, amelyek a közönséges karaktereket helyettesítik, vagy operátorok, amelyek azt jelzik, hogy egy karakter hányszor ismételhető meg. A reguláris kifejezés szintaxisa így néz ki:
szabályos_szimbólum speciális karakter_operátor
wildcard_replacement speciális karakter_operátor
Fontos megjegyezni, hogy a szó szerinti speciális karakterek előtt perjelet kell használni annak jelzésére, hogy a speciális karakter következik. Ennek a fordítottja is igaz, ha egy perjel nélkül használt speciális karaktert akarunk normál karakterként használni, akkor perjelet kell hozzáadni.
Például az 1+ 2=3 karakterláncot szeretné megtalálni a szövegben. Ha ezt a karakterláncot reguláris kifejezésként használod, akkor nem fogsz találni semmit, mert a rendszer a pluszt speciális karakterként értelmezi, amely azt mondja, hogy az előzőt egyszer vagy többször meg kell ismételni. Tehát meg kell szökni: 1 + 2 = 3. Escape nélkül a reguláris kifejezésünk csak a 11=3 vagy 111=3 karakterláncra egyezne, és így tovább. Nem kell kötőjelet tenni az egyenlők elé, mert ez nem egy speciális karakter.
Most, hogy áttekintettük az alapokat, és tudja, hogyan működik minden, hátra van a linux grep reguláris kifejezéseiről szerzett ismeretek gyakorlati megszilárdítása. Két nagyon hasznos speciális karakter a ^ és a $, amelyek egy sor elejét és végét jelzik. Például szeretnénk elérni, hogy minden olyan felhasználó regisztráljon a rendszerünkbe, akinek a neve s-vel kezdődik. Ezután használhatja a reguláris kifejezést "^s". Használhatja az egrep parancsot:
egrep "^s" /etc/passwd
Ha a sorokat a sor utolsó karakterével szeretnénk kijelölni, használhatjuk a $-t. Például jelöljük ki az összes rendszerfelhasználót, shell nélkül, az ilyen felhasználókról szóló rekordok false-re végződnek:
egrep "false$" /etc/passwd
Az s-vel vagy d-vel kezdődő felhasználónevek megjelenítéséhez használja ezt a kifejezést:
egrep "^" /etc/passwd
Ugyanez az eredmény érhető el a "|" szimbólum használatával. Az első lehetőség jobban megfelel a tartományokhoz, a második pedig gyakrabban használatos a közönséges vagy / vagy:
egrep "^" /etc/passwd
Most jelöljük ki az összes olyan felhasználót, akinek a neve nem három karakter hosszú. A felhasználónév kettősponttal végződik. Elmondhatjuk, hogy a kettőspont előtt bármilyen alfabetikus karaktert tartalmazhat, amelyet háromszor meg kell ismételni:
egrep "^w(3):" /etc/passwd
Ebben a cikkben a Linux reguláris kifejezéseivel foglalkoztunk, de ez csak az alapja volt. Ha egy kicsit mélyebbre ásol, rájössz, hogy sokkal érdekesebb dolgokra tehetsz szert ezzel az eszközzel. A reguláris kifejezések tanulására fordított idő mindenképpen megéri.
A Yandex előadásának végén a reguláris kifejezésekről:
A grep segédprogram nagyon hatékony eszköz a szöveges információk megkeresésére és szűrésére. Ez a cikk számos példát mutat be a használatára, amelyek lehetővé teszik, hogy értékelje a képességeit.
A grep fő használata a szavak vagy kifejezések keresése a fájlokban és a kimeneti adatfolyamokban. Begépelve lehet keresni parancs sor lekérdezés és keresés hatóköre (fájl).
Például a "tű" karakterlánc megkereséséhez a hystack.txt fájlban használja a következő parancsot:
$ grep tű szénakazal.txt
Ennek eredményeként a grep megjeleníti az összes tűt, amelyet a haystack.txt fájl tartalmában talál. Fontos megjegyezni, hogy ebben az esetben a grep karakterkészletet keres, nem szót. Például megjelennek a „needless” szót tartalmazó sorok és a „tű” sorozatot tartalmazó egyéb szavak.
Ha azt szeretné mondani, hogy a grep egy adott szót keres, használja a -w kapcsolót. Ez a gomb csak a megadott szóra korlátozza a keresést. A szó egy lekérdezés, amelyet mindkét oldalon szóköz karakterek, írásjelek vagy sortörések határolnak.
$ grep -w tű szénakazal.txt
Nem kell csak egy fájlra korlátoznia a keresést, a grep fájlok csoportjában is kereshet, és a keresési eredmények listázzák a megfelelő fájlt. Az -n kapcsoló azt a sorszámot is hozzáadja, amelyben egyezést talált, az -r kapcsoló pedig lehetővé teszi a végrehajtást rekurzív keresés. Ez nagyon hasznos, ha programforrásszövegeket tartalmazó fájlok között keres.
$ grep -rnw függvény_neve /home/www/dev/myprogram/
A fájlnév minden mérkőzés előtt megjelenik. Ha el kell rejteni a fájlneveket, használja a -h kapcsolót, ellenkezőleg, ha csak fájlnevekre van szükség, akkor adja meg a -l kapcsolót
A következő példában URL-eket fogunk keresni egy IRC-naplófájlban, és megjelenítjük az utolsó 10 egyezést.
$ grep -wo http://.* channel.log | farok
Az -o opció azt mondja a grepnek, hogy csak a mintaegyezést adja ki, ne a teljes sort. A grep kimenet a tail parancsba kerül, amely alapértelmezés szerint az utolsó 10 sort nyomtatja ki.
Most megszámoljuk, hogy bizonyos felhasználók hány üzenetet küldtek az irc csatornára. Például az összes üzenetet, amit otthonról és a munkahelyemről küldtem. Becenévben különböznek, otthon a user_at_home becenevet használom, a munkahelyen pedig a user_at_work-et.
$ grep -c "^user_at_(home|work)" channel.log
A -c kapcsolóval a grep csak a talált egyezések számát írja ki, magukat az egyezéseket nem. A keresési karakterlánc idézőjelek között van, mert olyan speciális karaktereket tartalmaz, amelyeket a shell vezérlőkarakterként ismerhet fel. Vegye figyelembe, hogy a keresési mintában nem szerepelnek idézőjelek. A "" fordított perjel a szervizkarakterek kihagyására szolgál.
Keressünk a csatornán "kiabálni" szeretők üzenetei között. „Kiabálás” alatt szőke stílusban, egyben írt üzeneteket értünk NAGYBETŰVEL. A véletlenszerű rövidítések kizárásához a keresésből öt vagy több karakterből álló szavakat keresünk:
$ grep -w "+(5,)" channel.log
Részletesebb leírásért lásd a grep man oldalát.
Még néhány példa:
# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
Megjeleníti az /etc/passwd fájl azon sorait, amelyek a karakterlánc gyökerét tartalmazzák.
# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin
Ezenkívül megjelennek a keresési karakterláncot tartalmazó sorszámok.
# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC felhasználó:/:/bin/false nscd:x:28:28:NSCD démon:/:/bin/false named:x:25:25:Név:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP felhasználó: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false
Ellenőrzi, hogy mely felhasználók nem használnak bash-t, kivéve azokat a felhasználói fiókokat, amelyek shellként nologin-t tartalmaznak.
# grep -c false /etc/passwd 7
Megszámolja azoknak a fiókoknak a számát, amelyek shellként /bin/false.
# grep -i játékok ~/.bash* | grep -v előzmények
Ez a parancs felsorolja az aktuális felhasználó kezdőkönyvtárában lévő összes fájl sorát, amelyek ~/.bash karakterekkel kezdődnek, kivéve azokat a fájlokat, amelyek nevében szerepel a karakterlánc előzménye, hogy kizárja a ~/.bash_history fájlban található egyezéseket, amelyekben lehet ugyanaz a karakterlánc nagy- vagy kisbetűvel. Kérjük, vegye figyelembe, hogy a „játékok” szó keresése megtörténik, helyette bármilyen mást helyettesíthet.
grep parancs és reguláris kifejezések
Az előző példától eltérően most csak azokat a sorokat jelenítjük meg, amelyek a "root" karakterlánccal kezdődnek:
# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash
Ha látni akarjuk, hogy mely fiókok nem használták egyáltalán a parancsértelmezőt, keressük a ":" végződésű sorokat:
# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:
Annak ellenőrzéséhez, hogy a ~/.bashrc fájl PATH változója exportálva van-e, először jelölje ki az "export" sorokat, majd keresse meg a "PATH" karakterlánccal kezdődő sorokat; ebben az esetben a MANPATH és egyebek nem jelennek meg lehetséges módjai:
# grep export ~/.bashrc | grep "PATH" export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"
Karakter osztályok
A szögletes zárójelben lévő kifejezés a [" és "]" karakterek közé zárt karakterek listája. A lista bármely karakterével megegyezik; ha a lista első karaktere "^", akkor minden olyan karakterrel egyezik, amely NEM szerepel a listában. Például a "" reguláris kifejezés bármely egyetlen számjegynek megfelel.
A szögletes zárójelben lévő kifejezésen belül megadhat egy tartományt, amely két, kötőjellel elválasztott karakterből áll. Ekkor a kifejezés megfelel bármely olyan karakternek, amely a rendezési szabályok szerint e két karakteren belülre esik, beleértve ezt a két karaktert is; ez figyelembe veszi a területi beállításban megadott leválogatási sorrendet és karakterkészletet. Például, ha az alapértelmezett területi beállítás C, a "" kifejezés egyenértékű a "" kifejezéssel. Sok olyan terület van, ahol a rendezés szótári sorrendben történik, és ezekben a területeken a "" általában nem ekvivalens a ""-vel, ezekben például egyenértékű lehet a "" kifejezéssel. A zárójeles kifejezés hagyományos értelmezéséhez használhatja a C területi beállítást környezeti változó LC_ALL értéke "C".
Végül vannak olyan karakterosztályok, amelyeknek konkrét neve van, és szögletes zárójelben vannak megadva. További információ lásd a man oldalakat vagy a grep dokumentációt ezekhez az előre definiált kifejezésekhez.
# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: senki:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:
A példa megjeleníti az összes olyan sort, amely vagy az "y" karaktert vagy az "f" karaktert tartalmazza.
Általános karakterek (metakarakterek)
Használja a "." hogy megfeleljen egyetlen karakternek. Ha egy olyan szótárból szeretne listát kapni az összes angol szóról, amely öt karakterből áll, amelyek „c”-vel kezdődnek és „h”-val végződnek (jól használható keresztrejtvények megoldásához):
# grep "
Ha a pont karaktert tartalmazó sorokat literálként szeretné megjeleníteni, használja a -F kapcsolót a grep paranccsal. Szimbólumok "< " и «>» egy üres karakterlánc jelenlétét jelenti a megadott betűk előtt, illetve után. Ez azt jelenti, hogy a szavak fájlban lévő szavakat megfelelően kell írni. Ha az összes szót a megadott minták szerint szeretné megtalálni a szövegben anélkül, hogy figyelembe venné üres sorok hagyd ki a karaktereket"< " и «>”, csak a szavak pontosabb kereséséhez használja a -w kapcsolót.
Ha hasonlóképpen kereshet olyan szavakat, amelyek tetszőleges számú karaktert tartalmazhatnak "c" és "h" között, használjon csillagot (*). A következő példa az összes "c"-vel kezdődő és "h"-val végződő szót kiválasztja a rendszerszótárból:
# grep "
Ha szó szerinti csillag karaktert szeretne keresni egy fájlban vagy kimeneti adatfolyamban, használjon idézőjeleket. Az alábbi példában szereplő felhasználó először idézőjelek használata nélkül próbálja megkeresni a "csillagot" az /etc/profile fájlban, aminek eredménye nem lesz. Ha idézőjeleket használunk, az eredményt a rendszer a kimeneti adatfolyamba nyomtatja:
# grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh ; csináld