Vzdelávací program o GREP a regulárnych výrazoch. Používanie regulárnych výrazov (regex) v systéme Linux Tabuľka regulárnych výrazov grep

Nástroj grep je veľmi výkonný nástroj na vyhľadávanie a filtrovanie. textové informácie. Tento článok ukazuje niekoľko príkladov jeho použitia, ktoré vám umožnia oceniť jeho schopnosti.
Hlavné použitie grep je na vyhľadávanie slov alebo fráz v súboroch a výstupných prúdoch. Môžete vyhľadávať zadaním dotazu a oblasti vyhľadávania (súboru) na príkazovom riadku.
Ak chcete napríklad nájsť reťazec „needle“ v súbore hystack.txt, použite nasledujúci príkaz:

$ grep needle haystack.txt

Výsledkom je, že grep zobrazí všetky výskyty ihly, s ktorými sa stretne v obsahu súboru haystack.txt. Je dôležité poznamenať, že v tomto prípade grep hľadá množinu znakov, nie slovo. Zobrazia sa napríklad reťazce obsahujúce slovo „needle“ a ďalšie slová, ktoré obsahujú sekvenciu „needle“.


Ak chcete grepu povedať, že hľadáte konkrétne slovo, použite prepínač -w. Tento kľúč obmedzí vyhľadávanie len na zadané slovo. Slovo je dopyt ohraničený na oboch stranách akýmikoľvek medzerami, interpunkciou alebo zlomami riadkov.

$ grep -w needle haystack.txt

Nie je potrebné obmedzovať vyhľadávanie len na jeden súbor, grep môže vyhľadávať v skupine súborov a vo výsledkoch vyhľadávania bude uvedený súbor, v ktorom sa našla zhoda. Prepínač -n tiež pridá číslo riadku, v ktorom bola nájdená zhoda, a prepínač -r vám umožní vykonať rekurzívne vyhľadávanie. To je veľmi výhodné pri vyhľadávaní medzi súbormi so zdrojovými kódmi programu.

$ grep -rnw názov_funkcie /home/www/dev/myprogram/

Pred každým zápasom bude uvedený názov súboru. Ak potrebujete skryť názvy súborov, použite prepínač -h, naopak, ak potrebujete iba názvy súborov, zadajte prepínač -l
V nasledujúcom príklade vyhľadáme adresy URL v súbore denníka IRC a zobrazíme posledných 10 zhôd.

$ grep -wo http://.* channel.log | chvost

Voľba -o hovorí grep, aby vytlačil iba zhodu so vzorom a nie celý riadok. Pomocou potrubia presmerujeme výstup grep na príkaz tail, ktorý štandardne vypíše posledných 10 riadkov.
Teraz spočítame počet správ odoslaných na irc kanál určitými používateľmi. Napríklad všetky správy, ktoré som poslal z domu a z práce. Líšia sa nickom, doma používam nick user_at_home, a v práci user_at_work.

$ grep -c "^user_at_(domov|práca)" channel.log

S voľbou -c grep vypíše iba počet nájdených zhôd, nie samotné zhody. Hľadaný reťazec je uzavretý v úvodzovkách, pretože obsahuje špeciálne znaky, ktoré môže shell rozpoznať ako riadiace znaky. Upozorňujeme, že vo vzore vyhľadávania nie sú zahrnuté úvodzovky. Opačná lomka "" sa používa na zamedzenie špeciálnych znakov.
Hľadajme správy od ľudí, ktorí radi „kričia“ v kanáli. Pod pojmom „kričať“ máme na mysli správy napísané ako blond, veľkými písmenami. Aby sme z vyhľadávania vylúčili náhodné zhody skratiek, budeme hľadať slová s piatimi alebo viacerými znakmi:

$ grep -w "+(5,)" kanál.log

Podrobnejší popis nájdete na manuálovej stránke grep.
Niekoľko ďalších príkladov:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operátor:x:11:0:operator:/root:/sbin/nologin

Zobrazí riadky zo súboru /etc/passwd, ktoré obsahujú koreň reťazca.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Okrem toho sa zobrazia čísla riadkov, ktoré obsahujú hľadaný riadok.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync vypnutie: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:Používateľ Portmapper RPC:/:/bin/false nscd:x:28:28:NSCD Démon:/:/bin/false Named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP User: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Kontroluje, ktorí používatelia nepoužívajú bash, s výnimkou tých používateľských účtov, ktoré majú ako shell zadaný nologin.

# grep -c false /etc/passwd 7

Spočíta počet účtov, ktoré majú ako shell /bin/false.

# grep -i hry ~/.bash* | história grep -v

Tento príkaz zobrazí riadky zo všetkých súborov v domovskom adresári súčasný užívateľ, ktorého názvy začínajú ~/.bash, s výnimkou tých súborov, ktorých názvy obsahujú históriu reťazcov, aby sa vylúčili zhody nájdené v súbore ~/.bash_history, ktoré môžu mať rovnaký riadok na začiatku alebo na malom písmene. Upozorňujeme, že sa vykonáva vyhľadávanie slova „hry“; namiesto toho môžete nahradiť akékoľvek iné slovo.
príkaz grep a regulárne výrazy

Na rozdiel od predchádzajúceho príkladu teraz zobrazíme iba tie riadky, ktoré začínajú riadkom „root“:

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Ak chceme vidieť, ktoré účty shell vôbec nepoužili, hľadáme riadky končiace znakom „:“:

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

Ak chcete skontrolovať, či je premenná PATH vo vašom súbore ~/.bashrc exportovaná, najskôr vyberte riadky pomocou príkazu „export“ a potom vyhľadajte riadky začínajúce riadkom „PATH“; v tomto prípade sa MANPATH a iné nezobrazia možné spôsoby:

# grep export ~/.bashrc | grep "PATH" export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Triedy postáv

Výraz v hranatých zátvorkách predstavuje zoznam znakov uzavretých medzi znakmi [" a "]"". Zodpovedá akémukoľvek jednotlivému znaku uvedenému v tomto zozname; ak je prvý znak v zozname "^", potom sa zhoduje s ľubovoľným znakom, ktorý NIE JE v zozname. Napríklad regulárny výraz "" sa zhoduje s akoukoľvek jednotlivou číslicou.

V rámci výrazu v hranatých zátvorkách môžete zadať rozsah pozostávajúci z dvoch znakov oddelených spojovníkom. Potom sa výraz zhoduje s akýmkoľvek singletonom, ktorý podľa pravidiel triedenia spadá do týchto dvoch znakov, vrátane týchto dvoch znakov; toto berie do úvahy porovnávanie a znakovú sadu špecifikovanú v miestnom nastavení. Napríklad, keď je predvolené miestne nastavenie C, výraz "" je ekvivalentný výrazu "". Existuje mnoho jazykov, v ktorých sa triedenie vykonáva v slovníkovom poradí, a v týchto jazykoch "" nie je vo všeobecnosti ekvivalentné s "", v ktorých môže byť napríklad ekvivalentné výrazu "". Ak chcete použiť tradičnú interpretáciu výrazu v zátvorkách, môžete použiť miestne nastavenie jazyka C nastavením premennej prostredia LC_ALL na "C".

Nakoniec sú tu špeciálne pomenované triedy znakov, ktoré sú špecifikované vo vnútri výrazov v hranatých zátvorkách. Ďalšie informácie Informácie o týchto preddefinovaných výrazoch nájdete v manuálových stránkach alebo v dokumentácii príkazu grep.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nikto:x:99: disketa:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Príklad zobrazuje všetky riadky, ktoré obsahujú buď znak "y" alebo znak "f".
Univerzálne znaky (metaznaky)

Použite "." aby sa zhodoval s ľubovoľným znakom. Ak chcete zoznam všetkých anglických slov prevzatých zo slovníka obsahujúci päť znakov začínajúcich na „c“ a končiacich na „h“ (užitočné pri riešení krížoviek):

# grep " " /usr/share/dict/words catch clash tkanina tréner gauč kašeľ havária crush

Ak chcete zobraziť riadky, ktoré obsahujú znak bodky ako literál, zadajte voľbu -F v príkaze grep. Symboly "< " и «>“ znamená prítomnosť prázdneho riadku pred a podľa toho aj za špecifikovanými písmenami. To znamená, že slová v súbore slov musia byť napísané zodpovedajúcim spôsobom. Ak chcete nájsť všetky slová v texte podľa zadaných vzorov bez zohľadnenia prázdnych riadkov, vynechajte symboly "< " и «>“, pre presnejšie vyhľadávanie iba slov použite prepínač -w.

Ak chcete podobne nájsť slová, ktoré môžu mať ľubovoľný počet znakov medzi písmenami „c“ a „h“, použite hviezdičku (*). Nasledujúci príklad vyberá všetky slová začínajúce na „c“ a končiace na „h“ zo systémového slovníka:

# grep " " /usr/share/dict/words kalif cash úlovok gepard gepard --výstup vynechaný--

Ak chcete v súbore alebo výstupnom prúde nájsť doslovný znak hviezdičky, použite jednoduché úvodzovky. Používateľ v nižšie uvedenom príklade sa najprv pokúsi vyhľadať "hviezdičku" v súbore /etc/profile bez použitia úvodzoviek, čo má za následok, že sa nič nenájde. Keď sa použijú úvodzovky, výsledkom je výstup:

# grep * /etc/profile # grep "*" /etc/profile pre i v /etc/profile.d/*.sh ; robiť

Aby ste mohli plne spracovať texty v bash skriptoch pomocou sed a awk, stačí porozumieť regulárnym výrazom. Implementácie tohto najužitočnejšieho nástroja možno nájsť doslova všade a hoci sú všetky regulárne výrazy štruktúrované podobným spôsobom a vychádzajú z rovnakých myšlienok, práca s nimi v rôznych prostrediach má určité vlastnosti. Tu si povieme niečo o regulárnych výrazoch, ktoré sú vhodné na použitie v skriptoch príkazový riadok Linux.

Tento materiál je určený ako úvod do regulárnych výrazov, určený pre tých, ktorí si možno vôbec nie sú vedomí toho, čo sú. Začnime teda od úplného začiatku.

Čo sú regulárne výrazy

Mnoho ľudí, keď prvýkrát uvidia regulárne výrazy, si okamžite pomyslí, že sa pozerajú na nezmyselnú spleť znakov. Ale to, samozrejme, zďaleka neplatí. Pozrite sa napríklad na tento regulárny výraz


Podľa nás aj absolútny začiatočník hneď pochopí, ako to funguje a prečo je to potrebné :) Ak tomu celkom nerozumiete, čítajte ďalej a všetko do seba zapadne.
Regulárny výraz je vzor, ​​ktorý programy ako sed alebo awk používajú na filtrovanie textu. Šablóny používajú bežné znaky ASCII, ktoré samy seba reprezentujú, a takzvané metaznaky, ktoré zohrávajú špeciálnu úlohu, napríklad umožňujú odkazovať na určité skupiny znakov.

Typy regulárnych výrazov

Implementácie regulárnych výrazov v rôznych prostrediach, napríklad v programovacích jazykoch ako Java, Perl a Python, a v nástrojoch Linuxu ako sed, awk a grep, majú určité vlastnosti. Tieto funkcie závisia od takzvaných motorov regulárnych výrazov, ktoré interpretujú vzory.
Linux má dva motory s regulárnymi výrazmi:
  • Motor, ktorý podporuje štandard POSIX Basic Regular Expression (BRE).
  • Nástroj, ktorý podporuje štandard POSIX Extended Regular Expression (ERE).
Väčšina linuxových pomôcok zodpovedá aspoň štandardu POSIX BRE, ale niektoré pomocné programy (vrátane sed) rozumejú iba podmnožine štandardu BRE. Jedným z dôvodov tohto obmedzenia je túžba urobiť takéto nástroje čo najrýchlejšie pri spracovaní textu.

Štandard POSIX ERE je často implementovaný v programovacích jazykoch. Umožňuje vám používať veľké množstvo nástroje na vývoj regulárnych výrazov. Môžu to byť napríklad špeciálne sekvencie znakov pre často používané vzory, ako je vyhľadávanie jednotlivých slov alebo skupín čísel v texte. Awk podporuje štandard ERE.

Existuje mnoho spôsobov, ako vyvinúť regulárne výrazy, v závislosti od názoru programátora a od vlastností motora, pre ktorý sú vytvorené. Nie je ľahké napísať univerzálne regulárne výrazy, ktorým by porozumel každý engine. Preto sa zameriame na najčastejšie používané regulárne výrazy a pozrieme sa na vlastnosti ich implementácie pre sed a awk.

Regulárne výrazy POSIX BRE

Azda najjednoduchším vzorom BRE je regulárny výraz na vyhľadávanie presného výskytu postupnosti znakov v texte. Takto vyzerá vyhľadávanie reťazca v sed a awk:

$ echo "Toto je test" | sed -n "/test/p" $ echo "Toto je test" | awk "/test/(tlač $0)"

Hľadanie textu podľa vzoru v sed


Hľadanie textu podľa vzoru v awk

Môžete si všimnúť, že vyhľadávanie daného vzoru sa vykonáva bez zohľadnenia presného umiestnenia textu v riadku. Navyše na počte výskytov nezáleží. Potom, čo regulárny výraz nájde daný text kdekoľvek v linke sa linka považuje za vhodnú a je odovzdaná na ďalšie spracovanie.

Pri práci s regulárnymi výrazmi musíte vziať do úvahy, že rozlišujú veľké a malé písmená:

$ echo "Toto je test" | awk "/Test/(tlač $0)" $ echo "Toto je test" | awk "/test/(tlač $0)"

Regulárne výrazy rozlišujú veľké a malé písmená

Prvý regulárny výraz nenašiel žiadne zhody, pretože slovo „test“, začínajúce veľkým písmenom, sa v texte nevyskytuje. Druhý, nakonfigurovaný na vyhľadávanie slova napísaného veľkými písmenami, našiel vhodný riadok v prúde.

V regulárnych výrazoch môžete použiť nielen písmená, ale aj medzery a čísla:

$ echo "Toto je opäť test 2" | awk "/test 2/(tlač $0)"

Nájdenie časti textu obsahujúceho medzery a čísla

Modul regulárneho výrazu považuje medzery za regulárne znaky.

Špeciálne symboly

Použitím rôzne postavy V regulárnych výrazoch musíte brať do úvahy niektoré funkcie. Existujú teda niektoré špeciálne znaky alebo metaznaky, ktorých použitie v šablóne si vyžaduje špeciálny prístup. Tu sú:

.*^${}\+?|()
Ak je v šablóne potrebný jeden z nich, bude potrebné ho opustiť pomocou spätnej lomky (obrátená lomka) - \ .

Ak napríklad potrebujete v texte nájsť znak dolára, musíte ho zahrnúť do šablóny, pred ktorým bude znak escape. Povedzme, že existuje súbor myfile s nasledujúcim textom:

Vo vrecku mám 10 $
Znak dolára možno zistiť pomocou tohto vzoru:

$awk "/\$/(tlač $0)" môj súbor

Použitie špeciálneho znaku vo vzore

Okrem toho je spätné lomítko tiež špeciálnym znakom, takže ak ho potrebujete použiť vo vzore, bude potrebné ho tiež escapovať. Vyzerá to, že dve lomky idú za sebou:

$ echo "\ je špeciálny znak" | awk "/\\/(tlač $0)"

Únik proti spätnej lomke

Hoci lomka nie je zahrnutá v zozname špeciálnych znakov vyššie, pokus o jej použitie v regulárnom výraze napísanom pre sed alebo awk bude mať za následok chybu:

$ echo "3 / 2" | awk "///(tlač $0)"

Nesprávne použitie lomky vo vzore

Ak je to potrebné, musí tiež uniknúť:

$ echo "3 / 2" | awk "/\//(tlač $0)"

Únik pred lomkou

Symboly kotvy

Existujú dva špeciálne znaky na prepojenie vzoru so začiatkom alebo koncom textového reťazca. Veľký znak - ^ vám umožňuje opísať sekvencie znakov, ktoré sa nachádzajú na začiatku riadkov textu. Ak je vzor, ​​ktorý hľadáte, niekde inde v reťazci, regulárny výraz naň nebude reagovať. Použitie tohto symbolu vyzerá takto:

$ echo "vítajte na stránke likegeeks" | awk "/^likegeeks/(tlač $0)" $ echo "web likegeeks" | awk "/^likegeeks/(tlač $0)"

Nájdenie vzoru na začiatku reťazca

Znak ^ je určený na vyhľadávanie vzoru na začiatku riadku, pričom sa berie do úvahy aj veľkosť písmen. Pozrime sa, ako to ovplyvňuje spracovanie textového súboru:

$awk "/^this/(tlač $0)" môj súbor


Vyhľadanie vzoru na začiatku riadku v texte zo súboru

Ak pri použití sed umiestnite čiapku niekde do vzoru, bude sa s ňou zaobchádzať ako s akýmkoľvek iným bežným znakom:

$ echo "Toto ^ je test" | sed -n "/s ^/p"

Čiapka nie na začiatku vzoru v sed

V awk, keď používate rovnakú šablónu, tento znak musí byť zakódovaný:

$ echo "Toto ^ je test" | awk "/s\^/(tlač $0)"

Zakryte nie na začiatku šablóny v awk

Zistili sme vyhľadávanie fragmentov textu umiestnených na začiatku riadku. Čo ak potrebujete nájsť niečo, čo sa nachádza na konci riadku?

Pomôže nám v tom znak dolára - $, čo je kotviaci znak pre koniec riadku:

$ echo "Toto je test" | awk "/test$/(tlač $0)"

Hľadanie textu na konci riadku

V tej istej šablóne môžete použiť oba symboly kotvy. Spracujme súbor myfile, ktorého obsah je znázornený na obrázku nižšie, pomocou nasledujúceho regulárneho výrazu:

$ awk "/^toto je test $/(tlač $0)" môj súbor


Vzor, ktorý používa špeciálne znaky na začiatok a koniec riadku

Ako vidíte, šablóna reagovala len na riadok, ktorý plne zodpovedal danej postupnosti znakov a ich umiestneniu.

Tu je postup, ako odfiltrovať prázdne riadky pomocou kotviacich znakov:

$awk "!/^$/(tlač $0)" môj súbor
V tejto šablóne som použil symbol negácie, výkričník - ! . Pomocou tohto vzoru sa vyhľadávajú riadky, ktoré neobsahujú nič medzi začiatkom a koncom riadku a vďaka výkričník Vytlačia sa iba čiary, ktoré sa nezhodujú s týmto vzorom.

Symbol bodky

Bodka sa používa na priradenie akéhokoľvek jednotlivého znaku okrem znaku nového riadku. Odovzdajme súbor myfile tomuto regulárnemu výrazu, ktorého obsah je uvedený nižšie:

$awk "/.st/(tlač $0)" môj súbor


Použitie bodky v regulárnych výrazoch

Ako je zrejmé z výstupných údajov, vzoru zodpovedajú iba prvé dva riadky zo súboru, pretože obsahujú postupnosť znakov „st“, pred ktorými je ďalší znak, pričom tretí riadok neobsahuje vhodnú postupnosť a štvrtý ho má, ale je na úplnom začiatku riadku.

Triedy postáv

Bodka zodpovedá každému jednotlivému znaku, ale čo ak chcete byť flexibilnejší pri obmedzovaní množiny znakov, ktoré hľadáte? V tejto situácii môžete použiť triedy postáv.

Vďaka tomuto prístupu môžete organizovať vyhľadávanie ľubovoľného znaku z danej množiny. Na popis triedy znakov sa používajú hranaté zátvorky:

$awk "/th/(tlač $0)" môj súbor


Popis triedy znakov v regulárnom výraze

Tu hľadáme postupnosť znakov „th“, pred ktorými je znak „o“ alebo znak „i“.

Triedy sú užitočné pri hľadaní slov, ktoré môžu začínať veľkým alebo malým písmenom:

$ echo "toto je test" | awk "/jeho test/(tlač $0)" $ echo "Toto je test" | awk "/jeho test/(tlač $0)"

Vyhľadajte slová, ktoré môžu začínať malým alebo veľkým písmenom

Triedy znakov nie sú obmedzené na písmená. Tu je možné použiť iné symboly. Nie je možné vopred povedať, v akej situácii budú potrebné triedy - všetko závisí od riešeného problému.

Negácia tried postáv

Triedy znakov možno použiť aj na vyriešenie vyššie opísaného inverzného problému. Totiž namiesto hľadania symbolov zahrnutých v triede môžete organizovať vyhľadávanie všetkého, čo nie je zahrnuté v triede. Aby ste dosiahli toto správanie regulárneho výrazu, musíte pred zoznam znakov triedy umiestniť znak ^. Vyzerá to takto:

$ awk "/[^oi]th/(tlač $0)" môj súbor


Hľadanie postáv, ktoré nie sú v triede

V tomto prípade sa nájdu sekvencie „th“ znakov, pred ktorými nie je „o“ ani „i“.

Rozsahy znakov

V triedach znakov môžete popísať rozsahy znakov pomocou pomlčiek:

$awk "/st/(tlač $0)" môj súbor


Popis rozsahu znakov v triede znakov

IN v tomto príklade regulárny výraz reaguje na sekvenciu znakov „st“, pred ktorou je akýkoľvek znak nachádzajúci sa v abecedné poradie, medzi znaky "e" a "p".

Rozsahy je možné vytvoriť aj z čísel:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Regulárny výraz na nájdenie ľubovoľných troch čísel

Trieda znakov môže obsahovať niekoľko rozsahov:

$awk "/st/(tlač $0)" môj súbor


Trieda znakov pozostávajúca z niekoľkých rozsahov

Tento regulárny výraz nájde všetky sekvencie „st“, pred ktorými sú znaky z rozsahy a-f a m-z.

Špeciálne triedy postáv

BRE má špeciálne triedy znakov, ktoré môžete použiť pri písaní regulárnych výrazov:
  • [[:alpha:]] - zhoduje sa s akýmkoľvek abecedným znakom napísaným veľkými alebo malými písmenami.
  • [[:alnum:]] - zhoduje sa s ľubovoľným alfanumerickým znakom, konkrétne so znakmi v rozsahu 0-9 , A-Z , a-z .
  • [[:blank:]] - zhoduje sa s medzerou a tabulátorom.
  • [[:digit:]] – ľubovoľný číselný znak od 0 do 9.
  • [[:upper:]] - veľké písmená abecedy - A-Z .
  • [[:lower:]] - malé písmená abecedy - a-z .
  • [[:print:]] - zhoduje sa s ľubovoľným tlačiteľným znakom.
  • [[:punct:]] - zhoduje sa s interpunkčnými znamienkami.
  • [[:medzera:]] - medzery, najmä - medzera, tabulátor, znaky NL, FF, VT, CR.
V šablónach môžete použiť špeciálne triedy, ako je táto:

$ echo "abc" | awk "/[[:alpha:]]/(tlač $0)" $ echo "abc" | awk "/[[:digit:]]/(tlač $0)" $ echo "abc123" | awk "/[[:digit:]]/(tlač $0)"


Špeciálne triedy znakov v regulárnych výrazoch

Symbol hviezdy

Ak umiestnite hviezdičku za znak vo vzore, bude to znamenať, že regulárny výraz bude fungovať, ak sa znak objaví v reťazci koľkokrát – vrátane situácie, keď sa znak v reťazci nenachádza.

$ echo "test" | awk "/tes*t/(tlač $0)" $ echo "tessst" | awk "/tes*t/(tlač $0)"


Používanie znaku * v regulárnych výrazoch

Tento zástupný znak sa zvyčajne používa pre slová, ktoré sú neustále nesprávne napísané, alebo pre slová, ktoré sú predmetom rôzne varianty správny pravopis:

$ echo "Mám rád zelenú farbu" | awk "/color*r/(tlač $0)" $ echo "Páči sa mi zelená farba " | awk "/color*r/(tlač $0)"

Hľadanie slova s ​​rôznym pravopisom

V tomto príklade rovnaký regulárny výraz reaguje na slovo „farba“ aj na slovo „farba“. Dôvodom je skutočnosť, že znak „u“, za ktorým nasleduje hviezdička, môže chýbať alebo sa môže objaviť niekoľkokrát za sebou.

Ďalšou užitočnou funkciou, ktorá pochádza zo symbolu hviezdičky, je spojenie s bodkou. Táto kombinácia umožňuje regulárnemu výrazu reagovať na ľubovoľný počet ľubovoľných znakov:

$ awk "/this.*test/(tlač $0)" môj súbor


Šablóna, ktorá reaguje na ľubovoľný počet ľubovoľných znakov

V tomto prípade nezáleží na tom, koľko a aké znaky sú medzi slovami „toto“ a „test“.

Hviezdičku možno použiť aj s triedami znakov:

$ echo "st" | awk "/s*t/(tlač $0)" $ echo "sat" | awk "/s*t/(tlač $0)" $ echo "set" | awk "/s*t/(tlač $0)"


Použitie hviezdičky s triedami znakov

Vo všetkých troch príkladoch funguje regulárny výraz, pretože hviezdička za triedou znakov znamená, že ak sa nájde ľubovoľný počet znakov „a“ alebo „e“, alebo ak sa nenájde žiadny, reťazec bude zodpovedať danému vzoru.

Regulárne výrazy POSIX ERE

Šablóny POSIX ERE, ktoré podporujú niektoré pomocné programy Linuxu, môžu obsahovať ďalšie znaky. Ako už bolo spomenuté, awk podporuje tento štandard, ale sed nie.

Tu sa pozrieme na najčastejšie používané symboly vo vzoroch ERE, ktoré sa vám budú hodiť pri vytváraní vlastných regulárnych výrazov.

▍ Otáznik

Otáznik znamená, že predchádzajúci znak sa môže v texte objaviť raz alebo sa vôbec nemusí objaviť. Táto postava je jedným z opakujúcich sa metaznakov. Tu je niekoľko príkladov:

$ echo "tet" | awk "/tes?t/(tlač $0)" $ echo "test" | awk "/tes?t/(tlač $0)" $ echo "testst" | awk "/tes?t/(tlač $0)"


Otáznik v regulárnych výrazoch

Ako vidíte, v treťom prípade sa písmeno „s“ objaví dvakrát, takže regulárny výraz nereaguje na slovo „testst“.

Otáznik možno použiť aj s triedami znakov:

$ echo "tst" | awk "/t?st/(tlač $0)" $ echo "test" | awk "/t?st/(tlač $0)" $ echo "chuť" | awk "/t?st/(tlač $0)" $ echo "taest" | awk "/t?st/(tlač $0)" $ echo "test" | awk "/t?st/(tlač $0)"


Otáznik a triedy postáv

Ak v riadku nie sú žiadne znaky z triedy alebo sa jeden z nich vyskytuje raz, regulárny výraz funguje, no akonáhle sa v slove objavia dva znaky, systém už nenájde zhodu so vzorom v texte.

▍ Symbol plus

Znak plus vo vzore označuje, že regulárny výraz sa bude zhodovať s tým, čo hľadá, ak sa predchádzajúci znak v texte vyskytuje raz alebo viackrát. Táto konštrukcia však nebude reagovať na absenciu symbolu:

$ echo "test" | awk "/te+st/(tlač $0)" $ echo "test" | awk "/te+st/(tlač $0)" $ echo "tst" | awk "/te+st/(tlač $0)"


Symbol plus v regulárnych výrazoch

V tomto príklade, ak slovo neobsahuje znak „e“, nástroj regulárneho výrazu nenájde zhody so vzorom v texte. Symbol plus funguje aj s triedami znakov - týmto spôsobom je podobný hviezdičke a otázniku:

$ echo "tst" | awk "/t+st/(tlač $0)" $ echo "test" | awk "/t+st/(tlač $0)" $ echo "teast" | awk "/t+st/(tlač $0)" $ echo "teeast" | awk "/t+st/(tlač $0)"


Plus triedy znakov a znakov

V tomto prípade, ak riadok obsahuje akýkoľvek znak z triedy, text sa bude považovať za zodpovedajúci vzoru.

▍ Kučeravé traky

Zložené zátvorky, ktoré možno použiť vo vzoroch ERE, sú podobné symbolom diskutovaným vyššie, ale umožňujú presnejšie špecifikovať požadovaný počet výskytov symbolu, ktorý im predchádza. Obmedzenie môžete zadať v dvoch formátoch:
  • n - číslo určujúce presný počet hľadaných výskytov
  • n, m sú dve čísla, ktoré sa interpretujú takto: „najmenej n-krát, ale nie viac ako m“.
Tu sú príklady prvej možnosti:

$ echo "tst" | awk "/te(1)st/(tlač $0)" $ echo "test" | awk "/te(1)st/(tlač $0)"

Kučeravé zátvorky vo vzoroch, hľadanie presného počtu výskytov

V starších verziách awk ste museli použiť možnosť príkazového riadka --re-interval, aby program rozpoznal intervaly v regulárnych výrazoch, ale v novších verziách to nie je potrebné.

$ echo "tst" | awk "/te(1,2)st/(tlač $0)" $ echo "test" | awk "/te(1,2)st/(tlač $0)" $ echo "test" | awk "/te(1,2)st/(tlač $0)" $ echo "teeest" | awk "/te(1,2)st/(tlač $0)"


Medzery uvedené v zložených zátvorkách

V tomto príklade sa znak „e“ musí objaviť 1 alebo 2-krát v riadku, potom bude regulárny výraz reagovať na text.

Kučeravé zátvorky možno použiť aj s triedami postáv. Tu platia zásady, ktoré už poznáte:

$ echo "tst" | awk "/t(1,2)st/(tlač $0)" $ echo "test" | awk "/t(1,2)st/(tlač $0)" $ echo "test" | awk "/t(1,2)st/(tlač $0)" $ echo "teeast" | awk "/t(1,2)st/(tlač $0)"


Kučeravé zátvorky a triedy postáv

Šablóna bude reagovať na text, ak obsahuje znak „a“ alebo znak „e“ raz alebo dvakrát.

▍Logický symbol „alebo“.

Symbol | - zvislá čiara znamená v regulárnych výrazoch logické „alebo“. Pri spracovaní regulárneho výrazu obsahujúceho niekoľko fragmentov oddelených takýmto znamienkom bude nástroj považovať analyzovaný text za vhodný, ak sa zhoduje s niektorým z fragmentov. Tu je príklad:

$ echo "Toto je test" | awk "/test|skúška/(tlač $0)" $ echo "Toto je skúška" | awk "/test|skúška/(tlač $0)" $ echo "Toto je niečo iné" | awk "/test|skúška/(tlač $0)"


Logické „alebo“ v regulárnych výrazoch

V tomto príklade je regulárny výraz nakonfigurovaný tak, aby v texte hľadal slová „test“ alebo „skúška“. Upozorňujeme, že medzi fragmentmi šablóny a symbolom, ktorý ich oddeľuje | nemali by tam byť žiadne medzery.

Fragmenty regulárnej expresie možno zoskupiť pomocou zátvoriek. Ak zoskupíte určitú postupnosť znakov, systém ju bude vnímať ako obyčajný znak. To znamená, že sa naň dajú použiť napríklad opakujúce sa metaznaky. Takto to vyzerá:

$ echo "Páči sa mi to" | awk "/Like(Geeks)?/(tlač $0)" $ echo "LikeGeeks" | awk "/Páči sa mi(Geeks)?/(tlač $0)"


Zoskupovanie fragmentov regulárneho výrazu

V týchto príkladoch je slovo „Geeks“ uzavreté v zátvorkách, za ktorým nasleduje otáznik. Pripomeňme, že otáznik znamená „0 alebo 1 opakovanie“, takže regulárny výraz bude reagovať na reťazec „Páči sa mi to“ aj na reťazec „LikeGeeks“.

Praktické príklady

Teraz, keď sme prebrali základy regulárnych výrazov, je čas urobiť s nimi niečo užitočné.

▍Počítanie počtu súborov

Napíšme bash skript, ktorý počíta súbory umiestnené v adresároch, ktoré sú zapísané do premennej prostredie PATH. Aby ste to mohli urobiť, musíte najskôr vygenerovať zoznam ciest k adresárom. Urobme to pomocou sed, nahradením dvojbodiek medzerami:

$ echo $PATH | sed "s/:/ /g"
Príkaz nahradiť podporuje regulárne výrazy ako vzory na vyhľadávanie textu. V tomto prípade je všetko veľmi jednoduché, hľadáme symbol dvojbodky, ale nikto nás neobťažuje použiť niečo iné - všetko závisí od konkrétnej úlohy.
Teraz musíte prejsť výsledný zoznam v slučke a vykonať akcie potrebné na sčítanie počtu súborov. Všeobecný prehľad skriptu bude takýto:

Mypath=$(echo $PATH | sed "s/:/ /g") pre adresár v $mypath hotovo
Teraz napíšme celý text skriptu pomocou príkazu ls na získanie informácií o počte súborov v každom adresári:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") počet=0 pre adresár v $mypath do check=$(ls $adresár) pre položku v $check do count=$ [ $count + 1 ] done echo "$adresár - $count" count=0 hotovo
Pri spustení skriptu sa môže ukázať, že niektoré adresáre z PATH neexistujú, to mu však nezabráni v počítaní súborov v existujúcich adresároch.


Počítanie súborov

Hlavnou hodnotou tohto príkladu je, že použitím rovnakého prístupu môžete vyriešiť oveľa zložitejšie problémy. Ktoré presne závisia od vašich potrieb.

▍Overovanie e-mailových adries

Existujú webové stránky s obrovskými zbierkami regulárnych výrazov, ktoré vám umožňujú kontrolovať adresy Email, telefónne čísla, a tak ďalej. Jedna vec je však vziať si niečo hotové a druhá vec je vytvoriť si niečo sami. Napíšme teda regulárny výraz na kontrolu e-mailových adries. Začnime analýzou zdrojových údajov. Tu je napríklad určitá adresa:

[chránený e-mailom]
Používateľské meno, používateľské meno, môže pozostávať z alfanumerických a niektorých ďalších znakov. Konkrétne ide o bodku, pomlčku, podčiarkovník, znamienko plus. Za užívateľským menom nasleduje znak @.

Vyzbrojení týmito znalosťami začnime zostavovať regulárny výraz z jeho ľavej strany, ktorý sa používa na kontrolu používateľského mena. Tu je to, čo máme:

^(+)@
Tento regulárny výraz možno čítať takto: „Riadok musí začínať aspoň jedným znakom zo skupiny, ktorý je uvedený v hranatých zátvorkách, za ktorým musí nasledovať znak @.“

Teraz - frontname hostname - hostname . Platia tu rovnaké pravidlá ako pre používateľské meno, takže šablóna pre toto meno bude vyzerať takto:

(+)
Názov domény najvyššej úrovne podlieha osobitné pravidlá. Môžu obsahovať iba abecedné znaky, z ktorých musia byť aspoň dva (napríklad takéto domény zvyčajne obsahujú kód krajiny) a nie viac ako päť. To všetko znamená, že šablóna na kontrolu poslednej časti adresy bude vyzerať takto:

\.({2,5})$
Môžete si to prečítať takto: „Najskôr musí byť bodka, potom 2 až 5 abecedných znakov a potom riadok končí.“

Keď máme pripravené šablóny pre jednotlivé časti regulárneho výrazu, spojme ich:

^(+)@(+)\.({2,5})$
Teraz už zostáva len otestovať, čo sa stalo:

$ echo " [chránený e-mailom]" | awk "/^(+)@(+)\.((2,5))$/(tlač $0)" $ echo " [chránený e-mailom]" | awk "/^(+)@(+)\.((2,5))$/(tlač $0)"


Overenie e-mailovej adresy pomocou regulárnych výrazov

Skutočnosť, že text odovzdaný do awk sa zobrazí na obrazovke, znamená, že ho systém rozpoznal ako e-mailovú adresu.

Výsledky

Ak sa vám vtedy regulárny výraz na kontrolu e-mailových adries, na ktorý ste narazili na úplnom začiatku článku, zdal úplne nezrozumiteľný, dúfame, že teraz už nevyzerá ako nezmyselná sada znakov. Ak je to naozaj tak, znamená to tento materiál splnila svoj účel. V skutočnosti sú regulárne výrazy témou, ktorú môžete študovať celý život, ale aj to málo, čo sme prebrali, vám už môže pomôcť pri písaní skriptov, ktoré spracovávajú texty dosť pokročilé.

V tejto sérii materiálov sme zvyčajne ukázali veľmi jednoduché príklady bash skripty, ktoré pozostávali doslova z niekoľkých riadkov. Nabudúce sa pozrieme na niečo väčšie.

Vážení čitatelia! Používate regulárne výrazy pri spracovaní textu v skriptoch príkazového riadku?

Jeden z najužitočnejších a najbohatších tímov v Linuxový terminál– príkaz „grep“. Grep je skratka, ktorá znamená „tlač globálneho regulárneho výrazu“ (to znamená „hľadajte všade reťazce zodpovedajúce regulárnemu výrazu a vytlačte ich“). To znamená, že grep možno použiť na zistenie, či vstup zodpovedá zadaným vzorom.

Tento zdanlivo triviálny program je pri správnom používaní veľmi výkonný. Jeho schopnosť triediť vstup na základe zložitých pravidiel z neho robí populárny článok v mnohých príkazových reťazcoch.

Tento tutoriál sa zaoberá niektorými možnosťami príkazu grep a potom prejde na používanie regulárnych výrazov. Všetko popísané v túto príručku techniky možno použiť pri správe virtuálneho servera.

Základy používania

Vo svojej najjednoduchšej forme sa grep používa na nájdenie zhody vzorov písmen v textovom súbore. To znamená, že ak grep dostane hľadané slovo, vytlačí každý riadok v súbore, ktorý toto slovo obsahuje.

Ako príklad môžete použiť grep na nájdenie riadkov obsahujúcich slovo „GNU“ vo verzii 3 GNU General Public License v systéme Ubuntu.

cd /usr/share/common-licenses
grep "GNU" GPL-3
VŠEOBECNÁ VEREJNÁ LICENCIA GNU





13. Používajte s licenciou GNU Affero General Public License.
podľa verzie 3 GNU Affero General Public License do jedného
...
...

Prvý argument, "GNU", je vzor, ​​ktorý sa má hľadať, a druhý argument, "GPL-3", je vstupný súbor, ktorý sa má nájsť.

Výsledkom budú všetky riadky obsahujúce vzor textu. V niektorých Linuxové distribúcie vzor, ​​ktorý hľadáte, bude zvýraznený vo výstupných riadkoch.

Všeobecné možnosti

V predvolenom nastavení príkaz grep jednoducho vyhľadá presne špecifikované vzory vo vstupnom súbore a vytlačí riadky, ktoré nájde. Správanie grepu však možno zmeniť pridaním niektorých ďalších príznakov.

Ak potrebujete ignorovať veľké a malé písmená v parametri vyhľadávania a hľadať variácie vzoru s veľkými aj malými písmenami, môžete použiť pomocné programy "-i" alebo "--ignore-case".

Ako príklad môžete použiť grep na vyhľadanie slova „licencia“ napísaného veľkými, malými alebo zmiešanými písmenami v rovnakom súbore.

grep -i "licencia" GPL-3
VŠEOBECNÁ VEREJNÁ LICENCIA GNU
tohto licenčného dokumentu, ale jeho zmena nie je povolená.
GNU General Public License je bezplatná, copyleft licencia pre
Licencie pre väčšinu softvéru a iných praktických diel sú navrhnuté
GNU General Public License je určená na to, aby zaručila vašu slobodu
GNU General Public License pre väčšinu nášho softvéru; platí to aj pre


„Táto licencia“ sa vzťahuje na verziu 3 GNU General Public License.
„Program“ sa vzťahuje na akékoľvek dielo podliehajúce autorským právam, na ktoré sa vzťahuje licencia podľa tohto dokumentu
...
...

Ako vidíte, výstup obsahuje „LICENCIA“, „licencia“ a „licencia“. Ak by sa v súbore nachádzala inštancia „LiCeNsE“, vypíše sa tiež.
Ak potrebujete nájsť všetky riadky, ktoré neobsahujú zadaný vzor, ​​môžete použiť príznaky „-v“ alebo „--invert-match“.

Ako príklad môžete použiť nasledujúci príkaz na vyhľadanie licencie BSD pre všetky riadky, ktoré neobsahujú slovo „the“:

grep -v "the" BSD
Všetky práva vyhradené.
Redistribúcia a použitie v zdrojovej a binárnej forme, s alebo bez
sú splnené:
môžu byť použité na podporu alebo propagáciu produktov odvodených z tohto softvéru
bez osobitného predchádzajúceho písomného povolenia.
TENTO SOFTVÉR POSKYTUJÚ REGENCI A PRISPIEVATELIA ``TAK, AKO JE""" A
AKÉKOĽVEK VÝSLOVNÉ ALEBO IMPLICITNÉ ZÁRUKY, VRÁTANE, ALE NIE VÝHRADNE,
...
...

Ako vidíte, posledné dva riadky boli na výstupe ako neobsahujúce slovo „the“, pretože príkaz „ignore case“ nebol použitý.

Vždy je užitočné poznať čísla riadkov, kde boli nájdené zhody. Možno ich nájsť pomocou príznakov "-n" alebo "--line-number".

Ak použijete tento príznak v predchádzajúcom príklade, zobrazí sa nasledujúci výsledok:

grep -vn "the" BSD
2: Všetky práva vyhradené.
3:
4: Redistribúcia a použitie v zdrojovej a binárnej forme, s alebo bez
6:sú splnené:
13: možno použiť na podporu alebo propagáciu produktov odvodených z tohto softvéru
14: bez osobitného predchádzajúceho písomného povolenia.
15:
16: TENTO SOFTVÉR POSKYTUJÚ REGENCI A PRISPIEVATELIA „TAK, AKO JE““ A
17: AKÉKOĽVEK VÝSLOVNÉ ALEBO IMPLICITNÉ ZÁRUKY, VRÁTANE, ALE NIE VÝHRADNE,
...
...

Teraz sa môžete odvolávať na číslo riadku, keď potrebujete vykonať zmeny v každom riadku, ktorý neobsahuje „the“.

Regulárne výrazy

Ako bolo spomenuté v úvode, grep je skratka pre „global regular expression print“. Regulárny výraz je textový reťazec, ktorý popisuje špecifický vzor vyhľadávania.

Rôzne aplikácie a programovacie jazyky používajú regulárne výrazy mierne odlišne. Tento tutoriál pokrýva iba malú podmnožinu spôsobov, ako opísať vzory pre Grep.

Písmenové zhody

Vo vyššie uvedených príkladoch hľadania slov „GNU“ a „the“ sa hľadali veľmi jednoduché regulárne výrazy, ktoré sa presne zhodovali s reťazcom znakov „GNU“ a „the“.

Je správnejšie ich považovať za zhody reťazcov znakov a nie ako zhody slov. Keď sa zoznámite so zložitejšími vzormi, tento rozdiel sa stane významnejším.

Vzory, ktoré sa presne zhodujú s danými znakmi, sa nazývajú vzory písmen, pretože sa zhodujú so vzorom písmeno po písmene, znak po znaku.

Všetky abecedné a číselné znaky (a niektoré ďalšie znaky) sa zhodujú doslovne, pokiaľ neboli upravené inými výrazovými mechanizmami.

Kotevné zápasy

Kotvy sú špeciálne znaky, ktoré označujú miesto v reťazci požadovanej zhody.

Môžete napríklad určiť, že vyhľadávanie potrebuje iba riadky, ktoré na úplnom začiatku obsahujú slovo „GNU“. Ak to chcete urobiť, musíte pred reťazcom písmen použiť kotvu „^“.

Tento príklad vytlačí iba riadky, ktoré na začiatku obsahujú slovo „GNU“.

grep "^ GNU" GPL-3
GNU General Public License pre väčšinu nášho softvéru; platí to aj pre
GNU General Public License, môžete si vybrať akúkoľvek verziu, ktorá bola kedy publikovaná

Podobne, kotva "$" môže byť použitá za doslovným reťazcom na označenie toho, že zhoda je platná len vtedy, ak je hľadaný reťazec znakov na konci textového reťazca.

Nasledujúci regulárny výraz vytlačí iba tie riadky, ktoré na konci obsahujú „a“:

grep "a $" GPL-3
že na tento slobodný softvér neexistuje žiadna záruka. Pre oboch používateľov“ a
Presné podmienky pre kopírovanie, distribúciu a


alternatíva je povolená len príležitostne a nekomerčne, a
siete môže byť odmietnuté, keď samotná úprava vecne a
nepriaznivo ovplyvňuje chod siete alebo porušuje pravidlá a
predbežne, pokiaľ a kým držiteľ autorských práv výslovne a
získa licenciu od pôvodných poskytovateľov licencie, spúšťať, upravovať a
vyrábať, používať, predávať, ponúkať na predaj, dovážať a inak prevádzkovať, upravovať a

Priraďte akúkoľvek postavu

Bodka (.) sa používa v regulárnych výrazoch na označenie toho, že na určenom mieste sa môže objaviť akýkoľvek znak.

Napríklad, ak chcete nájsť zhody, ktoré obsahujú dva znaky a potom sekvenciu „cept“, použite nasledujúci vzor:

grep "..cept" GPL-3
používanie, čo je presne tam, kde je to najviac neprijateľné. Preto my
porušenie podľa platného autorského zákona, okrem jeho vykonania na a
oznamuje používateľovi, že na prácu sa nevzťahuje žiadna záruka (okrem

vo forme samostatnej písomnej licencie alebo uvedené ako výnimky;
Zakryté dielo nesmiete propagovať ani upravovať inak ako výslovne
9. Na získanie kópií sa nevyžaduje prijatie.
...
...

Ako vidíte, výsledky obsahujú slová „akceptovať“ a „okrem“, ako aj variácie týchto slov. Vzor by sa zhodoval aj so sekvenciou „z2cept“, ak by bol v texte.

Výrazy v zátvorkách

Umiestnením skupiny znakov do hranatých zátvoriek ("") môžete naznačiť, že ktorýkoľvek zo znakov v zátvorkách sa môže objaviť na danej pozícii.

To znamená, že ak potrebujete nájsť reťazce obsahujúce „too“ alebo „dva“, môžete tieto variácie stručne označiť pomocou nasledujúceho vzoru:

grep "na" GPL-3
aj vaše programy.

Vývojári, ktorí používajú GNU GPL, chránia vaše práva v dvoch krokoch:
počítačová sieť, bez prenosu kópie, nie je prenos.

Zodpovedajúci zdroj zo sieťového servera bezplatne.
...
...

Ako vidíte, v súbore sa našli obe varianty.

Vloženie znakov do zátvoriek tiež poskytuje niekoľko užitočných funkcií. Môžete označiť, že všetko okrem znakov v zátvorkách zodpovedá vzoru tak, že zoznam znakov v zátvorkách začnete znakom „^“.

Tento príklad používa vzor „.ode“, ktorý sa nesmie zhodovať so sekvenciou „kódu“.

grep "[^c]ode" GPL-3
1. Zdrojový kód.
model, dať každému, kto vlastní objektový kód, buď (1) a
jediný významný spôsob použitia produktu.
všimnite si toto, keď sa spustí v interaktívnom režime:

Stojí za zmienku, že výstup druhého riadku obsahuje slovo "kód". Toto nie je chyba regulárneho výrazu ani grep.

Tento riadok bol skôr vytlačený, pretože obsahuje aj sekvenciu zhody vzoru „režim“ nachádzajúcu sa v slove „model“. To znamená, že reťazec bol vytlačený, pretože sa zhodoval so vzorom.

Ďalší užitočná funkcia zátvorky - možnosť špecifikovať rozsah znakov namiesto zadávania každého znaku samostatne.

To znamená, že ak potrebujete nájsť každý riadok, ktorý začína veľkým písmenom, môžete použiť nasledujúci vzor:

grep "^" GPL-3
GNU General Public License pre väčšinu nášho softvéru; platí to aj pre

Licencia. Každý držiteľ licencie je oslovovaný ako „vy“. "Licencie" a


Systémové knižnice alebo univerzálne nástroje alebo všeobecne dostupné zadarmo
Zdroj.

...
...

Kvôli niektorým inherentným problémom s porovnávaním je pre presnejšie výsledky lepšie použiť triedy znakov POSIX namiesto rozsahu znakov použitého v príklade vyššie.
Existuje mnoho tried znakov, ktoré nie sú zahrnuté v tejto príručke; napríklad na vykonanie rovnakého postupu ako v príklade vyššie môžete použiť triedu znakov "[:upper:]" v zátvorkách.

grep "^[[:upper:]]" GPL-3
GNU General Public License pre väčšinu nášho softvéru; platí to aj pre
Štáty by nemali dovoliť, aby patenty obmedzovali vývoj a používanie
Licencia. Každý držiteľ licencie je oslovovaný ako „vy“. "Licencie" a
Komponent a (b) slúži len na umožnenie použitia diela s ním
Hlavný komponent alebo implementovať štandardné rozhranie, pre ktoré
Systémové knižnice alebo univerzálne nástroje alebo všeobecne dostupné zadarmo
Zdroj.
Užívateľský produkt sa prevádza príjemcovi natrvalo alebo na a
...
...

Opakujte vzor (0 alebo viackrát)

Jedným z najčastejšie používaných metaznakov je symbol „*“, ktorý znamená „zopakujte predchádzajúci znak alebo výraz 0 alebo viackrát“.

Napríklad, ak chcete nájsť každý riadok s otváracími alebo zatváracími zátvorkami, ktoré obsahujú iba písmená a medzi nimi jednotlivé medzery, môžete použiť nasledujúci výraz:

grep "(*)" GPL-3

distribúcie (s úpravou alebo bez nej), sprístupnením
ako dielo ako celok, ktoré (a) je zahrnuté v bežnej forme
Komponent a (b) slúži len na umožnenie použitia diela s ním
(ak existuje), na ktorom beží spustiteľné dielo, alebo kompilátor, ktorý sa používa
(vrátane fyzického distribučného média), spolu s
(vrátane fyzického distribučného média), spolu s a
mieste (zadarmo alebo za poplatok) a ponúkajú rovnocenný prístup k
...
...

Ako sa vyhnúť metaznakom

Niekedy možno budete musieť hľadať doslovnú bodku alebo doslovnú otvorenú zátvorku. Pretože tieto znaky majú v regulárnych výrazoch špecifický význam, musíte im „uniknúť“ tým, že grepu poviete, že ich špeciálny význam v tomto prípade nie je potrebný.

Tieto znaky je možné opustiť použitím spätnej lomky (\) pred znakom, ktorý má zvyčajne špeciálny význam.

Ak napríklad potrebujete nájsť reťazec, ktorý začína veľkým písmenom a končí bodkou, môžete použiť výraz uvedený nižšie. Opačná lomka pred poslednou bodkou hovorí príkazu, aby ju „unikol“, takže posledná bodka predstavuje doslovnú bodku a nemá význam „akýkoľvek znak“:

grep "^.*\.$" GPL-3
Zdroj.
licencovať výnimkami z jednej alebo viacerých jej podmienok.
Licencia by znamenala úplné zdržanie sa šírenia Programu.
VŠETKÝ POTREBNÝ SERVIS, OPRAVA ALEBO OPRAVA.
TAKÉTO ŠKODY.
Pridajte aj informácie o tom, ako vás kontaktovať elektronickou a papierovou poštou.

Pokročilé regulárne výrazy

Príkaz Grep možno použiť aj s rozšíreným jazykom regulárnych výrazov pomocou príznaku -E alebo zavolaním príkazu egrep namiesto grep.

Tieto príkazy otvárajú možnosti „rozšírených regulárnych výrazov“. Rozšírené regulárne výrazy zahŕňajú všetky základné metaznaky, ako aj ďalšie metaznaky na vyjadrenie zložitejších zhôd.

Zoskupovanie

Jednou z najjednoduchších a najužitočnejších funkcií, ktoré rozšírené regulárne výrazy poskytujú, je možnosť zoskupovať výrazy a používať ich ako jednu jednotku.

Zátvorky sa používajú na zoskupenie výrazov. Ak potrebujete použiť zátvorky mimo rozšírených regulárnych výrazov, možno ich „uniknúť“ pomocou spätnej lomky

grep "\(zoskupenie\)" súbor.txt
grep -E "(zoskupenie)" súbor.txt
egrep "(zoskupenie)" súbor.txt

Vyššie uvedené výrazy sú ekvivalentné.

Striedanie

Rovnako ako hranaté zátvorky určujú rôzne možné zhody pre jeden znak, prekladanie vám umožňuje určiť alternatívne zhody pre reťazce znakov alebo množiny výrazov.

Symbol zvislej čiary „|“ sa používa na označenie striedania. Striedanie sa často používa pri zoskupovaní na označenie toho, že jedna z dvoch alebo viacerých možných možností by sa mala považovať za zhodu.

V tomto príklade musíte vyhľadať „GPL“ alebo „všeobecnú verejnú licenciu“:

grep -E "(GPL|General Public License)" GPL-3
GNU General Public License je bezplatná, copyleft licencia pre
GNU General Public License je určená na to, aby zaručila vašu slobodu
GNU General Public License pre väčšinu nášho softvéru; platí to aj pre
cena. Naše všeobecné verejné licencie sú navrhnuté tak, aby vám zabezpečili
Vývojári, ktorí používajú GNU GPL, chránia vaše práva v dvoch krokoch:
GPL jasne vysvetľuje ochranu vývojárov a autorov
autori, GPL vyžaduje, aby upravené verzie boli označené ako
navrhli túto verziu GPL tak, aby im zakazovala túto prax
...
...

Striedanie možno použiť na výber medzi dvoma alebo viacerými možnosťami; Ak to chcete urobiť, musíte zadať zostávajúce možnosti do skupiny výberu, pričom každú z nich oddelíte pomocou zvislého pruhu symbolu „|“.

Kvantifikátory

V rozšírených regulárnych výrazoch existujú metaznaky, ktoré označujú, ako často sa znak opakuje, podobne ako metaznak „*“ označuje, že predchádzajúci znak alebo reťazec znakov sa zhoduje 0 alebo viackrát.

Na zhodu so znakom 0 alebo viackrát môžete použiť znak „?“. Vďaka tomu bude predchádzajúci znak alebo séria znakov v podstate voliteľné.

V tomto príklade sa po vložení sekvencie „copy“ do voliteľnej skupiny zobrazia zhody „copyright“ a „right“:

grep -E "(kopírovať)?správne" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
Aby sme ochránili vaše práva, musíme zabrániť tomu, aby vás ostatní popierali
tieto práva alebo vás požiadať, aby ste sa týchto práv vzdali. Preto máte
poznať svoje práva.
Vývojári, ktorí používajú GNU GPL, chránia vaše práva v dvoch krokoch:
(1) uplatniť autorské práva na softvér a (2) ponúknuť vám túto licenciu
„Autorské práva“ tiež znamenajú zákony podobné autorským právam, ktoré sa vzťahujú na iné druhy
...
...

Znak „+“ zodpovedá výrazom 1 alebo viackrát. Funguje to takmer ako symbol "*", ale pri použití "+" sa výraz musí zhodovať aspoň raz.

Nasledujúci výraz sa zhoduje s reťazcom „free“ plus 1 alebo viac znakov, ktoré nie sú medzery:

grep -E "free[^[:space:]]+" GPL-3
GNU General Public License je bezplatná, copyleft licencia pre
vziať vám slobodu zdieľať a meniť diela. naopak
GNU General Public License je určená na to, aby zaručila vašu slobodu
Keď hovoríme o slobodnom softvéri, máme na mysli slobodu, nie
mať slobodu distribuovať kópie slobodného softvéru (a spoplatňovať

slobody, ktoré ste dostali. Musíte sa uistiť, že aj oni dostanú
ochrana používateľov“ sloboda meniť softvér
GPL, ako je potrebné na ochranu slobody používateľov.
patenty nemožno použiť na to, aby bol program neslobodný.

Počet opakovaných zápasov

Ak potrebujete určiť, koľkokrát sa majú zhody opakovať, môžete použiť zložené zátvorky („( )“). Tieto symboly sa používajú na označenie presného počtu, rozsahu a hornej a dolnej hranice počtu zhôd výrazu.

Ak potrebujete nájsť všetky riadky, ktoré obsahujú kombináciu troch samohlások, môžete použiť nasledujúci výraz:

grep -E "(3)" GPL-3
zmenili, aby ich problémy neboli mylne pripisované
autorov predchádzajúcich verzií.
prijímajte ho na akomkoľvek médiu za predpokladu, že budete nápadne a
poskytnúť podľa predchádzajúceho odseku plus právo na držbu
krytú prácu tak, aby ste zároveň splnili svoje povinnosti z toho vyplývajúce
Ak potrebujete nájsť všetky slová pozostávajúce zo 16-20 znakov, použite nasledujúci výraz:
grep -E "[[:alpha:]](16,20)" GPL-3
určité povinnosti, ak distribuujete kópie softvéru alebo ak
upravíte ho: povinnosti rešpektovať slobodu iných.
c) zákaz uvádzania do omylu o pôvode daného materiálu, príp

závery

V mnohých prípadoch je príkaz grep užitočný na hľadanie vzorov v súboroch alebo v hierarchii systém súborov. Šetrí veľa času, preto sa oplatí oboznámiť sa s jeho parametrami a syntaxou.

Regulárne výrazy sú ešte všestrannejšie a možno ich použiť v mnohých populárnych programoch. Napríklad veľa textové editory použite regulárne výrazy na vyhľadávanie a nahradzovanie textu.

Pokročilé programovacie jazyky navyše používajú regulárne výrazy na vykonávanie procedúr na konkrétnych údajoch. Vedieť pracovať s regulárnymi výrazmi sa hodí pri riešení bežných problémov súvisiacich s počítačom.

Značky: ,

Dobré popoludnie, hostia!

V dnešnom článku sa chcem dotknúť tak obrovskej témy, akou je Regulárne výrazy. Myslím, že každý vie, že téma regulárnych výrazov (ako sa regulárne výrazy v slangu nazývajú) je rozsiahla v rozsahu jedného príspevku. Preto sa pokúsim stručne, ale čo najjasnejšie zozbierať svoje myšlienky a sprostredkovať vám ich v .

Dovoľte mi začať tým, že existuje niekoľko typov regulárnych výrazov:

1. Tradičné regulárne výrazy(sú tiež základné, základné a základné regulárne výrazy(BRE))

  • Syntax týchto výrazov je definovaná ako zastaraná, no napriek tomu je stále rozšírená a používaná mnohými nástrojmi UNIX
  • Medzi základné regulárne výrazy patria nasledujúce metaznaky (viac o ich význame nižšie):
    • \( \) - počiatočná verzia pre ( ) (rozšírená)
    • \(\) - počiatočná verzia pre () (rozšírená)
    • \n, Kde n- číslo od 1 do 9
  • Vlastnosti používania týchto metaznakov:
    • Za výrazom zodpovedajúcim jednému znaku musí nasledovať hviezdička. Príklad: *.
    • Výraz \( blokovať\)* treba považovať za nesprávne. V niektorých prípadoch zodpovedá nule alebo viacerým opakovaniam reťazca blokovať. V iných zodpovedá reťazcu blokovať* .
    • V rámci triedy znakov sa významy špeciálnych znakov vo veľkej miere ignorujú. Špeciálne prípady:
    • Ak chcete do množiny pridať znak ^, nesmie tam byť umiestnený ako prvý.
    • Ak chcete do množiny pridať znak -, musíte ho tam umiestniť prvý alebo posledný. Napríklad:
      • Šablóna názvu DNS, ktorá môže obsahovať písmená, čísla, mínus a bodku: [-0-9a-zA-Z.] ;
      • ľubovoľný znak okrem mínusov a čísel: [^-0-9] .
    • Ak chcete do množiny pridať znak [ alebo ], musíte ho tam umiestniť ako prvý. Napríklad:
      • zhody ], [, a alebo b.

2. Pokročilé regulárne výrazy(oni sú rozšírené regulárne výrazy(ERE))

  • Syntax týchto výrazov je podobná syntaxi hlavných výrazov, s výnimkou:
    • Odstránilo sa používanie spätných lomítok pre metaznaky ( ) a ().
    • Opačná lomka pred metaznakom prepíše jeho špeciálny význam.
    • Teoreticky zamietnuté nepravidelný dizajn\ n .
    • Pridané metaznaky + , ? , | .

3. Regulárne výrazy kompatibilné s Perlom(oni sú Regulárne výrazy kompatibilné s jazykom Perl(PCRE))

  • majú bohatšiu a zároveň predvídateľnú syntax ako dokonca POSIX ERE, takže ich aplikácie často používajú.

Regulárne výrazy skladá sa zšablóny, resp nastaviť šablónu Vyhľadávanie. Šablóna pozostáva od pravidlá vyhľadávania, ktoré sa skladajú z postavy A metaznaky.

Pravidlá vyhľadávania sú určené nasledovne operácií:

Výpočet |

Pipe (|) oddeľuje platné možnosti, dalo by sa povedať - logické ALEBO. Napríklad „grey|grey“ sa zhoduje sivá alebo sivá.

Skupina alebo odbor()

Okrúhle zátvorky sa používajú na definovanie rozsahu a priority operátorov. Napríklad „grey|grey“ a „gr(a|e)y“ sú rôzne vzory, ale oba opisujú množinu obsahujúcu sivá A sivá.

Kvantifikovať ()? * +

Kvantifikátor po postave alebo skupine určuje koľkokrát predchodca môže dôjsť k prejavu.

všeobecný výraz, opakovania môžu byť od m do n vrátane.

všeobecný výraz m alebo viac opakovaní.

všeobecný výraz nie viac ako n opakovaní.

hladkén opakovaní.

Otáznik znamená 0 alebo 1 krát, rovnako ako {0,1} . Napríklad „color?r“ sa zhoduje a farba, A farba.

Hviezda znamená 0, 1 alebo akékoľvek číslo raz ( {0,} ). Napríklad „go*gle“ sa zhoduje klbko, Google, google atď.

Plus znamená aspoň 1 raz ( {1,} ). Napríklad „go+gle“ sa zhoduje Google, google atď. (ale nie klbko).

Presná syntax týchto regulárnych výrazov závisí od implementácie. (teda v základné regulárne výrazy symbolov ( a )- unikol so spätnou lomkou)

Metaznaky, zjednodušene povedané, sú symboly, ktoré nezodpovedajú ich skutočnému významu, teda symbolu. (bodka) nie je bodka, ale akýkoľvek jeden znak atď. Zoznámte sa, prosím, s metaznakmi a ich významom:

. zodpovedá sám akýkoľvek symbol
[niečo] Vyhovujúce akýkoľvek jeden znak z tých, ktoré sú uvedené v zátvorkách. V tomto prípade: Znak „-“ sa interpretuje doslovne iba vtedy, ak sa nachádza bezprostredne za úvodnou alebo pred záverečnou zátvorkou: alebo [-abc]. V opačnom prípade označuje interval znakov, napríklad sa zhoduje s „a“, „b“ alebo „c“. zodpovedá malým písmenám latinskej abecedy. Tieto označenia je možné kombinovať: zhody a, b, c, q, r, s, t, u, v, w, x, y, z. Na zhodu so znakmi „[“ alebo „]“ stačí, uzatváracia zátvorka bola prvým znakom po úvodnom znaku: zhoduje sa s "]", "[", "a" alebo "b". Ak pred hodnotou v hranatých zátvorkách je znak ^, hodnota výrazu sa zhoduje jediný znak spomedzi tých ktoré nie sú v zátvorkách. Napríklad [^abc] zodpovedá akémukoľvek znaku okrem „a“, „b“ alebo „c“. [^a-z] zodpovedá akémukoľvek znaku okrem malých písmen v latinskej abecede.
^ Zhoduje sa so začiatkom textu (alebo so začiatkom akéhokoľvek riadku, ak je režim riadok po riadku).
$ Zhoduje sa s koncom textu (alebo s koncom ľubovoľného riadku, ak je režim riadok po riadku).
\(\) alebo () Deklaruje „označený podvýraz“ (skupinový výraz), ktorý možno použiť neskôr (pozrite si nasledujúci prvok: \ n). „Označený podvýraz“ je tiež „blok“. Na rozdiel od iných operátorov, tento (v tradičnej syntaxi) vyžaduje spätnú lomku, v rozšírených a Perl nie je potrebný znak \.
\n Kde n- toto je číslo od 1 do 9; zodpovedá n označený podvýraz (napríklad (abcd)\0, to znamená, že znaky abcd sú označené nulou). Tento dizajn je teoreticky nepravidelný, nebol akceptovaný v syntaxe rozšíreného regulárneho výrazu.
*
  • Hviezda po výraze, ktorý sa zhoduje s jedným znakom, sa zhoduje nula alebo viac kópie tento (predchádzajúci) výraz. Napríklad „*“ zodpovedá prázdnemu reťazcu „x“, „y“, „zx“, „zyx“ atď.
  • \n*, Kde n je číslica od 1 do 9, zodpovedá nule alebo viacerým výskytom n označený podvýraz. Napríklad "\(a.\)c\1*" zodpovedá "abcab" a "abcaba", ale nie "abcac".

Výraz uzavretý v „\(“ a „\)“, za ktorým nasleduje „*“, by sa mal považovať za nezákonný. V niektorých prípadoch sa zhoduje s nulovým alebo viacerými výskytmi reťazca, ktorý bol uvedený v zátvorkách. V iných sa zhoduje s výrazom uvedeným v zátvorkách so znakom „*“.

\{X,r\} Zodpovedá poslednému ( nadchádzajúce) vyskytujúce sa najmenej X a nič viac r raz. Napríklad „a\(3,5\)“ zodpovedá „aaa“, „aaaa“ alebo „aaaaa“. Na rozdiel od iných operátorov, tento (v tradičnej syntaxi) vyžaduje spätnú lomku.
.* Označenie ľubovoľného počtu ľubovoľných znakov medzi dvoma časťami regulárneho výrazu.

Metaznaky nám pomáhajú používať rôzne zhody. Ako však môžeme reprezentovať metaznak ako obyčajný znak, teda symbol [ (hratá zátvorka) s významom hranatej zátvorky? len:

  • musí predchádzať ( štít) metaznak (. * + \ ? ( )) spätná lomka. Napríklad \. alebo \[

Pre zjednodušenie definície niektorých znakových sád boli spojené do tzv. triedy a kategórie postáv. POSIX štandardizoval deklaráciu určitých tried a kategórií znakov, ako je uvedené v nasledujúcej tabuľke:

trieda POSIX podobne označenie
[:upper:] veľké písmená
[:nižšie:] malé písmená
[:alpha:] veľké a malé písmená
[:alnum:] čísla, veľké a malé písmená
[:digit:] čísla
[:xdigit:] hexadecimálne číslice
[:punct:] [.,!?:…] interpunkčné znamienka
[:blank:] [\t] medzera a TAB
[:medzera:] [\t\n\r\f\v] preskočiť znaky
[:cntrl:] riadiace znaky
[:graf:] [^\t\n\r\f\v] symboly pečatí
[:tlač:] [^\t\n\r\f\v] symboly pečatí a symboly preskočenia

V regulárnom výraze existuje niečo ako:

Regulárny výraz chamtivosti

Pokúsim sa to opísať čo najzrozumiteľnejšie. Povedzme, že chceme nájsť všetko HTML tagy v nejakom texte. Po lokalizácii problému chceme nájsť hodnoty obsiahnuté medzi nimi< и >, spolu s tými istými zátvorkami. Vieme však, že tagy majú rôzne dĺžky a samotných tagov je minimálne 50. Vymenovať ich všetky, uzavrieť ich do metasymbolov je príliš časovo náročná úloha. Ale vieme, že máme výraz.* (bodka hviezdička), ktorý charakterizuje ľubovoľný počet ľubovoľných znakov v riadku. Používaním daný výraz pokúsime sa nájsť v texte (

takže, Ako vytvoriť úroveň RAID 10/50 na radiči LSI MegaRAID (relevantné aj pre: Intel SRCU42x, Intel SRCS16):

) všetky hodnoty medzi nimi< и >. Výsledkom je, že CELÝ riadok bude zodpovedať tomuto výrazu. prečo, pretože regulárny výraz je GREEDY a snaží sa zachytiť VŠETKY VŠETKY znaky medzi nimi< и >, respektíve celý riadok, počnúc < p>Takže... a končí ...> bude patriť k tomuto pravidlu!

Dúfam, že tento príklad objasňuje, čo je chamtivosť. Ak sa chcete zbaviť tejto chamtivosti, môžete postupovať podľa nasledujúcej cesty:

  • brať do úvahy symboly nie zodpovedajúce požadovanému vzoru (napríklad:<[^>]*> pre vyššie uvedený prípad)
  • zbavte sa chamtivosti pridaním definície kvantifikátora ako nenásytného:
    • *? - ekvivalent "nie chamtivý" ("lenivý") *
    • +? - „nie chamtivý“ („lenivý“) ekvivalent +
    • (n,)? - „nie chamtivý“ („lenivý“) ekvivalent (n,)
    • .*? - ekvivalent „nie chamtivý“ („lenivý“).*

Chcel by som doplniť všetko vyššie uvedené rozšírená syntax regulárneho výrazu:

Regulárne výrazy v POSIX sú podobné tradičnej unixovej syntaxi, ale s pridaním niektorých metaznakov:

Plus to naznačuje predchádzajúce symbol alebo skupina sa môže opakovať jeden alebo viackrát. Na rozdiel od hviezdičky je potrebné aspoň jedno opakovanie.

Otáznik robí predchádzajúce symbol alebo skupina voliteľné. Inými slovami, v príslušnom riadku to môže byť neprítomný alebo prítomný hladké jeden raz.

Vertikálna lišta rozdeľuje alternatívne možnosti regulárne výrazy. Jeden znak určuje dve alternatívy, ale môže ich byť aj viac, stačí použiť viac zvislých čiar. Je dôležité si zapamätať, že tento operátor používa čo najviac výrazov. Z tohto dôvodu sa alternatívny operátor najčastejšie používa v zátvorkách.

Zrušilo sa aj používanie spätných lomítok: \(…\) sa stáva (…) a \(…\) sa stáva (…).

Na záver príspevku uvediem niekoľko príkladov použitia regulárneho výrazu:

$ mačka text1 1 jablko 2 hruška 3 banán $ grep p text1 1 jablko 2 hruška $ grep "pp*" text1 1 jablko 2 hruška $ mačka text1 | grep "l\|n" 1 jablko 3 banán $ echo -e "nájdi\n* tu" | grep "\*" * tu $ grep "pl\?.*r" text1 # p, na riadkoch, kde je r 2 hruška $ grep "a.." text1 # riadky s a, za ktorým nasledujú aspoň 2 znaky 1 jablko 3 banán $ grep "" text1 # hľadať riadky, ktoré obsahujú 3 alebo p 1 jablko 2 hruška 3 banán $ echo -e "nájdi\n* tu\nniekde." | grep "[.*]" * tu niekde..meno]$ echo -e "123\n456\n789\n0" | grep "" 123 456 789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # nahradiť a za A vo všetkých riadkoch, kde po a nasleduje a alebo po p prichádza p 1 jablko 2 hruška 3 BAnAnA *\./ POSLEDNÉ SLOVO./g" Najprv. POSLEDNÉ SLOVO. Toto je POSLEDNÉ SLOVO.

S pozdravom, McSim!

grep znamená „globálna tlačiareň regulárnych výrazov“. grep odreže čiary, z ktorých potrebujete textové súbory ktoré obsahujú text špecifikovaný používateľom.

grep je možné použiť dvoma spôsobmi - samostatne alebo v kombinácii s prúdmi.

grep má veľmi rozsiahlu funkčnosť vďaka veľkému počtu možností, ktoré podporuje, ako napríklad: vyhľadávanie pomocou vzoru reťazca alebo vzoru regulárneho výrazu RegExp alebo regulárnych výrazov založených na perle atď.

Kvôli svojej odlišnosti funkčnosť Nástroj grep má veľa možností vrátane egrep (rozšírený GREP), fgrep (pevný GREP), pgrep (proces GREP), rgrep (rekurzívny GREP) atď. Ale tieto možnosti majú menšie rozdiely od pôvodného grep.

možnosti grep

$ grep -V grep (GNU grep) 2.10 Copyright (C) 2011 Free Software Foundation, Inc. Licencia GPLv3+

Existujú modifikácie pomôcky grep: egrep (s rozšíreným spracovaním regulárnych výrazov), fgrep (ktorý zaobchádza so symbolmi $*^|()\ ako s literálmi, t. j. doslova), rgrep (so zapnutým rekurzívnym vyhľadávaním).

    egrep je to isté ako grep -E

    fgrep je to isté ako grep -F

    rgrep je to isté ako grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] obmedzený_regex_BRE [súbor ...]

Príkaz grep porovnáva riadky v zdrojových súboroch so vzorom určeným pomocou limited_regex. Ak nie sú zadané žiadne súbory, použije sa štandardný vstup. Každý úspešne spárovaný reťazec sa zvyčajne skopíruje na štandardný výstup; ak existuje niekoľko zdrojových súborov, názov súboru je uvedený pred nájdeným riadkom. grep používa kompaktný, nedeterministický algoritmus. Obmedzené regulárne výrazy (výrazy, ktoré majú reťazce znakov s ich významom a používajú obmedzenú množinu alfanumerických a špeciálnych znakov) sú vnímané ako šablóny. Majú rovnaký význam ako regulárne výrazy vo vyd.

Ak chcete uniknúť znakom $, *, , ^, |, () a \ z interpretácie shellu, je najjednoduchšie uzavrieť constrained_regex do jednoduchých úvodzoviek.

Možnosti:

B Pred každým riadkom uvedie číslo bloku, v ktorom bol nájdený. To môže byť užitočné pri vyhľadávaní blokov podľa kontextu (bloky sú číslované od 0). -c Vytlačí iba počet riadkov obsahujúcich vzor. -h Zabráni vytlačeniu názvu súboru obsahujúceho zhodný riadok pred samotným riadkom. Používa sa pri vyhľadávaní vo viacerých súboroch. -i Ignoruje veľkosť písmen pri porovnávaní. -l Vytlačí iba názvy súborov obsahujúcich zodpovedajúce reťazce, jeden na riadok. Ak sa vzor nájde na viacerých riadkoch súboru, názov súboru sa neopakuje. -n Vypíše pred každým riadkom jeho číslo v súbore (riadky sú číslované od 1). -s Potlačí správy o neexistujúcich alebo nečitateľných súboroch. -v Vytlačí všetky riadky okrem tých, ktoré obsahujú vzor. -w Vyhľadáva výraz ako slovo, ako keby bol obklopený metaznakmi \< и \>.

grep --pomoc

Použitie: grep [MOŽNOSŤ]... VZOR [SÚBOR]... Hľadá VZOR v každom SÚBORe alebo štandardnom vstupe. V predvolenom nastavení je PATTERN jednoduchý regulárny výraz (BRE). Príklad: grep -i "hello world" menu.h main.c Výber typu regulárneho výrazu a jeho interpretácia: -E, --extended-regexp VZOR - rozšírený regulárny výraz (ERE) -F, --fixed-regexp VZOR - reťazce s pevnou dĺžkou oddelené znakom nového riadku -G, --basic-regexp VZOR - jednoduchý regulárny výraz (BRE) -P, --perl-regexp VZOR - Regulárne výrazy Perl -e, --regexp=VZOR použiť VZOR na hľadať - f, --file=FILE prevziať VZOR zo SÚBORU -i, --ignore-case ignorovať rozdiel malých a veľkých písmen -w, --word-regexp VZOR sa musí zhodovať so všetkými slovami -x, --line-regexp VZOR sa musí zhodovať s celým riadkom -z, --riadky null-data sú oddelené nulovým bajtom a nie znakom na konci riadku Rôzne: -s, --no-messages potlačí chybové hlásenia -v, --revert-match vybrať nezhodné riadky -V, - - verzia vypíše informácie o verzii a skončí --help zobrazí túto pomoc a skončí --mmap for spätná kompatibilita, ignorované Riadenie výstupu: -m, --max-count=NUMBER stop po zadanom POČTE zhôd -b, --byte-offset vytlačí bajtový posun spolu s výstupnými riadkami -n, --line-number vypíše riadok číslo spolu s výstupnými riadkami --line-buffered vyprázdni vyrovnávaciu pamäť po každom riadku -H, --with-filename vypíše názov súboru pre každú zhodu -h, --no-filename nespustí výstup s názvom súboru -- label=LABEL použiť LABEL ako názov súboru pre štandardný vstup -o, --only-matching zobraziť iba časť riadku vyhovujúceho PATTERN -q, --quiet, --silent potlačiť všetok normálny výstup --binary-files=TYPE predpokladať že binárny súbor má TYP: binárny, textový alebo bez zhody. -a, --text to isté ako --binary-files=text -I to isté ako --binary-files=without-match -d, --directories=AKCIA ako zaobchádzať s adresármi AKCIA možno čítať ), rekurzívne (rekurzívne) alebo preskočiť (preskočiť). -D, --devices=AKCIA ako zaobchádzať so zariadeniami, FIFO a soketmi AKCIA sa dá prečítať alebo preskočiť -R, -r, --rekurzívne rovnako ako --directories=recurse --include=F_PATTERN spracuje iba súbory zodpovedajúce F_TEMPLATE - -exclude=F_ŠABLONA preskočiť súbory a adresáre zodpovedajúce F_ŠABLONE --exclude-from=FILE preskočiť súbory zodpovedajúce súborom šablón zo SÚBORU --exclude-dir=ŠABLONA adresáre zodpovedajúce VZORU budú preskočené -L, - -files-without-match print only Názvy SÚBOROV bez zhody -l, --súbory-s-zhodami vytlačiť iba názvy SÚBOROV so zhodami -c, --count vytlačiť iba počet zhodných riadkov na SÚBOR -T, --počiatočná karta zarovnania kariet (ak je to potrebné) - Z, --null tlač bajtu 0 za názvom SÚBORU Správa kontextu: -B, --before-context=NUM vypíše POČET riadkov predchádzajúceho kontextu -A, --after-context=NUM vypíše POČET riadkov nasledujúci kontext -C, --kontext[=ČÍSLO] vytlačí POČET riadkov kontextu -ČÍSLO je rovnaké ako --kontext=ČÍSLO --farba[=KEDY], --farba[=KEDY] použite značky na rozlíšenie zhody linky; KEDY môže byť vždy, nikdy alebo auto -U, --binárne neodstraňujte znaky CR na konci riadku (MSDOS) -u, --unix-byte-offsets zobrazuje posun, ako keby tam žiadne CR-s neboli (MSDOS ) Namiesto „egrep“ má spustiť „grep -E“. "grep -F" sa predpokladá namiesto "fgrep". Je lepšie nespúšťať ako „egrep“ alebo „fgrep“. Ak nie je zadaný FILE alebo ak je FILE -, načíta sa štandardný vstup. Ak sú zadané menej ako dva súbory, predpokladá sa -h. Ak sa nájde zhoda, ukončovací kód bude 0, ak nie, 1. Ak sa vyskytnú chyby alebo ak nie je zadaná voľba -q, ukončovací kód bude 2. Chyby nahláste na: Chyby v preklade nahláste na adresu: Domovská stránka GNU Grep: Pomoc pri práci s programami GNU: