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

A Bash shell reguláris kifejezések célja az egyik fő eszköz, amely lehetővé teszi a felhasználó és az operációs rendszer közötti interakciót. A shell-en keresztül a felhasználó manipulálhatja a benne lévő fájlokat és könyvtárakat fájlrendszer gépeket, feldolgozni a tartalmukat, és végrehajtani más programokat a termináluk billentyűzetét bemenetként és a terminál alfanumerikus képernyőjét kimenetként használva.

A Bash reguláris kifejezéseket Brian Fox fejlesztette ki a GNU projekt számára a Bourne shell alternatív szoftverének helyettesítésére. A parancsnyelvet 1989-ben adták ki, és széles körben terjesztették az alapértelmezett bejelentkezési shellként Linux disztribúciókés MacOS az Apple-n keresztül (korábban OS X). A Windows 10 rendszerhez is elérhető egy verzió, amely a Solaris 11 alapértelmezett felhasználói shellje.

A Bash egy tanulságos processzor, amely hagyományosan szöveges terminálban fut, ahol a fejlesztő parancsokat futtat, amelyek műveleteket okoznak. A Bash reguláris kifejezések beolvasása és végrehajtása egy shell script nevű fájlból történik. A Unix mellett felismeri a fájlneveket (helyettesítő karakteres összehasonlítás), a protokollokat, dokumentumokat, az irányelvek helyettesítését és a vezérlőstruktúrákat a tesztelési feltételekhez. A fő szavakban a nyelv szintaxisa és egyéb kulcsfontosságú jellemzői a csh-ból és a ksh-ből reprodukálódnak. A Bash egy POSIX-kompatibilis shell, de néhány kiterjesztéssel. A héj neve rövidítése

Brian Fox 1988. január 10-én kezdte el a "Basha" kódolását, miután Richard Stallman elégedetlen volt a meglévő szkripteket futtatni képes ingyenes shell fejlesztésének hiányával. A Fox 1989. június 8-án adta ki a Bash-t bétaként, és 1992 közepétől 1994 közepéig maradt a projekt fő fejlesztője, majd kirúgták az FSF-től, és Chet Rami vette át a helyét.

Ebben az időszakban a Bash volt a legnépszerűbb program a Linux-felhasználók körében, és az alapértelmezett interaktív shell lett az operációs rendszer különféle disztribúcióiban, valamint az Apple macOS-ében. A Bash-t a Microsoft Win Cygwin-nel, a DOS-t a DJGPP projekt, az Androidot pedig különféle terminálemulációs alkalmazásokkal tarkította.

2014. szeptember elején jelentős biztonsági hibát fedeztek fel az 1989 augusztusában kiadott, Shellshock névre keresztelt Bash 1.03-as verziójában, amely számos internetes támadáshoz vezetett. A hibát komolynak ítélték, mert a Bash használata sebezhetővé tette, így tetszőleges kód futtatását tette lehetővé. A hibajavítások azonnal elérhetővé váltak, amint felfedezték őket, de nem minden számítógépet frissítettek.

Shell szintaxis jellemzők

A Bash a Bourne shell parancsok szuperkészlete, és a kapcsos zárójelek kiterjesztését, befejezését használja parancs sor, alapvető hibakeresés és hook-kompatibilis kivételkezelés többek között. Változatlanul futtatja a Bourne shell szkriptek túlnyomó részét, kivéve azokat a szkripteket, amelyeket másképpen értelmeznek, vagy megpróbálnak egy rendszerparancsot futtatni. A Bash grep reguláris kifejezései, valamint a GNU-eszközök tömör módon keresik a szoftverhibákat, és beállítanak egy kilépési állapotot, amely lehetővé teszi, hogy a szálak a hagyományos helyekre ugorjanak.

Ha a fejlesztő megnyomja a tabulátor billentyűt egy shellben, a Bash automatikusan alkalmazza a parancssori végződéseket, hogy megfeleljen a beírt program-, fájl- és változóneveknek. A parancssori lezáró rendszer végtelenül rugalmas és kezelhető, és gyakran olyan függvényekből áll, amelyek argumentumokat és fájlneveket tárolnak adott programok és jobok számára. A Bash szintaxis elegendő kiterjesztéssel rendelkezik, ami a Bourne shellből hiányzik.

Bash reguláris kifejezések: egész szám aritmetikai kiértékelési számítások végrehajtása a ((...)) parancs és a $ ((...)) szintaktikai argumentum használatával az I/O átirányítás egyszerűsítésére. Például képes a kimenetet (stdout) és az összeomlást (stderr) szinkronban átirányítani a &> operátor támogatásával. A real könnyebben beírható, mint a Bourne shell megfelelője: "parancs > fájl 2>&1".

A Bash folyamathelyettesítést használ a "Linux" reguláris kifejezés szintaxisának támogatásával, és lecseréli a parancskimenetet (bemenetet) hagyományosan fájlnév használatával. A "function" kulcsszó használatakor a Bash deklarációk nem kompatibilisek a Bourne és Korn szkriptekkel, mert a Korn shell ugyanazt a problémát okozza a "function" használatakor, de ugyanazt a függvénydeklarációs szintaxist fogadja el, mint a fenti shellek, mivel POSIX kompatibilis.

Ezen és más különbségek miatt a szkriptek ritkán futnak a Bourne és a Korn értelmező alatt, hacsak nem kifejezetten ezt a kompatibilitást szem előtt tartva írják, amit figyelembe kell venni a Bash reguláris kifejezésekkel való munka során. Az asszociatív tömbök az AWK-hoz hasonlóan hamis támogatást tesznek lehetővé az indexelt tömbök számára. A Bash 4.x nem volt integrálva új verzió MacOS a licenc korlátozások miatt. Példa egy asszociatív tömbre.

A shellnek két parancsvégrehajtási módja van: kötegelt és párhuzamos. Kötegelt módban a parancsokat ";" karakter választja el. Bash reguláris kifejezések, például:

  • parancs1;
  • parancs2.

Ebben a példában, amikor az 1. parancs befejeződött, a 2. parancs végrehajtásra kerül. Alternatív megoldásként háttérbe helyezheti az 1. parancsot (szimbólum &)-val a végrehajtás végén, a folyamat a háttérben fog futni, azonnal visszaadja a vezérlést a shellnek, és lehetővé teszi a felhasználó számára a végrehajtható parancsok alkalmazását.

Az 1. és 2. parancs egyidejű végrehajtásához a parancsértelmezőben a következőképpen kell végrehajtani őket:

  • parancs1 és parancs2.

Ebben az esetben az 1. parancs végrehajtása a háttérben és a szimbólumban történik, azonnal visszatérve ahhoz a shellhez, amely a 2. parancsot hajtja végre az előtérben. A Bash grep reguláris kifejezések leállíthatók és visszaadhatók a Ctrl + z lenyomásával, miközben a folyamat az előtérben fut. Jobok futtatásával elérhető az összes folyamat listája, mind a háttérben, mind a leállított üzemmódban.

Egy folyamat állapota megváltoztatható különféle csapatok. Az "fg" parancs egy folyamatot hoz az előtérbe, míg a "bg"-set leállítja a háttérben futó folyamatokat. A Bg" és az "fg" egy job ID-t vehet fel első argumentumként annak jelzésére, hogy melyik folyamaton kell eljárni. E nélkül az alapértelmezett folyamatot használják, amit a "jobs" kimenetben pluszjel jelez. A "kill" paranccsal egy folyamat idő előtti leállítására alkalmas jel küldésével. A feladatazonosítót a százalékjel után kell megadni:

  • kill -s SIGKILL% 1 vagy kill -9%.

A Bash "feltételes végrehajtást" biztosít a parancselválasztóknak, amelyek "feltételes" parancsokat hajtanak végre a precedens parancs által beállított kilépési kódon. Külső parancs, az úgynevezett "bashbug", shell hibákat jelent. A parancs meghívásakor az űrlap kitöltésével elindítja a felhasználó alapértelmezett szerkesztőjét. Az űrlapot elküldik a Bash feleknek vagy esetleg más címekre Email, amely globális helyettesíti a Bash reguláris kifejezéseket.

Amikor a Bash elindul, különféle pontfájlokat hajt végre. Még a hasonló parancsfájl-parancsok esetében is, amelyek végrehajtási engedéllyel és az értelmező sorrendjével rendelkeznek, például:

  • #!/bin/bash.

A Bash hozzárendelési kifejezések által használt inicializálási fájlok ezt nem igénylik. Fájl végrehajtási sorrend:

  1. Amikor a shell elindul, beolvassa és végrehajtja az /etc/profile fájlt, ha létezik.
  2. Ez a fájl elindítja az /etc/bash.bashrc fájlt.
  3. A fájl meghatározása után megkeresi a ~/.bash_profile fájlt, beolvassa és végrehajtja az 1. létező és olvasható fájlt.
  4. Ha a shell a -ból következik, akkor meghatározza és végrehajtja a ~/.bash_logout parancsot.
  5. Shellként indítva meghatározza és végrehajtja az /etc/bash.bashrc, majd a ~/.bashrc fájlt.
  6. A jelen képes letiltani a "--norc" opcióval.
  7. A "--rcfile" fájl beállítás arra kényszeríti a Bash-t, hogy olvassa el és hajtsa végre.
  8. Leképezés a Bourne shell-hez és a csh startuphoz, lépjen ki a Bourne shellből és a csh-ból. Lehetővé teszik a fájlok általános használatának leszűkítését a Bourne segítségével, és lehetővé teszik a csh felhasználók számára ismert külön indítási funkciókat.

A Bash -posix kapcsolóval történő meghívása vagy a set -o posix megadása a szkriptben azt eredményezi, hogy a Bash kilépő reguláris kifejezése nagyon szorosan megfelel a POSIX 1003.2 szabványnak. A hordozható shell-szkripteknek legalább figyelembe kell venniük a lecserélni kívánt Bourne-héjat. A Bash rendelkezik bizonyos funkciókkal, amelyek a hagyományos Bourne-héjból hiányoznak. Ezek tartalmazzák:

  1. Néhány speciális hívási lehetőség.
  2. Parancshelyettesítés $() jelöléssel. Ez a funkció a POSIX 1003.2 szabvány része.
  3. Konzol bővítése.
  4. Néhány művelet tömbökkel és asszociatív tömbökkel.
  5. A tesztkonstrukció bővítése kettős zárójelekkel.
  6. Bash reguláris kifejezések aritmetikai-kiértékelő felépítése "if"-ben.
  7. Néhány karakterlánc-manipulációs művelet.
  8. Folyamatcsere.
  9. Reguláris kifejezés egyezési operátor.
  10. „Bash”-specifikus beépített társfolyamatok.

A Bash aritmetikai kifejezések "readline"-t használnak a biztosításhoz gyorsbillentyűketés parancssori szerkesztés az alapértelmezett kulcs-összerendelésekkel (Emacs). A Vi összerendeléseket a "set -o vi" futtatásával lehet engedélyezni.

A zárójelek helyettesítése, más néven interleaving, egy olyan függvény, amely a "C" shellből másolódik. Alternatív kombinációk halmazát állítja elő. A generált eredményeknek nem kell fájlként létezniük. Az egyes kibontott sorok eredményei nincsenek rendezve, és a jobb oldalon lévő sorrendben tárolódnak. A felhasználók nem használhatnak zárójel-kiterjesztéseket a hordozható shell-parancsfájlokban, mert a Bourne-héj nem ugyanazt a kimenetet adja.

Ha a kapcsos zárójelek kiterjesztését helyettesítő karakterekkel kombinálják, először a zárójeleket bontja ki, majd a kapott helyettesítő karaktereket lecseréli. A váltakozáson kívül a zárójel-kiterjesztés is használható két egész szám vagy dupla ponttal elválasztott karakter közötti egymást követő tartományokhoz. A Bash reguláris kifejezések használatának újabb verziói lehetővé teszik, hogy a harmadik egész szám növekményt adjon meg.

Ha a zárójel-bővítést változó bővítéssel kombináljuk, akkor az a zárójel-bővítés után kerül végrehajtásra, amihez bizonyos esetekben szükség lehet az "eval" beépített használatára, így:

  • $ start = 1 ;
  • end = 10 $ echo ( $ start .. $ end ) # nem bontható ki a kiértékelési sorrend miatt (1..10);
  • $ eval echo ( $ start .. $ end ) # megtörténik a változó kiterjesztése, majd a kapott karakterlánc kiértékelésre kerül: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

A "basha" nyelv szintaktikai vonatkozásai

A shell-szkripteket egy ASCII-szövegfájlban kell tárolni, amelyet olyan "szerkesztő" programmal hoztak létre, amely nem vezet be további karaktereket vagy sorozatokat a szöveg formázásához. A shell szkriptek létrehozására alkalmas szerkesztők például a UNIX/Linux rendszeren elérhető vi vagy Emacs programok, vagy Microsoft Windows rendszeren olyan programok, mint a Notepad, TextEdit és UltraEdit.

Jó gyakorlat minden Bash-szkript első sorába beszúrni egy reguláris kifejezést, a „#! /bin/bash", amely a program abszolút elérési útját mutatja annak a gépnek a fájlrendszerében, amelyen a parancsfájlt futtatni kell. Így közvetlenül a parancssorban futtatható anélkül, hogy a "bash" parancs argumentumaként fájlnevet adna meg.

Az operációs rendszer által a szkript utasításainak lefordításához és végrehajtásához használt fordítóprogram jelzése magának a szkriptnek az első sorában található, közvetlenül a „#!” karaktersorozat után. Úgy tartják, hogy futtatható fájl Az értelmező a "/bin" könyvtárban található, de különböző rendszereken más könyvtárakba is telepíthető, például:

  • "/usr/bin", "/usr/local/bin".

Általában a "#" karakter lehetővé teszi megjegyzések beírását a szkript forrásába. A parancssor minden karakterét a "#" karakter után figyelmen kívül hagyja a shell. Valójában gyakran használják megjegyzések beszúrására a szkript forrásába, hogy leírják a működését, vagy megmagyarázzák az adott parancsok hatását. A parancsok interaktív beszúrásához hasonlóan, még egy szkript kódolásakor is minden programutasítás külön sorba írható, vagy több sorra osztható, és az utolsó kivételével minden sor egy "\"-re zárul. További utasítások jelenthetők ugyanabban a sorban a ";" használatával.

A program utasításait "behúzva" lehet elkészíteni forrás olvashatóbb, de érdemes odafigyelni a szóközhasználatra. A Bash interpreter "válogatósabb", mint a többi értelmező vagy fordító, és bizonyos esetekben nem megengedett tetszőleges szóköz beszúrása az utasításokat alkotó tagok közé, más esetekben a szóköz használata elengedhetetlen az utasítás helyes értelmezéséhez.

Nincsenek karakterek a vezérlőstruktúrába beszúrt utasításblokk elválasztására, például azokra, amelyeket meg kell ismételni egy iteratív vezérlőszerkezetben. Másrészt vannak megfelelő nyelvi kulcsszavak, amelyek lehetővé teszik a blokk elejének és végének helyes azonosítását. Ezek a kulcsszavak a programfolyamat vezérléséhez használt utasítástól függően eltérőek. A Bash reguláris kifejezés "match" példáinak szintaxisában bizonyos karakterek speciális jelentést kapnak, vagyis ha jelen vannak egy karakterláncban vagy parancsargumentumként, akkor nagyon precíz funkciót látnak el.

Minimális leegyszerűsítéssel azt mondhatjuk, hogy a shell olyan program, amely interaktívan mindig ugyanazt a műveletet hajtja végre. Bemenetként vár egy parancsra, kiértékeli azt, hogy megbizonyosodjon arról, hogy a parancs szintaktikailag helyes-e, és végrehajtja azt, majd visszatér, és várja a következő parancsot. Ez a folyamat akkor ér véget, amikor a shell egy jelet kap, amely jelzi, hogy a bejelentkezés befejeződött, és nem küldenek neki más parancsokat. Ezen a ponton a shell program kilép, felszabadítva a lefoglalt memóriát és az egyéb rendelkezésre álló gépi erőforrásokat operációs rendszer.

A szkriptet az operációs rendszer automatikusan elindítja, amikor a felhasználó magába a rendszerbe bejelentkezik, vagyis végrehajthatja egy már nyitott shell-en adott parancs segítségével, vagy speciális grafikus segédprogramok segítségével, ha olyan rendszerrel dolgozik GUI felhasználó. Például on Apple számítógép Macintosh alatt Mac vezérlés Az OS X rendszerben parancshéjat használhat az Alkalmazás mappában található Segédprogramban található Terminal segédprogram futtatásával.

Tovább munkaállomás A grafikus asztali kezelővel (például GNOME vagy KDE) rendelkező Linux az Alkalmazások → Kellékek menü Terminál programjának kiválasztásával megnyithat egy parancshéjat. A parancshéj aktiválása után a következő parancsok futtatásával megtekinthetjük az általunk használt shell nevét:

  • $echo;
  • $SHELL /bin/bash.

Ha az alapértelmezett shell nem a Bash, akkor a „which” paranccsal ellenőrizheti, hogy jelen van-e a rendszeren a PATH környezeti változóban felsorolt ​​könyvtárak egyikében, és végrehajthatja a „bash” paranccsal:

  • $ echo $SHELL /bin/tcsh $ amely bash /bin/bash $ bash bash-2.03$.

A shell így interaktívan működik, minden egyes parancshoz és a parancssorban megadott opciókhoz bemenetet vesz, és magát a parancsot hajtja végre. A kimenet ugyanabban a terminál ablakban jelenik meg. Minden parancsértelmezőnek átadott parancs az Invio/Enter billentyűleütéssel végződik. Lehetőség van több parancs kiadására egy sorban, ha azokat egymástól ";" karakterrel választja el. Lehetőség van arra is, hogy a parancsbeszúrást két vagy több sorra bontsa, és minden sor között egy „\” legyen.

A programozási nyelvekben általában idézőjeleket és dupla idézőjeleket használnak a karakterláncok elválasztására, és az egyik vagy a másik karakter használata az adott nyelvben alkalmazott szintaxistól függ. A szkriptnyelvekben az idézetek és a háttérhivatkozások használata más jelentéssel bír, és ez alól a Bash sem kivétel.

Az egyszeres idézőjelek a karakterláncok elválasztására szolgálnak. Az értelmező nem írja be a karakterlánc tartalmát, és egyszerűen idézőjelekkel elválasztott karaktersorozatot használ. Így az egyébként más jelentést felvevő karakterek is lehetnek egy karakterlánc részei. Az egyetlen karakter, amely nem használható idézőjeles karakterláncban, ugyanazok az idézőjelek. Egy ilyen karakterlánc meghatározásához idézőjelekkel kell elválasztani.

A karakterláncok elválasztására dupla idézőjeleket használnak, azonban ha a karakterláncot ez a karakter határolja, az értelmező végrehajtja az úgynevezett "interpolációt", és feloldja a karakterláncban található Bash reguláris kifejezések bármely változójának értékét. A gyakorlatban, ha egy dupla idézőjelbe zárt karakterlánc hivatkozást tartalmaz egy változóra, akkor a karakterláncban a változó nevét az értékével helyettesítjük. Ha olyan karaktereket szeretne nyomtatni, mint például a dupla idézőjel vagy egy dollár, amelyek másképpen értelmezhetők, és más jelentést kapnak, mindegyik elé egy fordított perjelet "\" kell írni. Fordított perjel karakter kinyomtatása egy karakterláncban, amelyet határol dupla idézőjelek, két fordított perjelet kell visszaadnia.

A visszalépő karakter a legjellemzőbb a szkriptnyelvekre jellemző viselkedéssel, és hiányzik a mainstream magas szintű programozási nyelvekből. Az idézőjel lehetővé teszi egy olyan karakterlánc elválasztását, amelyet a Bash parancsként értelmez, és amelyet végre kell hajtani, kimeneti értékként visszatérve ugyanahhoz a szabványos kimeneti csőtermékhez.

Ha a parancsértelmezőt úgy szeretné végrehajtani, hogy az az ASCII szövegfájlban látható parancssort dolgozza fel:

  • $ pwd ;
  • echo $SHELL ;
  • hostaname /home/marco /bin/bash aquilante $ echo \ > $SHELL /bin/bash.

Ha egy " script.sh " nevű fájlt szeretne előkészíteni, amely a saját könyvtárában van tárolva, a fájl tartalma a következő lehet:

  • echo -n "Oggi e" il " 2 dátum +%d/%m/%Y.

Futtassa ezt a nagyon egyszerű szkriptet a fájlnév megadásával a parancssorban, amellyel a shell meghívásra kerül:

  • $ bash script.sh Oggi e" il 2011.10.06.

A shell képes olyan parancssorokat is elfogadni, amelyeket egy csövön keresztül kell végrehajtani, amely átirányítja egy másik parancs kimenetét szabványos bemenet Bash:

  • $catscript.sh | bash Oggi e" 2011.10.06.

Kijelölheti egy Bash program "#!"-val jelölt reguláris kifejezést. A szkript végrehajtásához használt értelmező abszolút elérési útja közvetlenül, operációs rendszer nélkül fut le a Bash elindításával és a szkript bemenetként történő átadásával:

  • $ cat script.sh #!/bin/bash echo -n "Oggi e" il " date +%d/%m/%Y $ chmod 755 script.sh $ ls -l script.sh -rwxr-xr-x 1 marco felhasználók 49 ápr. 18. 23:58 script.sh Oggi/06/script.sh $ .2/0/0

Az előző példa utolsó parancsának, amely közvetlenül meghívja az aktuális könyvtárban található "script.sh" fájlban tárolt szkript végrehajtását, a fájlnév előtt egy "./" relatív elérési út található. Meg kell adnia annak a könyvtárnak az elérési útját, ahol a végrehajtható parancsfájl található, mert gyakran biztonsági okokból az aktuális könyvtár nem szerepel azon könyvtárak listájában, amelyekben a shellnek külső végrehajtható parancsokat kell keresnie. Az ilyen könyvtárak listája a Bash reguláris kifejezés változóiban tárolódik.

A Bash operációs rendszer előnyei

Ez a leghatékonyabb shell szkriptnyelv. A felhasználó számára egyszerű módot ad a munka automatizálására, ha már ismeri a shell interaktív használatát. Ha egy fejlesztő rendszereket programoz, akkor tudnia kell, hogyan működik a shell.

Ha összehasonlítja a szkripteket a konfigurációval vagy a „yaml” vagy „json” automatizálási rendszerekkel, ezek sokkal sokoldalúbbak. A Bash szkriptelés egyszerűbb, mert a szkript alapértelmezés szerint fut.

A Bash egy egyszerűbb nyelv, és ez arra kényszeríti a fejlesztőket, hogy a rendszer egyéb bonyolultságaira összpontosítsanak. A Bash remekül működik shell-íráshoz. Minden más alapvetően vagy shellt használ a parancsokhoz, vagy saját shellt valósít meg, abból másolva a jó részeket. Ezen kívül vannak jó Bash reguláris kifejezés-konstruktorok, amelyek nagyban megkönnyítik a burkolást.

A Bash segítségével a fejlesztők interaktív webes élményben részesülhetnek a parancssori élmény használatával. linux karakterláncok idő és hely határai nélkül. A funkció használatához nincs szükség szigorú szabályokra vagy erőfeszítésekre, és a felhasználók egyetlen kattintással hozzáférhetnek egy hitelesített munkaállomáshoz, kezelhetik az erőforrásokat és az Azure-környezetet, még akkor is, ha mobil alkalmazások Azure, Azure Portal és Azure Documentation.

A hagyományos parancssori környezettől eltérően nincs szükség az eszközök telepítésére és kiválasztására a kezdés előtt, és időt és erőfeszítést takaríthat meg a Bash segítségével. Az összes CLI-eszköz, például a szöveg, az összeállítás, a tárolók és a forrás elérhető a Bashban, és biztonságos és egyszerű eszköz-hitelesítést használhat a CLI 2.0-val.

Megnéztünk példákat a Bash reguláris kifejezésekre. Sok sikert a tanuláshoz!

Eredeti: Linux Fundamentals
Szerző: Paul Cobbaut
Megjelenés dátuma: 2014. október 16
Fordítás: A.Panin
Az átutalás időpontja: 2014. december 17

19. fejezet

A reguláris kifejezés motor egy nagyon hatékony eszköz a Linux rendszerben. A reguláris kifejezések számos programmal használhatók, mint például a bash, vi, átnevezés, grep, sed és mások.

Ez a fejezet bemutatja a reguláris kifejezések alapjait.

Reguláris kifejezés szintaxis verziói

Itt három van különféle változatok reguláris kifejezés szintaxisok: BRE: Alapvető reguláris kifejezések ERE: Extended Regular Expressions PCRE: Perl reguláris kifejezések

A használt eszköztől függően az említett szintaxisok közül egy vagy több használható.

Például a grep eszköz támogatja az -E beállítást a kiterjesztett reguláris kifejezés (ERE) szintaxisának kikényszerítésére egy reguláris kifejezés elemzésekor, míg a -G opció az alapvető reguláris kifejezés szintaxisát (BRE), a -P opció pedig a Perl programozási nyelv reguláris kifejezésének (PCRE) szintaxisának kényszerítésére.

Vegye figyelembe azt is, hogy a grep eszköz támogatja a -F opciót is a reguláris kifejezés feldolgozás nélküli olvasásához.

A sed eszköz olyan beállításokat is támogat, amelyek lehetővé teszik a reguláris kifejezés szintaxisának kiválasztását.

Mindig olvassa el az Ön által használt szerszámok kézikönyvét!

grep segédprogram

A mintának megfelelő kimeneti karakterláncok

A grep segédprogram népszerű eszköz Linux rendszerek A egy adott mintának megfelelő karakterláncok kereséséhez. Az alábbiakban példákat mutatunk be a legegyszerűbb reguláris kifejezésekre, amelyeket a vele való munka során használhatunk.

Ez a példákban használt tesztfájl tartalma. Ez a fájl három sort (vagy három új sort) tartalmaz. [e-mail védett]:~$ macskanevek Tania Laura Valentina

Egyetlen karakter keresésekor csak azok a sorok jelennek meg, amelyek a megadott karaktert tartalmazzák. [e-mail védett]:~$ grep u Laurának nevezi [e-mail védett]:~$ grep e Valentina nevet [e-mail védett]:~$ grep i Tania Valentinának nevezi

Az ebben a példában használt sablonnal való összehasonlítás nyilvánvaló módon történik; ha az adott karakter előfordul egy karakterláncban, a grep kiírja azt a karakterláncot.

Karakterek kombinálása

Karakterkombinációk karakterláncokban történő kereséséhez a reguláris kifejezés karaktereit ugyanúgy össze kell kapcsolni.

Ez a példa bemutatja a grep működését, ahol az ia reguláris kifejezés megegyezik a Tan ia karakterlánccal, de nem a Valent i na karakterlánccal, és az in reguláris kifejezés megegyezik a Valent karakterlánccal az a-ban, de nem a Ta ni a karakterlánccal. [e-mail védett]:~$ grep a nevek Tania Laura Valentina [e-mail védett]:~$ grep ia Taniát nevezi [e-mail védett]:~$ grep Valentina néven [e-mail védett]:~$

Egyik vagy másik karakter

Mind a PCRE, mind az ERE szintaxis használhatja a programcsatorna létrehozási szimbólumot, amely ebben az esetben a logikai "VAGY" műveletet képviselné. Ebben a példában a grep segédprogramot fogjuk használni az i vagy a karaktert tartalmazó sorok keresésére. [e-mail védett]:~$ macskalista Tania Laura [e-mail védett]:~$ grep -E "i|a" lista Tania Laura

Ne feledje, hogy az -E kapcsolót használjuk a grephez, hogy a reguláris kifejezésünket kiterjesztett reguláris kifejezés (ERE) szintaxisként értelmezzük.

Meg kell hagynunk a csatornalétrehozó karaktert egy reguláris kifejezésben az alapvető reguláris kifejezés szintaxis (BRE) használatával, hogy hasonlóan értelmezzük ezt a karaktert logikai működés"VAGY". [e-mail védett]:~$ grep -G "i|a" lista [e-mail védett]:~$ grep -G "i\|a" lista Tania Laura

Egy vagy több mérkőzés

A * karakter az előző karakter nullával, egy vagy több előfordulásával egyezik meg, a + karakter pedig a következő karakterrel. [e-mail védett]:~$ macska lista2 ll lol lool loool [e-mail védett]:~$ grep -E "o*" list2 ll lol lool loool p [e-mail védett]:~$ grep -E "o+" list2 lol lool [e-mail védett]:~$

Match a sor végén

A következő példákban azt fogjuk használni adott fájl: [e-mail védett]:~$ macskanevek Tania Laura Valentina Fleur Floor

Az alábbi két példa azt a technikát mutatja be, hogyan lehet a dollárjelet egy karakterlánc végén találni. [e-mail védett]:~$ grep a$ neve Tania Laura Valentina [e-mail védett]:~$ grep r$ megnevezi Fleur Floort

Egyezés a sor elején

A caret karakter (^) lehetővé teszi, hogy egy karakterlánc elején (vagy az első karakterektől) keressen egyezést.

Ezek a példák a fent tárgyalt fájlt használják. [e-mail védett]:~$ grep ^Val Valentina neve [e-mail védett]:~$ grep ^F Fleur Floor-nak nevezi

A reguláris kifejezésekben használt dollár- és caret-szimbólumokat horgonyoknak nevezzük.

Szóelválasztás

A keresőszavak szóköz karakterekkel történő megszökése nem jó ötlet (mivel más karakterek is használhatók szóelválasztóként). Az alábbi példa egy technikát mutat be a \b karaktersorozat használatával a karakterláncok kereséséhez adott szót, nem karaktersorozat: [e-mail védett]:~$ grep "\bover\b" szöveg Vége a télnek. Át tudsz jutni? [e-mail védett]:~$

Vegye figyelembe, hogy a grep támogatja a -w opciót is a szavak kereséséhez. [e-mail védett]:~$ macska szöveg A télnek vége. Át tudsz jutni? [e-mail védett]:~$ grep -w over text A télnek vége. Át tudsz jutni? [e-mail védett]:~$

grep opciók

Néha könnyebb egy egyszerű reguláris kifejezést grep-beállításokkal kombinálni, mint bonyolultabb reguláris kifejezést létrehozni. Ezeket az opciókat korábban már tárgyaltuk: grep -i grep -v grep -w grep -A5 grep -B5 grep -C5

Megakadályozza a reguláris kifejezés kiterjesztését a shell által

A dollárjel a reguláris kifejezés és a shell speciális karaktere (gondoljunk csak a shell-változókra és a shell-beágyazásokra). Emiatt ajánlatos a reguláris kifejezéseket minden körülmények között kihagyni, mivel a reguláris kifejezések kihagyása megakadályozza, hogy a shell kibontsa a kifejezést. [e-mail védett]:~$ grep "r$" Fleur Floor átnevezés

segédprogram átnevezése

Az átnevezési segédprogram megvalósításai

A Debain Linux disztribúcióban az /usr/bin/rename elérési út a perl csomagból telepített /usr/bin/prename szkriptre mutató hivatkozást tartalmaz. [e-mail védett]~ $ dpkg -S $(readlink -f $(ami átnevez)) perl: /usr/bin/prename

A Red Hat disztribúción alapuló disztribúciók nem hoznak létre hasonló szimbolikus hivatkozást, amely a leírt szkriptre mutat (kivéve persze, ha valaki szimbolikus hivatkozást hoz létre egy manuálisan telepített szkriptre), ezért ez a rész nem írja le a Red Hat disztribúció átnevezési segédprogramjának megvalósítását.

Az interneten az átnevezési segédprogrammal kapcsolatos viták általában zavarosak, mert a Debian disztribúciókon (és Ubuntu, xubuntu, Mint stb.) jól működő megoldások nem használhatók Red Hat disztribúciókon (és CentOS, Fedora stb.).

perl csomag

Az átnevezés parancs valójában egy szkriptként valósul meg, a perl programozási nyelv reguláris kifejezéseit használva. VAL VEL teljes útmutató A szkript használatát a perldoc perlrequick parancs kiadásával tanulhatja meg (a perldoc csomag telepítése után). [e-mail védett]:~# aptitude install perl-doc A következő ÚJ csomagok lesznek telepítve: perl-doc 0 csomag frissítve, 1 új telepítve, 0 csomag megjelölve eltávolításra, és 0 csomag nincs frissítve. 8170 kB-os archívumot kell beszereznie. Kicsomagolás után 13,2 MB lesz felhasználva. Szerezd meg: 1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main perl-do... 8170 kB 19s alatt (412 kB/s) Egy korábban ki nem választott perl-doc csomag kiválasztása. (Adatbázis olvasása... tovább Ebben a pillanatban 67121 fájlok és könyvtárak telepítve.) Perl-doc kicsomagolása (a .../perl-doc_5.14.2-21+rpi2_all.deb) ... hozzáadása a/usr/bin/perrdoc elterelése a /usr/bin/perldoc.stub-ba a perl-doc "feldolgozó rangsorok feldolgozása a Man-db ... felállítva a Perl-Doc csomagot (5.14.2-22. [e-mail védett]:~# perldoc perlrequick

Jól ismert szintaxis

Az átnevezési segédprogram legáltalánosabb használata az, hogy olyan fájlokat keressen, amelyek neve megfelel egy adott mintának egy karakterlánc formájában, és cserélje ki ezt a karakterláncot egy másik karakterláncra.

Ezt a műveletet általában az s/karakterlánc/egyéb karakterlánc/ reguláris kifejezéssel írják le, amint az a példában látható: [e-mail védett]~ $ ls abc allfiles.TXT bllfiles.TXT Scratch tennis2.TXT abc.conf backup cllfiles.TXT temp.TXT tennis.TXT [e-mail védett]~ $ nevezze át "s/txt/text/"* [e-mail védett]~ $ ls abc allfiles.text bllfiles.text Scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis.text

És itt van egy másik példa, amely a jól ismert átnevezési szintaxist használja ugyanazon fájlok kiterjesztésének ismételt megváltoztatására: [e-mail védett]~ $ ls abc allfiles.text bllfiles.text Scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis.text [e-mail védett]~ $ nevezze át az "s/text/txt/"*.szöveget [e-mail védett]~ $ ls abc allfiles.txt bllfiles.txt Scratch tennis2.txt abc.conf backup cllfiles.txt temp.txt tennis.txt [e-mail védett] ~ $

Ez a két példa működik, mert az általunk használt karakterláncok kizárólag a fájlkiterjesztésekben találhatók. Ne feledje, hogy a fájlkiterjesztések nem számítanak a bash shell használatakor.

A következő példa egy olyan problémát mutat be, amely ennek a szintaxisnak a használatakor előfordulhat. [e-mail védett]~ $ érintse meg az atxt.txt fájlt [e-mail védett]~ $ nevezze át az "s/txt/problem/"atxt.txt fájlt [e-mail védett]~ $ ls abc allfiles.txt biztonsági mentés cllfiles.txt temp.txt tennis.txt abc.conf aproblem.txt bllfiles.txt Scratch tennis2.txt [e-mail védett] ~ $

A kérdéses parancs végrehajtásakor csak a keresett karakterlánc első előfordulása kerül lecserélésre.

Globális csere

Az előző példában használt szintaxis a következőképpen írható le: s/regex/string to helyettesít/ . Ez a leírás egyszerű és magától értetődő, mivel csak egy reguláris kifejezést kell elhelyeznie az első két perjel közé, és egy helyettesítő karakterláncot az utolsó két perjel közé.

A következő példa egy kicsit kibővíti ezt a szintaxist egy módosító hozzáadásával. [e-mail védett]~ $ átnevezés -n "s/TXT/txt/g" aTXT.TXT aTXT.TXT átnevezése atxt.txt [e-mail védett] ~ $

Most az általunk használt szintaxis leírható a következővel: s/regex/string to helyettesít/g , ahol az s módosító a kapcsolási műveletet jelzi, a g módosító pedig a globális csere szükségességét (global).

Vegye figyelembe, hogy ebben a példában az -n kapcsolót használták az éppen végrehajtott művelettel kapcsolatos információk megjelenítésére (ahelyett, hogy magát a műveletet hajtaná végre, vagyis a fájl közvetlen átnevezését).

A kis- és nagybetűk megkülönböztetése nélkül

Egy másik módosító, amely hasznos lehet, az i módosító. Az alábbi példa egy technikát mutat be egy karakterlánc másik karakterláncra való cseréjére a kis- és nagybetűk megkülönböztetése nélkül. [e-mail védett]:~/files$ ls fájl1.szövegfájl2.SZÖVEG fájl3.txt [e-mail védett]:~/files$ átnevezése "s/.text/.txt/i" * [e-mail védett]:~/files$ ls fájl1.txt fájl2.txt fájl3.txt [e-mail védett]:~/files$

Bővítmények megváltoztatása

A Linux parancssori felületének fogalma sincs az MS-DOS operációs rendszerben használthoz hasonló fájlkiterjesztésekről, de sok felhasználó és grafikus felhasználói felület használja ezeket.

Ez a rész egy példát mutat be az átnevezési segédprogrammal csak a fájlkiterjesztések módosítására. A példa egy dollárjellel jelzi, hogy a csere kezdőpontja a fájlnév vége. [e-mail védett]~ $ ls *.txt allfiles.txt bllfiles.txt cllfiles.txt igazán.txt.txt temp.txt tennis.txt [e-mail védett]~ $ nevezze át az "s/.txt$/.TXT/" *.txt fájlt [e-mail védett]~ $ ls *.TXT allfiles.TXT bllfiles.TXT cllfiles.TXT really.txt.TXT temp.TXT tennis.TXT [e-mail védett] ~ $

Vegye figyelembe, hogy a reguláris kifejezésben lévő dollár karakter jelzi a sor végét. A dollárjel nélkül ez a parancs meghiúsulhat az igazán.txt.txt fájlnév feldolgozása során.

sed segédprogram

Adatfolyam-szerkesztő

A folyamszerkesztő vagy röviden sed reguláris kifejezéseket használ az adatfolyam módosítására.

Ebben a példában a sed segédprogramot használjuk egy karakterlánc helyettesítésére. visszhang hétfő | sed "s/hétfő/kedd/" kedd

A perjelek helyettesíthetők más karakterekkel, amelyek kényelmesebbek lehetnek, és bizonyos esetekben növelik a parancs olvashatóságát. visszhang hétfő | sed "s:Mon:Tue:" Tuesday echo Monday | sed "s_Monday_Tue_" Tuesday echo Monday | sed "s|hétfő|kedd|" kedd

Interaktív szerkesztő

Bár a sed-et adatfolyamok feldolgozására tervezték, fájlok interaktív feldolgozására is használható. [e-mail védett]:~/files$ echo Monday > ma [e-mail védett]:~/files$ macska ma hétfőn [e-mail védett]:~/files$ sed -i "s/Monday/Tue/" ma [e-mail védett]:~/files$ macska ma kedden

Az „és” karakter a keresett (és megtalált) karakterláncra utalhat.

Ebben a példában egy „és” jellel duplázzuk meg a talált karakterláncok számát. visszhang hétfő | sed "s/Monday/&&/" MondayMonday echo Monday | sed "s/nickname/&&/" hétfő

A zárójelek a reguláris kifejezés azon részei csoportosítására szolgálnak, amelyekre később hivatkozni lehet.

Tekintsük a következő példát: [e-mail védett]:~$ visszhang vasárnap | sed "s_\(Sun\)_\1ny_" Sunnyday pau [e-mail védett]:~$ visszhang vasárnap | sed "s_\(Sun\)_\1ny \1_" Napsütéses vasárnap

Bármely karaktert ábrázoló időszak

A reguláris kifejezésben egy egyszerű pont karakter bármilyen karaktert képviselhet. [e-mail védett]:~$ visszhang 2014-04-01 | sed "s/....-..-../YYYY-MM-DD/" ÉÉÉÉ-HH-NN [e-mail védett]:~$ echo abcd-ef-gh | sed "s/....-..-../YYYY-MM-DD/" ÉÉÉÉ-HH-NN

Egynél több zárójelpár esetén mindegyikre egymás után következő számértékekkel lehet hivatkozni. [e-mail védett]:~$ visszhang 2014-04-01 | sed "s/\(....\)-\(..\)-\(..\)/\1+\2+\3/" 2014+04+01 [e-mail védett]:~$ visszhang 2014-04-01 | sed "s/\(....\)-\(..\)-\(..\)/\3:\2:\1/" 01:04:2014

Ezt a funkciót csoportosításnak nevezzük.

Hely

A \s karaktersorozat használható egy karakterre, például szóközre vagy tabulátorra.

Ez a példa globálisan szóköz karakterek sorozatait keresi (\s), amelyeket 1 szóköz karakter helyettesít. [e-mail védett]:~$ echo -e "ma\twarm\tday" ma meleg nap van [e-mail védett]:~$ echo -e "ma\twarm\tday" | sed "s_\s_ _g" ma meleg nap van

Választható előfordulások

A kérdőjel karakter azt jelzi, hogy az előző karakter nem kötelező.

Az alábbi példa három o karakterből álló sorozatot keres, ahol a harmadik o karakter nem kötelező. [e-mail védett]:~$ macska lista2 ll lol lool loool [e-mail védett]:~$ grep -E "ooo?" lista2 lol lool [e-mail védett]:~$ macskalista2 | sed "s/ooo\?/A/" ll lol lAl lAl

Pontosan n ismétlés

Megadhatja az előző karakter ismétlődéseinek pontos számát.

Ez a példa pontosan három o-val rendelkező karakterláncokat keres. [e-mail védett]:~$ macska lista2 ll lol lool loool [e-mail védett]:~$ grep -E "o(3)" list2 lool [e-mail védett]:~$ macskalista2 | sed "s/o\(3\)/A/" ll lol lool lAl [e-mail védett]:~$

n-től m-ig ismétlés

És ebben a példában egyértelműen jelezzük, hogy a karaktert minimum (2) és maximum (3) számú alkalommal meg kell ismételni. [e-mail védett]:~$ macska lista2 ll lol lool loool [e-mail védett]:~$ grep -E "o(2,3)" list2 lool loool [e-mail védett]:~$ grep "o\(2,3\)" list2 lool lool [e-mail védett]:~$ macskalista2 | sed "s/o\(2,3\)/A/" ll lol lAl lAl [e-mail védett]:~$

A bash shell története

A bash shell néhány reguláris kifejezést is képes értelmezni.

Ez a példa bemutatja, hogyan lehet manipulálni a felkiáltójelet egy keresési maszkon belül a bash shell előzményeiben. [e-mail védett]:~$ mkdir hist [e-mail védett]:~$ cd hist/ [e-mail védett]:~/hist$ érintés fájl1 fájl2 fájl3 [e-mail védett]:~/hist$ ls -l file1 -rw-r--r-- 1 paul paul 0 április 15. 22:07 file1 [e-mail védett]:~/hist$ !l ls -l file1 -rw-r--r-- 1 paul paul 0 április 15. 22:07 file1 [e-mail védett]:~/hist$ !l:s/1/3 ls -l file3 -rw-r--r-- 1 paul paul 0 április 15. 22:07 file3 [e-mail védett]:~/hist$

Ez a technika akkor is működik, ha számokat használ a bash parancselőzmények olvasásakor. [e-mail védett]:~/hist$ előzmények 6 2089 mkdir hist 2090 cd hist/ 2091 touch file1 file2 file3 2092 ls -l file1 2093 ls -l file3 2094 history 6 [e-mail védett]:~/hist$ !2092 ls -l fájl1 -rw-r--r-- 1 paul paul 0 ápr. 15. 22:07 file1 [e-mail védett]:~/hist$ !2092:s/1/2 ls -l file2 -rw-r--r-- 1 paul paul 0 április 15. 22:07 file2 [e-mail védett]:~/hist$

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 a leghasznosabb eszköznek a megvalósításai szó szerint mindenhol megtalálhatók, és bár az összes 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 egyezik, mert a "teszt" szóval kezdődik nagybetű, nem jelenik meg 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 véget tesz, 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 tartalmazzák az "st" karaktersorozatot, amelyet még egy karakter előz meg, míg a harmadik sor nem tartalmaz megfelelő sorozatot, a negyedik pedig igen, de a sor legelején található.

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

Ebben az esetben "th" karaktersorozatok találhatók, amelyek előtt nincs sem "o", sem "i".

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

Ebben a példában a reguláris kifejezés megegyezik az „st” karaktersorozattal, amelyet az „e” és „p” karakterek között alfabetikus 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 megfelel az összes "st" sorozatnak, amelyet az a-f és m-z tartományból származó karakterek előznek meg.

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

Az egyes Linux segédprogramok által támogatott POSIX ERE sablonok további karaktereket is tartalmazhatnak. 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 beírt könyvtárakban található fájlokat környezeti változó PÁLYA. 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 $directory) 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 az e-mail címek ellenőrzését, 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?

A folyamatos kifejezés olyan minta, amely karakterláncok halmazát írja le. A reguláris kifejezések az aritmetikai kifejezésekhez hasonlóan készülnek, különféle operátorok segítségével a kisebb kifejezések kombinálására.

Folyamatos kifejezések (eng. reguláris kifejezések, röv. RegExp, RegEx, jarg. regexps vagy regexes) - a szövegrészletek formalizált sablon szerinti elemzésére szolgáló rendszer, amely a keresési minták rögzítésére szolgáló rendszeren alapul. A minta (angol minta) beállítja a keresési szabályt, oroszul néha „sablonnak”, „maszknak” is nevezik. A reguláris kifejezések áttörést jelentettek az elektronikus tartalomfeldolgozásban a 20. század végén. Úgy tűnik, hogy a helyettesítő karakterek fejlesztése.

Számos szövegszerkesztő és segédprogram használja a konstans kifejezéseket, hogy a kiválasztott szabályok alapján keressen és módosítson szöveget. Szinte sok programozási nyelv támogatja a reguláris kifejezéseket a karakterláncokkal való munkához. Például Java, . NET Framework, Perl, PHP, JavaScript, Python és mások beépített támogatással rendelkeznek az állandó kifejezésekhez. Egy sor segédprogram (beleértve sed szerkesztőés a grep szűrő), amelyet a UNIX disztribúciókban a reguláris kifejezések koncepciójának egyik eredeti népszerűsítésének tekintenek.

Az egyik leghasznosabb és funkciókban gazdagabb parancs Linux terminál- brigád "grep". A Grep egy mozaikszó, amely a „globális reguláris kifejezés nyomtatását” jelenti (vagyis „keressen mindenhol egy állandó kifejezésnek megfelelő sorokat, és nyomtassa ki őket”).

Ez azt jelenti, hogy a grep segítségével ellenőrizhető, hogy a bemenet egyezik-e az adott mintákkal. A legegyszerűbb formájában a grep arra szolgál, hogy egy szöveges fájlban találja meg a betűmintákat. Ez azt jelenti, hogy ha a grep parancs keres egy keresőszót, akkor a fájl minden sorát kinyomtatja, amely ezt a szót tartalmazza.

A grep célja karakterláncok keresése a reguláris kifejezés által képviselt feltétel szerint. A klasszikus grepnek vannak változatai - egrep, fgrep, rgrep. Mindegyiket meghatározott célokra csiszolják, míg a grep képességei az összes funkciót lefedik. A parancs használatának legegyszerűbb példája egy fájl mintájának megfelelő karakterlánc kiadása. Például meg akarjuk találni a "user" karakterláncot az /etc/mysql/my.cnf fájlban. Ehhez használja a következő parancsot:

grep felhasználó /etc/mysql/my.cnf

A Grep egyszerűen kereshet egy adott szóra:

Grep Hello ./example.cpp

Vagy egy karakterlánc, de ebben a verzióban idézőjelbe kell tenni:

Grep "Hello world" ./example.cpp

Ezenkívül a program alternatívái az egrep és az fgrep, amelyek megegyeznek a grep -E és grep -F parancsokkal. Az egrep és fgrep változatok elavultak, de a visszafelé kompatibilitás érdekében a helyükön vannak. Javasoljuk a grep -E és grep -F használatát az elavult opciók helyett.

A grep parancs a forrásfájlok sorait egy mintával egyezteti, ez az alapvető reguláris kifejezés. Ha nincs fájl megadva, a rendszer szabványos bemenetet használ. Szokás szerint minden sikeresen illeszkedő sor a szabványos kimenetre másolódik; Ha
forrás fájlokat egy kicsit, a talált sor előtt megadjuk a fájl nevét. Az alapvető folyamatos kifejezések (olyan kifejezések, amelyek értéke karakterláncokat tartalmaz, és korlátozott számú alfanumerikus és speciális karaktert használ) sablonként értelmezhető.

Egrep használata Linuxon

Az Egrep vagy grep -E a grep vagy a kiterjesztett grep egy másik változata. A grep ezen verziója kiváló és gyors, ha a regex mintaillesztésről van szó, mivel a metakaraktereket úgy kezeli, ahogy vannak, és nem helyettesíti őket karakterláncként. Az Egrep ERE-t vagy Extended Extended Expressiont használ.

Az egrep egy lecsupaszított grep hívás a -E kapcsolóval.A grep-től a különbség abban rejlik, hogy a POSIX karakterosztályok segítségével kiterjesztett folyamatos kifejezéseket használhat. Gyakran előfordul, hogy olyan szavakat vagy ábrázolásokat kell keresni, amelyek ugyanahhoz a típushoz tartoznak, de lehetséges a helyesírási eltérésekkel, például dátumokkal, bizonyos kiterjesztésű fájlnevekkel és szabványos névvel, email címek. Másrészt vannak feladatok a jól definiált szavak jelenlétére, amelyek eltérő stílusúak lehetnek, vagy olyan keresést, amely kizárja az egyes karaktereket vagy karakterosztályokat.

Ezen igazságcélok érdekében a szöveg sablonok segítségével történő leírása alapján hoztak létre néhány rendszert. Az ilyen rendszerekben állandó kifejezések is szerepelnek. 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 "^s" reguláris kifejezést. Használhatja az egrep brigádot:

Egrep "^s" /etc/passwd

Lehetőség van több fájl között és belül is keresni ilyen eset a fájl neve a sor előtt jelenik meg.

Egrep -i Hello ./example.cpp ./example2.cpp

A következő lekérdezés pedig az összes kódot kinyomtatja, kivéve a csak megjegyzéseket tartalmazó sorokat:

Egrep -v ^/ ./example.cpp

Az egrep-nek megfelelően a parancs akkor is speciális karakterként kezeli őket, és a sajátos értékükre cseréli, ahelyett, hogy a karakterlánc részeként kezelné őket.

Az fgrep használata Linuxon

Az Fgrep vagy a Fix grep vagy a grep -F a grep egy másik változata, amely eléggé szükséges, ha egy reguláris fogalom helyett a teljes sort kell keresni, mivel nem ismeri fel a reguláris kifejezéseket vagy metakaraktereket. Bármely karakterlánc közvetlen kereséséhez válassza ki a grep ezen verzióját.

Az Fgrep a teljes karakterláncot keresi, és nem ismeri fel a speciális karaktereket egy folyamatos kifejezés részeként, függetlenül attól, hogy a karakterek kihagyottak-e vagy sem.

fgrep -C 0 "(f|g)ile" check_file fgrep -C 0 "\(f\|g\)ile" check_file

sed használata Linuxon

sed (az angol Stream EDitorból) - streaming szöveg szerkesztő(valamint egy programozási nyelv), amely különféle előre meghatározott szövegtranszformációkat használ soros szövegfolyammá ezek. A Sed újrahasznosítható, mint a grep, és olyan sorokat ad ki, amelyek megfelelnek az alapvető reguláris kifejezés mintájának:

Sed -n /Hello/p ./example.cpp

Használható sorok eltávolítására (minden üres sor eltávolítása):

Sed /^$/d ./example.cpp

A sed-vel való munka fő eszköze egy olyan kifejezés, mint:

Sed s / keresési_kifejezés / what_replacement / fájlnév

Tehát, minta, ha futtatja a parancsot:

s/int/long/ ./example.cpp

A fentiekben a „grep”, „egrep” és „fgrep” közötti különbségek láthatók. A használt reguláris ábrázolások készletében és a végrehajtás sebességében mutatkozó különbségek ellenére a parancssori opciók ugyanazok maradnak a grep mindhárom verziójában.

Az egyik leghasznosabb és legsokoldalúbb parancs a Linux terminálban a "grep" parancs. A név az angol "keressen globálisan a reguláris kifejezésnek megfelelő sorokat és nyomtasson ki" kifejezés rövidítése (keressen mindenhol a reguláris kifejezésnek megfelelő sorokat, és jelenítse meg őket). A "grep" parancs soronként átvizsgálja a bemeneti adatfolyamot egyezést keresve, és csak azokat a sorokat adja ki (kiszűri), amelyek az adott mintának megfelelő szöveget tartalmaznak. reguláris kifejezés.

A reguláris kifejezések egy speciális formális nyelv a szövegben található részkarakterláncok keresésére és manipulálására, metakarakterek használata alapján. Ma már szinte minden modern programozási nyelv rendelkezik beépített támogatással a szövegfeldolgozáshoz szükséges reguláris kifejezésekhez, azonban történelmileg a UNIX világa, és különösen a „grep”, „sed” stb.-ben megtestesülő ötletek sok tekintetben hozzájárultak ennek a megközelítésnek a népszerűsítéséhez. A „minden egy fájl” filozófia teljesen áthatja a UNIX-ot, és a szöveges fájlok kötelező eszközeinek ismerete a Linuxot.

MINTA

GIST | A legegyszerűbb keresés minden olyan sorra, amely az "Adams" szöveget tartalmazza. A jelen és a további példák tervezésénél a következő sorrendet fogjuk betartani: parancssori opciók felül, szabványos streamek alul, stdin a bal oldalon és stdout a jobb oldalon.

A "grep" parancs lenyűgöző számú beállítást tartalmaz, amelyeket indításkor lehet megadni. Ezekkel az opciókkal sok hasznos dolgot megtehetsz, és elvileg még a reguláris kifejezések szintaxisában sem kell jól ismerned.

LEHETŐSÉGEK

Kezdjük azzal, hogy a "grep" nem csak a szabványos bemeneti stdin szűrésére képes, hanem a fájlok között is kereshet. Alapértelmezés szerint a grep csak az aktuális könyvtárban keres a fájlokban, de a nagyon hasznos --recursive opcióval megadhatja, hogy a grep parancs rekurzívan keressen egy adott könyvtártól kezdve.

GIST | Alapértelmezés szerint a „grep” parancs megkülönbözteti a kis- és nagybetűket. A következő példa bemutatja, hogyan kereshet, de továbbra is nem különbözteti meg a kis- és nagybetűket, például az „Adams” és az „adams” ugyanaz:

"Adams" kis- és nagybetű figyelmen kívül hagyása

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801

GIST | A keresés fordított (néha azt mondják, hogy fordított keresés), azaz minden sor megjelenik, kivéve azokat, amelyekben előfordul a megadott minta:

Fordított egyezés "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 Thomas Jefferson, 1801-1809

GIST | A lehetőségeket természetesen lehet és kell is kombinálni egymással. Például egy fordított keresés a sorok sorszámának kimenetével, ahol előfordul:

Line-number -- invert-match "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 1: George Washington, 1789-1797 3: Thomas Jefferson, 1801-1809

GIST | Színezés. Néha kényelmes, ha a keresett szó színnel van kiemelve. Mindez már a "grep"-ben van, csak a következőket kell tartalmaznia:

Sorszám --color=mindig "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 2: John Adams, 1797-1801

GIST | Minden hibát ki akarunk jelölni a naplófájlból, de tudjuk, hogy a hiba után következő sor tartalmazhat hasznos információkat, akkor célszerű több sort is levezetni a szövegkörnyezetből. Alapértelmezés szerint a grep csak azt a sort nyomtatja ki, amelyiknek megfelel, de több lehetőség is van a grep nyomtatására. Több sor (esetünkben kettő) megjelenítése egy bejegyzés után:

Szín = mindig -A2 "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Adams, 1797-1801 Thomas Jefferson, 1797-1801 Thomas Jefferson, 1801-1807, 1801-18-9, James

GIST | Hasonlóképpen, több sor további kimenetéhez a bejegyzés előtt:

Szín = mindig -B2 "James"

George Washington 1789-1797 John Adams 1797-1801 Thomas Jefferson 1801-1809 James Madison 1809-1817 James Monroe 1817-1825 John Adams 1797-1801 Thomas Jefferson 1801-1809 James Madison 1809-1817 James Monroe 1817 -1825

GIST | Leggyakrabban azonban szimmetrikus kontextus megjelenítésére van szükség, ehhez van egy még rövidebb jelölés. Írjunk ki két sort a bejegyzés fölé és alá:

Szín = mindig -C2 "James"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew, 1825-1829 Andrew, 1317, John Burs 317, 1817, 1817. , 179 7-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew Jackson, 1829-1837

GIST | Amikor a qwe kifejezésre keres, alapértelmezés szerint a "grep" a qwe123 , 345qwerty és hasonló kombinációkat is kiírja. Csak azokat a sorokat keressük, amelyek pontosan az egész szót kikapcsolják:

Word-regexp --color=mindig "János"

John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 John Fitzgerald Kennedy, 1961-1963

GIST | És végül, ha csak egy számmal egyező sorok számát szeretné tudni, de semmi mást ne jelenítsen meg:

Számolás --color=mindig "János"

John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 Richard Milhous Nixon, 1969-1974 2

Érdemes megjegyezni, hogy a legtöbb opciónak van megfelelője, például -- az Ignore-case többre is átírható rövid forma-én stb.

ALAPVETŐ REGISZTRÁCIÓK

Minden reguláris kifejezés kétféle karakterből áll: az úgynevezett szabványos szövegkarakterekből szó szerintiek, és az úgynevezett speciális karakterek metakarakterek. Az előző példákban a keresést literálokkal (pontos betűegyezés) végeztük, de a továbbiakban sokkal érdekesebb lesz. Üdvözöljük a reguláris kifejezések világában!

A ^-jelnek és a $ dollárjelnek speciális jelentése van egy reguláris kifejezésben. Ezeket horgonynak nevezik. A horgonyok olyan speciális karakterek, amelyek a kívánt egyezés karakterláncában jelzik a helyet. Amikor a keresés eléri a horgonyt, ellenőrzi, hogy van-e egyezés, és ha van, akkor továbbra is követi a mintát, semmit sem hozzátéve az eredményhez.

GIST | A caret horgony azt jelzi, hogy a reguláris kifejezést pontosan a sor elejétől kell ellenőrizni:

Szín = mindig "^J"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801

GIST | Hasonlóképpen, egy dolláros horgonyt kell használni a minta végén annak jelzésére, hogy az egyezés csak akkor érvényes, ha a keresett karakterlánc a szövegsorozat végén van, és semmi más:

Szín = mindig "9 dollár"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 Thomas Jefferson, 1801-1809

GIST | Bármilyen karakter. A reguláris kifejezésekben a pont karaktert használjuk annak jelzésére, hogy a megadott helyen bármilyen karakter lehet:

Szín = mindig "0.$"

GIST | Árnyékolás. Ha pontosan a pont karaktert kell megtalálnia, akkor a menekülés segít. Egy karaktert (például egy pontot) megelőző escape karakter (általában fordított perjel) a metakaraktert literállá változtatja:

Color=mindig "\."

George Washington. 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington. 1789-1797

GIST | Karakter osztályok. A reguláris kifejezések tartományokat és karakterosztályokat használhatnak. Ehhez a sablon összeállításakor szögletes zárójeleket használnak. Ha egy karaktercsoportot (beleértve az egyébként metakarakterként értelmezett karaktereket is) szögletes zárójelbe tesz, jelezheti, hogy a zárójelben szereplő karakterek bármelyike ​​megjelenhet egy adott helyen:

Szín = mindig "0"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | Hatótávolság. Ez két kötőjellel elválasztott karakter, például 0-9 (tizedes számjegyek) vagy 0-9a-fA-F (hexadecimális számjegyek):

Szín = mindig ""

George Washington John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | Tagadás. Ha a szögletes zárójelben lévő kifejezés első karaktere egy pont, akkor a fennmaradó karakterek olyan karakterkészletek, amelyek nem lehetnek jelen a reguláris kifejezés adott helyén:

Color=mindig "[^7]$"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | POSIX karakterosztályok. Van egy sor előre meghatározott karakterosztály, amelyet reguláris kifejezésekben használhat. Körülbelül egy tucat van belőlük, elég gyorsan átnézni a kézikönyvet, hogy megértsük mindegyik célját. Például csak a hexadecimális számjegyeket szűrjük:

Color=mindig "^[[:xdigit:]]*$"

4,2 42 42abc 42 42abc

GIST | Ismételje meg (0 vagy többször). Az egyik leggyakrabban használt metakarakter a csillag karakter, ami azt jelenti, hogy "az előző karakter vagy kifejezés nulla vagy többszöri megismétlése":

Color=mindig "^*$"

George Washington John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, ???

Léteznek alapvető reguláris kifejezések BRE (alapvető reguláris kifejezések) és kiterjesztett ERE (bővített reguláris kifejezések). A BRE a következő metakaraktereket ismeri fel: ^ $. * és az összes többi karakter literálként kezelendő. Vannak még ilyen metakarakterek () ( ) az ERE-hez? + | és a kapcsolódó funkciókat. Nos, hogy a "grep"-ben mindenkit teljesen összezavarjanak, kitaláltak egy ilyet - a BRE-ben a () ( ) karaktereket metakarakterként kezelik, ha visszaperjellel szöktetik meg őket, míg az ERE-ben a fordított perjel beállítása bármilyen metakarakter elé ahhoz vezet, hogy literálként kezelik őket.

BŐVÍTETT SZABÁLYOS KIFEJEZÉSEK

GIST | Diszjunkció. Ahogy a szögletes zárójelek is mást definiálnak lehetséges opciók egykarakteres egyezések, a diszjunkció lehetővé teszi, hogy alternatív egyezéseket adjon meg karakterláncokhoz vagy kifejezésekhez. A csőszimbólum a szétválasztás jelzésére szolgál:

Extended-regexp --color=mindig "George|John"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 John Adams, 1797-1801

GIST | Nulla vagy egy meccs. A kiterjesztett reguláris kifejezésekben számos további metakarakter található, amelyek jelzik, hogy egy karakter vagy kifejezés milyen gyakran ismétlődik (hasonlóan ahhoz, ahogy a csillag metakarakter 0 vagy több egyezést jelez). Az egyik ilyen metakarakter a kérdőjel, amely az előző karaktert vagy kifejezést lényegében nem kötelezővé teszi:

Extended-regexp --color=mindig "^(Andrew)?János"

John Adams, 1797-1801 Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams, 1797-1801 Andrew Johnson, 1865-1869

GIST | Egyesítsen egy vagy több alkalommal. Ehhez egy pluszjel formájú metakarakter biztosított. Szinte úgy működik, mint a csillag karakter, kivéve, hogy a kifejezésnek legalább egyszer meg kell egyeznie:

Extended-regexp --color=always "^[[:alpha:] ]+$"

John Adams Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams

GIST | Egyezzen meg a megadott számú alkalommal. Ehhez használhat göndör fogszabályzót. Ezekkel a metakarakterekkel adják meg a pontos számot, tartományt, valamint felső és alsó határt, hogy hányszor egyezhet egy kifejezés:

Extended-regexp --color=mindig "(1,3)\.(1,3)\.(1,3)\.(1,3)"

42 127.0.0.1 127.0.0.1

A grep parancs annyira hasznos, sokoldalú és könnyen használható, hogy ha egyszer ismeri, elképzelhetetlen a munka nélküle.

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