Použitie grep (a egrep) s regulárnymi výrazmi

Using Grep With Regular Expressions



Tento tutoriál popisuje, ako používať oboje uchopenie (a egrep) t o nachádzať text v súboroch v jednoduchej forme a v kombinácii s regulárnymi výrazmi. Obsahuje ich niekoľko príklady a cvičenia , viac riešenia , aby divák dokončil.

Názov uchopenie pochádza z príkazu ed (a vim) g/re/p, čo znamená globálne vyhľadať daný regulárny výraz a vytlačiť (zobraziť) výstup.







Pravidelné Výrazy

Tieto obslužné programy umožňujú používateľovi vyhľadávať v textových súboroch riadky, ktoré sa zhodujú s regulárnym výrazom ( regexp ). Regulárny výraz je vyhľadávací reťazec pozostávajúci z textu a jedného alebo viacerých z 11 špeciálnych znakov. Jednoduchým príkladom je porovnanie začiatku riadka.



Ukážkový súbor

Základná forma uchopenie môžu byť použité na nájdenie jednoduchého textu v konkrétnom súbore alebo súboroch. Ak si chcete vyskúšať príklady, najskôr vytvorte vzorový súbor.



Pomocou editora, ako je nano alebo vim, skopírujte text nižšie do súboru s názvom môj súbor .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Napriek tomu, že príklady môžete skopírovať a prilepiť do textu (uvedomte si, že dvojité úvodzovky sa nemusia skopírovať správne), na ich správne naučenie je potrebné napísať príkazy.

Pred vyskúšaním príkladov si pozrite vzorový súbor:



$katmôj súbor

Jednoduché vyhľadávanie

Ak chcete v súbore nájsť text „xyz“, spustite nasledujúce:

$uchopeniexyz môj súbor

Použitie farieb

Na zobrazenie farieb použite –color (dvojitý spojovník) alebo jednoducho vytvorte alias. Napríklad:

$uchopenie -farbaxyz môj súbor

alebo

$prezývka uchopenie= 'uchopenie-farba '
$uchopeniexyz môj súbor

možnosti

Bežné možnosti používané s uchopenie príkaz zahrnúť:

  • -Nájdem všetky riadky bez ohľadu na to prípadu
  • -c počítať koľko riadkov obsahuje text
  • -n riadok displeja čísla zhodných riadkov
  • -l iba zobrazenie súbor mená ten zápas
  • -r rekurzívny vyhľadávanie podadresárov
  • -v nájsť všetky riadky NIE obsahujúci text

Napríklad:

$uchopenie -ixyz môj súbor# vyhľadajte text bez ohľadu na prípad

$uchopenie -icxyz môj súbor# počet riadkov s textom

$uchopenie -vxyz môj súbor# zobraziť čísla riadkov

Vytvorte viac súborov

Predtým, ako sa pokúsite vyhľadať vo viacerých súboroch, najskôr vytvorte niekoľko nových súborov:

$zahodilxyz>môj súbor1
$zahodil -Axyz nxzz nXYZ>môj súbor2
$zahodil -Axxx nyyy>môj súbor3
$katmôj súbor1
$katmôj súbor2
$katmôj súbor3

Hľadať vo viacerých súboroch

Ak chcete vyhľadávať vo viacerých súboroch pomocou názvov súborov alebo zástupných znakov, zadajte:

$uchopenie -icxyz myfile myfile1 myfile2 myfile3
$uchopenie -vxyz môj*
# názvy súborov sa začínajú na „moje“

Cvičenie I

  1. Najprv spočítajte, koľko riadkov je v súbore /etc /passwd.
Tip: použitewc -ten /atď/passwd
  1. Teraz nájdite všetky výskyty textu kde v súbore /etc /passwd .
  2. Zistite, koľko riadkov v súbore obsahuje text
  3. Zistite, koľko riadkov NEOBSAHUJE text kde .
  4. Nájdite záznam pre svoje prihlásenie v /etc/passwd

Riešenia cvičení nájdete na konci tohto článku.

Používanie regulárnych výrazov

Príkaz uchopenie možno tiež použiť s regulárnymi výrazmi pomocou jedného alebo viacerých z jedenástich špeciálnych znakov alebo symbolov na spresnenie vyhľadávania. Regulárny výraz je reťazec znakov, ktorý obsahuje špeciálne znaky, ktoré umožňujú zhody vzorov v rámci obslužných programov, akými sú napr uchopenie , Prišiel som a sed . Všimnite si, že reťazce môže byť potrebné uzavrieť do úvodzoviek.

K dostupným špeciálnym znakom patrí:

^ Začiatok riadku
$ Koniec riadku
. Akýkoľvek znak (okrem n nového riadku)
* 0 alebo viac predchádzajúceho výrazu
Predchádzajúce symbol z neho robí doslovný znak

Všimnite si toho, že *, ktorý sa môže použiť na príkazovom riadku na priradenie ľubovoľného počtu znakov vrátane žiadneho, je nie tu sa používa rovnako.

Všimnite si tiež použitia úvodzoviek v nasledujúcich príkladoch.

Príklady

Ak chcete nájsť všetky riadky začínajúce textom pomocou znaku ^:

$uchopenieMôj súbor „^xyz“

Ak chcete nájsť všetky riadky končiace textom pomocou znaku $:

$uchopenieMôj súbor „xyz $“

Ak chcete nájsť riadky obsahujúce reťazec pomocou znakov ^ aj $:

$uchopenieMôj súbor „^xyz $“

Na vyhľadanie riadkov pomocou . zodpovedať ľubovoľnému znaku:

$uchopenieMôj súbor „^x.z“

Ak chcete nájsť riadky pomocou *, ktoré sa zhodujú s 0 alebo viacerými z predchádzajúceho výrazu:

$uchopenie„^Xy*z 'myfile

Ak chcete nájsť riadky pomocou.* Na zhodenie 0 alebo viacerých znakov:

$uchopenie„^ X.*z 'myfile

Na vyhľadanie riadkov pomocou uniknúť znaku *:

$uchopenie„^ X *z 'myfile

Na nájdenie znak použite:

$uchopenie„\“ môj súbor

Výraz grep - egrep

The uchopenie príkaz podporuje iba podmnožinu dostupných regulárnych výrazov. Avšak príkaz egrep:

  • umožňuje úplné využitie všetkých regulárnych výrazov
  • môže súčasne vyhľadávať viac ako jeden výraz

Uvedomte si, že výrazy musia byť uzavreté do dvojice úvodzoviek.

Ak chcete použiť farby, použite –color alebo znova vytvorte alias:

$prezývka egrep='egrep --color'

Ak chcete vyhľadať viac ako jednu regulárny výraz the egrep príkaz môže byť napísaný na viacerých riadkoch. To sa však dá urobiť aj pomocou týchto špeciálnych znakov:

| Striedanie, jedno alebo druhé
(…) Logické zoskupenie časti výrazu
$egrep '(^root |^uucp |^mail)' /atď/passwd

Zo súboru,. | Sa extrahujú riadky, ktoré začínajú koreňom, uucp alebo poštou symbol znamenajúci jednu z možností.

Nasledujúci príkaz bude nie pracovať, aj keď sa nezobrazuje žiadna správa, pretože základ uchopenie príkaz nepodporuje všetky regulárne výrazy:

$uchopenie '(^root |^uucp |^mail)' /atď/passwd

Vo väčšine systémov Linux však príkaz grep -E je to isté ako používanie egrep :

$uchopenie -A '(^root |^uucp |^mail)' /atď/passwd

Použitie filtrov

Potrubie je proces odosielania výstupu jedného príkazu ako vstupu do iného príkazu a je jedným z najvýkonnejších dostupných nástrojov Linuxu.

Príkazy, ktoré sa zobrazujú v potrubí, sa často označujú ako filtre, pretože v mnohých prípadoch prechádzajú alebo upravujú vstup, ktorý im bol odoslaný, pred odoslaním upraveného toku na štandardný výstup.

V nasledujúcom príklade štandardný výstup z ls -l sa odovzdáva ako štandardný vstup do súboru uchopenie príkaz. Výstup z uchopenie príkaz je potom odovzdaný ako vstup do súboru viac príkaz.

Zobrazí sa iba adresár vo formáte /atď :

$ls -ten /atď|uchopenie„^D“|viac

Nasledujúce príkazy sú príkladmi použitia filtrov:

$ps -ef|uchopeniecron

$SZO|uchopeniekdm

Ukážkový súbor

Ak si chcete vyskúšať kontrolu, najskôr vytvorte nasledujúci ukážkový súbor.

Pomocou editora, ako je nano alebo vim, skopírujte text nižšie do súboru s názvom ľudia:

Osobný J. Smith 25 000
Osobný E.Smith 25400
Školenie A. Brown 27500
Školenie C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30 000
Osobný F. Jones 25 000
školenie* C.Evans 25500
Goodsout W. Pope 30400
Prízemie T.Smythe 30500
Štáb J. Maler 33000

Cvičenie II

  1. Zobraziť súbor ľudí a preskúmať jeho obsah.
  2. Nájdite všetky riadky obsahujúce reťazec Smith v súbore people.Hint: použite príkaz grep, ale pamätajte, že v predvolenom nastavení rozlišujú veľké a malé písmená.
  3. Vytvorte nový súbor npeople obsahujúci všetky riadky začínajúce reťazcom Osobné v súbore ľudí. Tip: použite príkaz grep s>.
  4. Potvrďte obsah súboru npeople uvedením súboru.
  5. Teraz pripojte všetky riadky, kde text končí reťazcom 500 v súbore ľudia do súboru npeople.Rada: použite príkaz grep s >>.
  6. Opäť potvrďte obsah súboru npeople uvedením súboru.
  7. Nájdite IP adresu servera, ktorý je uložený v súbore /etc/hosts .Rada: použite príkaz grep s $ (názov hostiteľa)
  8. Použite egrep extrahovať z /etc/passwd riadky súborového účtu obsahujúce lp alebo svoje vlastné ID používateľa .

Riešenia cvičení nájdete na konci tohto článku.

Viac regulárnych výrazov

Regulárny výraz je možné považovať za zástupné znaky steroidov.

Existuje jedenásť znakov so špeciálnym významom: otváracia a zatváracia hranatá zátvorka [], spätné lomítko , pomlčka ^, znak dolára $, bodka alebo bodka, symbol zvislej čiary alebo fajky |, otáznik?, hviezdička alebo hviezdička *, znamienko plus + a otváracia a zatváracia okrúhla zátvorka {}. Tieto špeciálne znaky sa tiež často nazývajú metaznaky.

Tu je kompletná sada špeciálnych znakov:

^ Začiatok riadku
$ Koniec riadku
. Akýkoľvek znak (okrem n nového riadku)
* 0 alebo viac predchádzajúceho výrazu
| Striedanie, jedno alebo druhé
[…] Explicitná sada znakov, ktoré sa majú zhodovať
+ 1 alebo viac z predchádzajúceho výrazu
? 0 alebo 1 predchádzajúceho výrazu
Predchádzajúce symbol z neho robí doslovný znak
{…} Explicitný zápis kvantifikátora
(…) Logické zoskupenie časti výrazu

Predvolená verzia uchopenie má iba obmedzenú podporu regulárnych výrazov. Aby všetky nasledujúce príklady fungovali, použite egrep namiesto alebo grep -E .

Na vyhľadanie riadkov pomocou | zodpovedať ktorémukoľvek výrazu:

$egrep„Xxz|xzz ‘môj súbor

Na vyhľadanie riadkov pomocou | na priradenie ktoréhokoľvek výrazu v reťazci tiež použite ():

$egrep„^ X(Yz|yz)‘Môj súbor

Ak chcete nájsť riadky pomocou [] na priradenie ľubovoľného znaku:

$egrep„^ X[Áno]z 'myfile

Ak chcete nájsť riadky pomocou [], ktoré NEDÁ zodpovedať žiadnemu znaku:

$egrep„^ X[^ Áno]z 'myfile

Ak chcete nájsť riadky pomocou *, ktoré sa zhodujú s 0 alebo viacerými z predchádzajúceho výrazu:

$egrep„^Xy*z 'myfile

Ak chcete nájsť riadky pomocou znamienka +, aby zodpovedalo 1 alebo viacerým predchádzajúcim výrazom:

$egrepMôj súbor „^xy+z“

Na vyhľadanie riadkov pomocou? aby zodpovedal 0 alebo 1 predchádzajúceho výrazu:

$egrepMôj súbor „^xy? Z“

Cvičenie III

  1. Nájdite všetky riadky obsahujúce mená Evans alebo maliar v súbore ľudia.
  2. Nájdite všetky riadky obsahujúce mená Smith, Smyth alebo Smythe v súbore ľudia.
  3. Nájdite všetky riadky obsahujúce mená Brown, Browen alebo Zdroj v súbore ľudia. Ak máte čas:
  4. Nájdite riadok obsahujúci reťazec (admin), vrátane zátvoriek, v súbore ľudia.
  5. Nájdite v súbore ľudia riadok obsahujúci znak *.
  6. Skombinujte 5 a 6 vyššie a nájdite oba výrazy.

Viac príkladov

Na vyhľadanie riadkov pomocou . a * aby zodpovedali ľubovoľnej množine znakov:

$egrep„^Xy.*z 'myfile

Ak chcete nájsť riadky pomocou znaku {} zodpovedajúceho počtu N znakov:

$egrep„^Xy{3}z 'myfile
$egrep„^Xy{4}z 'myfile

Ak chcete nájsť riadky pomocou {} na priradenie N alebo viackrát:

$egrep„^Xy{3,}z 'myfile

Ak chcete nájsť riadky pomocou {} tak, aby zodpovedali N -krát, ale nie viac ako M -krát:

$egrep„^Xy{2,3}z 'myfile

Záver

V tomto návode sme sa najskôr pozreli na používanie uchopenie v jednoduchej forme nájdete text v súbore alebo vo viacerých súboroch. Hľadaný text sme potom skombinovali s jednoduchými regulárnymi výrazmi a potom pomocou zložitejších egrep .

Ďalšie kroky

Dúfam, že tu získané znalosti dobre využijete. Vyskúšaj uchopenie príkazy na vlastných údajoch a pamätajte, že regulárne výrazy, ako sú tu popísané, je možné použiť v rovnakej forme aj v my , sed a awk !

Cvičebné riešenia

Cvičenie I

Najprv spočítajte, koľko riadkov je v súbore /etc/passwd .
$ wc -l /etc/passwd
Teraz nájdite všetky výskyty textu kde v súbore /etc /passwd.
$ grep var /etc/passwd
Zistite, koľko riadkov v súbore obsahuje text kde

uchopenie -ckde/atď/passwd

Zistite, koľko riadkov NEOBSAHUJE text kde .

uchopenie -životopiskde/atď/passwd

Nájdite záznam pre svoje prihlásenie v /etc/passwd súbor
grep kdm /etc/passwd

Cvičenie II

Zobraziť súbor ľudí a preskúmať jeho obsah.
$ cat people
Nájdite všetky riadky obsahujúce reťazec Smith v súbore ľudí .
$ grep 'Smith' people
Vytvorte nový súbor, ľudia , obsahujúci všetky riadky začínajúce reťazcom Osobné v ľudí súbor
$ grep '^Personal' people> npeople
Potvrďte obsah súboru ľudia vypisovaním súboru.
$ cat npeople
Teraz pripojte všetky riadky, kde text končí reťazcom 500 v súbore ľudí do súboru ľudia .
$ grep '500$' people>>npeople
Opäť potvrďte obsah súboru ľudia vypisovaním súboru.
$ cat npeople
Nájdite IP adresu servera, ktorý je uložený v súbore /etc/hosts .
$ grep $(hostname) /etc/hosts
Použite egrep extrahovať z /etc/passwd riadky súborového účtu obsahujúce lp alebo vaše vlastné užívateľské ID.
$ egrep '(lp|kdm:)' /etc/passwd

Cvičenie III

Nájdite všetky riadky obsahujúce mená Evans alebo maliar v súbore ľudí .
$ egrep 'Evans|Maler' people
Nájdite všetky riadky obsahujúce mená Smith , Smyth alebo Smythe v súbore ľudí .
$ egrep 'Sm(i|y)the?' people
Nájdite všetky riadky obsahujúce mená Hnedá , Browen alebo Zdroj v súbore ľudia.
$ egrep 'Brow?e?n' people
Nájdite riadok obsahujúci reťazec (admin), vrátane zátvoriek v súbore ľudí .

$egrep ' (Admin )'ľudí

Nájdite riadok obsahujúci znak * v súbore ľudia.
$ egrep '*' people
Skombinujte 5 a 6 vyššie a nájdite oba výrazy.

$egrep ' (Admin ) | *'ľudí