Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

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:

1. Hagyományos reguláris kifejezések(ezek alap, alap és alapvető reguláris kifejezések(BRE))

  • ezeknek a kifejezéseknek a szintaxisa elavultnak van definiálva, de ennek ellenére még mindig széles körben használják, és sok UNIX segédprogram használja
  • Az alapvető reguláris kifejezések a következő metakaraktereket tartalmazzák (a jelentésükről alább olvashat):
    • \( \) - eredeti ( ) számára (bővített)
    • \(\) - eredeti a () számára (bővített)
    • \n, Ahol n- szám 1-től 9-ig
  • A metakarakterek használatának jellemzői:
    • A csillagnak az egyetlen karakternek megfelelő kifejezés után kell lennie. Példa: *.
    • Kifejezés \( Blokk\)* törvénytelennek kell tekinteni. Egyes esetekben egy karakterlánc nulla vagy több ismétlésével egyezik meg Blokk. Másoknál megegyezik a karakterlánccal Blokk* .
    • Egy karakterosztályon belül a speciális karakterértékek általában figyelmen kívül maradnak. Különleges esetek:
    • Ha egy ^ karaktert szeretne hozzáadni egy halmazhoz, nem szabad először oda tenni.
    • Karakter hozzáadásához a készlethez először vagy utoljára kell ott elhelyezni. Például:
      • DNS név sablon, amely tartalmazhat betűket, számokat, mínusz és határoló pontokat: [-0-9a-zA-Z.] ;
      • tetszőleges karakter a mínusz és a számjegy kivételével: [^-0-9] .
    • Ha egy [ vagy ] karaktert szeretne hozzáadni egy halmazhoz, először oda kell helyezni. Például:
      • egyezik ] , [ , a vagy b .

2. Kibővített reguláris kifejezések(ők kiterjesztett reguláris kifejezések(ERE))

  • Ezeknek a kifejezéseknek a szintaxisa hasonló az alapkifejezések szintaxisához, kivéve:
    • Eltávolította a fordított perjel használatát a ( ) és () metakaraktereknél.
    • A metakarakter előtti fordított perjel érvényteleníti a különleges jelentését.
    • Elméletileg elutasítva szabálytalanÉpítkezés \ n .
    • Hozzáadott metakarakterek + , ? , | .

3. Perl-kompatibilis reguláris kifejezések(ők Perl-kompatibilis reguláris kifejezések(PCRE))

  • gazdagabb, de megjósolható szintaxisuk van, mint akár a POSIX ERE, ezért gyakran használják az alkalmazások.

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:

Felsorolás |

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.

csoportosulás vagy egyesülés()

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.

Számszerűsíteni() ? * +

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.
*
  • Csillag egyetlen karakternek megfelelő kifejezés után egyezés nulla vagy több másolatokat ezt az (előző) kifejezést. Például a „*” megfelel az üres karakterláncnak, „x”, „y”, „zx”, „zyx” stb.
  • \n*, Ahol n egy 1 és 9 közötti számjegy, amely nulla vagy több előfordulásnak felel meg n-adik jelölt részkifejezés. Például az "\(a.\)c\1*" egyezik az "abcab" és az "abcaba" kifejezéssel, de nem az "abcac" kifejezéssel.

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:

  • előzetesen kell pajzs) metakarakter (. * + \ ? ( )), majd egy fordított perjel. Például \. vagy \[

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:

kapzsiság regex

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:

  • fontolja meg a szimbólumokat, Nem megfelel a kívánt mintának (például:<[^>]*> a fenti esetre)
  • megszabadulni a kapzsiságtól egy kvantor definíció hozzáadásával, mint nem kapzsi:
    • *? - "nem mohó" ("lusta") megfelelője *
    • +? - "nem mohó" ("lusta") megfelelője +
    • (n)? - "nem mohó" ("lusta") megfelelője (n,)
    • .*? - "nem mohó" ("lusta") megfelelője.*

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.

Mik azok a reguláris kifejezések

Sokakban, amikor először látnak reguláris kifejezéseket, azonnal felvetődik a gondolat, hogy értelmetlen szereplők zűrzavara áll előttük. De ez természetesen korántsem így van. Vessen egy pillantást például erre a reguláris kifejezésre


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.

Reguláris kifejezés típusok

Reguláris kifejezések megvalósítása különféle környezetekben, például programozási nyelvekben, mint például a Java, a Perl és a Python, Linux eszközök mint a sed, az awk és a grep, vannak bizonyos specialitásai. Ezek a tulajdonságok az úgynevezett reguláris kifejezés feldolgozó motoroktól függenek, amelyek a minták értelmezésével foglalkoznak.
A Linuxnak két reguláris kifejezés motorja van:
  • Egy motor, amely támogatja a POSIX Basic Regular Expression (BRE) szabványt.
  • Egy motor, amely támogatja a POSIX Extended Regular Expression (ERE) szabványt.
A legtöbb Linux segédprogram megfelel legalább a POSIX BRE szabványnak, de néhány segédprogram (beleértve a sed-et is) csak a BRE szabvány egy részét érti. Ennek a korlátozásnak az egyik oka az a vágy, hogy az ilyen segédprogramokat a lehető leggyorsabbá tegyék a szövegszerkesztésben.

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.

POSIX BRE reguláris kifejezések

Talán a legegyszerűbb BRE-minta egy reguláris kifejezés a karaktersorozat pontos egyezésének megtalálására a szövegben. Így néz ki egy karakterlánc keresése sed és awk nyelven:

$ 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


Szöveg keresése minta szerint awk-ban

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

Különleges szimbólumok

Ha különböző karaktereket használ reguláris kifejezésekben, néhány dolgot szem előtt kell tartania. Például vannak olyan speciális karakterek vagy metakarakterek, amelyek speciális megközelítést igényelnek, ha sablonban használják őket. Itt vannak:

.*^${}\+?|()
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

Horgony szimbólumok

Két speciális karakter használható a mintának a szöveges karakterlánc elejéhez vagy végéhez való rögzítéséhez. A cap szimbólum - ^ lehetővé teszi a szövegsorok elején lévő karaktersorozatok leírását. Ha a keresett minta máshol megjelenik a karakterláncban, a reguláris kifejezés nem reagál rá. A szimbólum használata így néz ki:

$ 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


Keressen mintát egy fájl szövegében a sor elején

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


Olyan minta, amely speciális karaktereket használ egy karakterlánc elején és végén

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.

Pont karakter

A pont bármely karakter keresésére szolgál, kivéve az újsor karakterét. Adjuk át a myfile fájlt egy ilyen reguláris kifejezésnek, amelynek tartalma alább látható:

$ awk "/.st/(print $0)" saját fájl


Pont használata reguláris kifejezésekben

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.

Karakter osztályok

Egy pont bármely karakterhez illeszkedik, de mi van, ha rugalmasabban szeretné korlátozni a keresett karakterkészletet? Ilyen helyzetben használhat karakterosztályokat.

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


Karakterosztály leírása reguláris kifejezésben

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.

Karakterosztályok tagadása

A szimbólumosztályok a fent leírt fordított probléma megoldására is használhatók. Ugyanis az osztályban szereplő szimbólumok keresése helyett minden olyan keresést szervezhet, ami nem szerepel az osztályban. A reguláris kifejezés ilyen viselkedésének eléréséhez egy ^ jelet kell tennie az osztálykarakterek listája elé. Ez így néz ki:

$ awk "/[^oi]th/(print $0)" saját fájl


Keressen olyan karaktereket, amelyek nem tartoznak egy osztályba

BAN BEN ez az eset meg fogja találni a „th” karaktersorozatokat, amelyeket nem „o” vagy „i” előz meg.

Karaktertartományok

A karakterosztályokban kötőjelekkel írhatja le a karaktertartományokat:

$ awk "/st/(print $0)" saját fájl


Egy karakterosztály karaktersorozatának leírása

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


Több tartományból álló karakterosztály

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 .

Speciális karakterosztályok

A BRE speciális karakterosztályokkal rendelkezik, amelyek reguláris kifejezések írásakor használhatók:
  • [[:alpha:]] - megfelel bármely nagy- vagy kisbetűvel írt alfabetikus karakternek.
  • [[:alnum:]] - bármilyen alfanumerikus karakterrel megegyezik, nevezetesen a 0-9 , A-Z , a-z tartományban lévő karakterekkel.
  • [[:blank:]] - Szóköznek és tabulátornak felel meg.
  • [[:digit:]] - bármilyen numerikus karakter 0 és 9 között.
  • [[:upper:]] - alfabetikus karakterek nagybetűs- A-Z.
  • [[:lower:]] - kisbetűs alfabetikus karakterek - a-z .
  • [[:print:]] - bármely nyomtatható karakternek megfelel.
  • [[:punct:]] - az írásjeleknek megfelel.
  • [[:space:]] - szóköz karakterek, különösen - szóköz, tabulátor, karakterek NL , FF , VT , CR .
Speciális osztályokat használhat a következő sablonokban:

$ echo "abc" | awk "/[[:alpha:]]/($0 nyomtatása)" $ echo "abc" | awk "/[[:digit:]]/($0 nyomtatása)" $ echo "abc123" | awk "/[[:számjegy:]]/($0 nyomtatása)"


Speciális karakterosztályok reguláris kifejezésekben

Csillag szimbólum

Ha a mintában egy karakter után csillagot helyez el, ez azt jelenti, hogy a reguláris kifejezés akkor fog működni, ha a karakter bárhányszor megjelenik a karakterláncban – beleértve azt a helyzetet is, amikor a karakter hiányzik a karakterláncból.

$ echo "teszt" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/($0 nyomtatása)"


A * karakter használata reguláris kifejezésekben

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


Sablon, amely tetszőleges számú karakterre reagál

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)"


A csillag használata karakterosztályokkal

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.

POSIX ERE reguláris kifejezések

POSIX ERE sablonok, amelyek támogatnak néhányat Linux segédprogramok, további karaktereket is tartalmazhat. Mint már említettük, az awk támogatja ezt a szabványt, de a sed nem.

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.

▍Kérdőjel

A kérdőjel azt jelzi, hogy az előző karakter egyszer vagy egyáltalán nem fordulhat elő a szövegben. Ez a karakter az ismétlődő metakarakterek egyike. Íme néhány példa:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "teszt" | awk "/tes?t/(print $0)" $ echo "teszt" | awk "/tes?t/($0 nyomtatás)"


Kérdőjel a reguláris kifejezésekben

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)"


Kérdőjel és karakterosztályok

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.

▍ Plusz szimbólum

A mintában lévő pluszjel azt jelzi, hogy a reguláris kifejezés megegyezik az egyezéssel, ha az előző karakter egy vagy többször előfordul a szövegben. Ugyanakkor egy ilyen konstrukció nem reagál a szimbólum hiányára:

$ echo "teszt" | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(print $0)"


Pluszjel a reguláris kifejezésekben

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)"


Plusz jel és karakter osztályok

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.

▍ Göndör nadrágtartó

Az ERE mintákban használható göndör zárójelek hasonlóak a fentebb tárgyalt karakterekhez, de lehetővé teszik az őket megelőző karakter szükséges előfordulási számának pontosabb megadását. Két formátumban határozhat meg korlátot:
  • n - a keresett előfordulások pontos számát meghatározó szám
  • n, m - két szám, amelyeket a következőképpen kell értelmezni: "legalább n-szer, de legfeljebb m".
Példák az első lehetőségre:

$ 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)"


Göndör kapcsos zárójelben megadott távolság

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)"


Göndör fogszabályzó és karakterosztályok

A sablon akkor reagál a szövegre, ha az "a" vagy az "e" karakter egyszer-kétszer előfordul benne.

▍ Logikai „vagy” szimbólum

Szimbólum | - egy függőleges sáv, a reguláris kifejezésekben egy logikai "vagy"-t jelent. Egy ilyen karakterrel elválasztott több töredéket tartalmazó reguláris kifejezés feldolgozása során a motor az elemzett szöveget egyezésnek tekinti, ha az megfelel valamelyik töredéknek. Íme egy példa:

$ 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)"


Logikai "vagy" a reguláris kifejezésekben

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)"


Reguláris kifejezés töredékek csoportosítása

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.

Gyakorlati példák

Most, hogy áttekintettük a reguláris kifejezések alapjait, ideje valami hasznosat tenni velük.

▍A fájlok számának számlálása

Írjunk egy bash szkriptet, amely megszámolja a PATH környezeti változóba írt könyvtárakban található fájlokat. Ehhez először létre kell hoznia egy listát a könyvtárak elérési útjairól. Tegyük ezt sed-el, a kettőspontokat szóközökkel helyettesítve:

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


Fájlok száma

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 címek ellenőrzése

Vannak olyan webhelyek, amelyek hatalmas reguláris kifejezés-gyűjteményekkel rendelkeznek, amelyek lehetővé teszik a címek ellenőrzését Email, telefonszámok, stb. Egy dolog azonban készen venni, és egészen más saját kezűleg alkotni valamit. Tehát írjunk egy reguláris kifejezést az e-mail címek érvényesítésére. Kezdjük a kiindulási adatok elemzésével. Például itt van egy cím:

[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)"


E-mail cím ellenőrzése reguláris kifejezésekkel

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.

Eredmények

Ha akkor teljesen érthetetlennek tűnt az e-mail-címek ellenőrzésére szolgáló reguláris kifejezés, amellyel a cikk elején találkoztál, akkor reméljük, hogy most már nem tűnik értelmetlen karakterkészletnek. Ha ez igaz, akkor ez az anyag betöltötte a célját. Valójában a reguláris kifejezések olyan téma, amelyet egész életében tanulmányozhat, de az általunk elemzett kevés is segíthet olyan szkriptek megírásában, amelyek meglehetősen fejlett módon dolgozzák fel a szövegeket.

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.

Használati alapok

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.

Általános opciók

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.

Reguláris kifejezések

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.

Betűgyufa

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.

Horgonymérkőzések

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

Bármely karakterhez passzol

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.

Kifejezések zárójelben

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

Ismételje meg a mintát (0 vagy többször)

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

Hogyan kerüljük el a metakaraktereket

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.

Kibővített reguláris kifejezések

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.

Csoportosítás

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.

váltakozás

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.

kvantorok

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.

Meccsismétlések száma

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

következtetéseket

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:

  • Szövegbevitel ellenőrzése;
  • Szöveg keresése és cseréje egy fájlban;
  • Fájlok kötegelt átnevezése;
  • Interakció olyan szolgáltatásokkal, mint az Apache;
  • Egy karakterlánc ellenőrzése egy mintával.

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ó:

  • szabályos betűk;
  • metakarakterek.

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

  • - a szó szerinti speciális karakterek fordított perjellel kezdődnek, és akkor is használatos, ha speciális karaktert kell használni bármilyen írásjel formájában;
  • ^ - jelzi a sor elejét;
  • $ - jelzi a sor végét;
  • * - azt jelzi, hogy az előző karakter 0 vagy többször megismételhető;
  • + - azt jelzi, hogy az előző karaktert egynél többször meg kell ismételni;
  • ? - az előző karakter nulla vagy egyszer fordulhat elő;
  • (n)- jelzi, hogy hányszor (n) kell megismételnie az előző karaktert;
  • (n,n)- az előző karakter megismételhető N-től n-ig;
  • . - bármilyen karakter, kivéve a soremelést;
  • — bármely zárójelben megadott karakter;
  • x|y— x vagy y szimbólum;
  • [^az]- bármely karakter, kivéve a zárójelben szereplő karaktereket;
  • — bármely karakter a megadott tartományból;
  • [^a-z]- bármely karakter, amely nincs a tartományban;
  • b— szóhatárt szóközzel jelöl;
  • B- azt jelzi, hogy a karakternek egy szóban kell lennie, például az ux megegyezik az uxb-vel vagy a tuxedo-val, de nem fog megegyezni a Linux-szal;
  • d- azt jelenti, hogy a karakter számjegy;
  • D- nem számjegyű karakter;
  • n— soremelés karakter;
  • s- a szóköz karakterek egyike, szóköz, tabulátor és így tovább;
  • S- a szóközön kívül bármilyen karakter;
  • t- tabulátor karakter;
  • v— függőleges tabulátor karakter;
  • w— bármilyen alfabetikus karakter, beleértve az aláhúzást is;
  • W- bármilyen alfabetikus karakter, kivéve az aláhúzást;
  • uXXX- Unicdo szimbólum.

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.

Példák reguláris kifejezésre

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

következtetéseket

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 " " /usr/share/dict/words catch clash ruha edző kanapé köhögés crash crush

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 " " /usr/share/dict/words kalifa készpénzfogás cheesecloth gepárd --kimenet kihagyva--

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

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: