Použití grep (a egrep) s regulárními výrazy

Using Grep With Regular Expressions



Tento tutoriál popisuje, jak používat obojí rukojeť (a egrep) t o najít text v souborech v jejich jednoduché formě a v kombinaci s regulárními výrazy. Obsahuje několik příklady a cvičení , více řešení , aby divák dokončil.

Název rukojeť pochází z příkazu ed (a vim) g/re/p, což znamená globálně vyhledat daný regulární výraz a vytisknout (zobrazit) výstup.







Pravidelný Výrazy

Nástroje umožňují uživateli vyhledávat v textových souborech řádky, které odpovídají regulárnímu výrazu ( regexp ). Regulární výraz je vyhledávací řetězec složený z textu a jednoho nebo více z 11 speciálních znaků. Jednoduchým příkladem je přiřazení začátku řádku.



Ukázkový soubor

Základní forma rukojeť lze použít k nalezení jednoduchého textu v konkrétním souboru nebo souborech. Chcete -li vyzkoušet příklady, nejprve vytvořte ukázkový soubor.



Pomocí editoru, jako je nano nebo vim, zkopírujte níže uvedený text do souboru s názvem můj soubor .





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

Ačkoli můžete zkopírovat a vložit příklady do textu (všimněte si, že dvojité uvozovky se nemusí kopírovat správně), příkazy je nutné zadat, abyste se je správně naučili.

Před vyzkoušením příkladů si prohlédněte ukázkový soubor:



$kočkamůj soubor

Jednoduché vyhledávání

Chcete -li v souboru najít text „xyz“, spusťte následující:

$rukojeťxyz myfile

Používání barev

K zobrazení barev použijte –color (dvojitou pomlčku) nebo jednoduše vytvořte alias. Například:

$rukojeť --barvaxyz myfile

nebo

$alias rukojeť= ‘rukojeť--barva'
$rukojeťxyz myfile

Možnosti

Běžné možnosti používané s rukojeť příkaz zahrnovat:

  • -Najdu všechny řádky nehledě na to případu
  • -C počet kolik řádků obsahuje text
  • -n řádek displeje čísla odpovídajících řádků
  • -l pouze zobrazení soubor jména ten zápas
  • -r rekurzivní vyhledávání podadresářů
  • -v najít všechny řádky NE obsahující text

Například:

$rukojeť -ixyz myfile# najděte text bez ohledu na případ

$rukojeť -icxyz myfile# počet řádků s textem

$rukojeť -vxyz myfile# zobrazit čísla řádků

Vytvořte více souborů

Než se pokusíte vyhledat více souborů, nejprve vytvořte několik nových souborů:

$vyhodilxyz>můj soubor1
$vyhodil -Axyz nxzz nXYZ>myfile2
$vyhodil -Axxx nyyy>můj soubor3
$kočkamůj soubor1
$kočkamyfile2
$kočkamůj soubor3

Hledat ve více souborech

Chcete -li vyhledávat ve více souborech pomocí názvů souborů nebo zástupných znaků, zadejte:

$rukojeť -icxyz myfile myfile1 myfile2 myfile3
$rukojeť -vxyz můj*
# shoduje se názvy souborů začínající na „moje“

Cvičení I

  1. Nejprve spočítejte, kolik řádků je v souboru /etc /passwd.
Tip: použijtetoaleta -ten /atd/passwd
  1. Nyní najděte všechny výskyty textu kde v souboru /etc /passwd .
  2. Zjistěte, kolik řádků v souboru obsahuje text
  3. Zjistěte, kolik řádků NEOBSAHUJE text kde .
  4. Najděte položku pro své přihlášení v /etc/passwd

Řešení cvičení najdete na konci tohoto článku.

Používání regulárních výrazů

Příkaz rukojeť lze také použít s regulárními výrazy použitím jednoho nebo více z jedenácti speciálních znaků nebo symbolů k upřesnění vyhledávání. Regulární výraz je řetězec znaků, který obsahuje speciální znaky, které umožňují shodu vzorů v nástrojích, jako je například rukojeť , přišel jsem a sed . Všimněte si, že řetězce mohou být nutné uzavřít do uvozovek.

Mezi dostupné speciální znaky patří:

^ Začátek řádku
$ Konec řádku
. Libovolný znak (kromě n nového řádku)
* 0 nebo více předchozího výrazu
Předcházející symbol z něj činí doslovný znak

Všimněte si, že *, který může být použit na příkazovém řádku tak, aby odpovídal libovolnému počtu znaků, včetně žádného, ​​je ne zde se používá stejným způsobem.

Všimněte si také použití uvozovek v následujících příkladech.

Příklady

Chcete -li najít všechny řádky začínající textem pomocí znaku ^:

$rukojeť‚^Xyz‘ myfile

Chcete -li najít všechny řádky končící textem pomocí znaku $:

$rukojeť‚Xyz $‘ myfile

Chcete -li najít řádky obsahující řetězec pomocí znaků ^ i $:

$rukojeť‚^Xyz $‘ myfile

K vyhledání řádků pomocí . odpovídat libovolnému znaku:

$rukojeť‚^X.z‘ myfile

Chcete -li najít řádky pomocí * pro shodu 0 nebo více předchozího výrazu:

$rukojeť„^Xy*z’ myfile

Chcete -li najít řádky pomocí.* Tak, aby odpovídaly 0 nebo více znakům:

$rukojeť„^ X.*z’ myfile

K vyhledání řádků pomocí uniknout znaku *:

$rukojeť„^ X *z’ myfile

Chcete -li najít znak , použijte:

$rukojeť'\' myfile

Výraz grep - egrep

The rukojeť příkaz podporuje pouze podmnožinu regulárních výrazů, které jsou k dispozici. Nicméně příkaz egrep:

  • umožňuje plné využití všech regulárních výrazů
  • může současně vyhledávat více než jeden výraz

Všimněte si, že výrazy musí být uzavřeny do dvojice uvozovek.

Chcete -li použít barvy, použijte –color nebo znovu vytvořte alias:

$alias egrep='egrep --color'

Chcete -li vyhledat více než jednu regex the egrep příkaz může být zapsán na více řádků. To však lze provést také pomocí těchto speciálních znaků:

| Střídání, buď jedno, nebo druhé
(…) Logické seskupení části výrazu
$egrep '(^root |^uucp |^mail)' /atd/passwd

To extrahuje řádky začínající kořenem, uucp nebo poštou ze souboru | symbol znamenající některou z možností.

Následující příkaz bude ne práce, přestože se nezobrazuje žádná zpráva, protože základní rukojeť příkaz nepodporuje všechny regulární výrazy:

$rukojeť '(^root |^uucp |^mail)' /atd/passwd

Na většině systémů Linux však příkaz grep -E je stejné jako použití egrep :

$rukojeť -A '(^root |^uucp |^mail)' /atd/passwd

Pomocí filtrů

Potrubí je proces odesílání výstupu jednoho příkazu jako vstupu do jiného příkazu a je jedním z nejvýkonnějších dostupných nástrojů Linuxu.

Příkazy, které se objevují v kanálu, jsou často označovány jako filtry, protože v mnoha případech procházejí nebo upravují vstup, který jim byl před odesláním upraveného proudu odeslán na standardní výstup.

V následujícím příkladu standardní výstup z ls -l je předán jako standardní vstup do rukojeť příkaz. Výstup z rukojeť příkaz je poté předán jako vstup do souboru více příkaz.

Zobrazí se pouze adresáře v /atd :

$ls -ten /atd|rukojeť'^D'|více

Následující příkazy jsou příklady použití filtrů:

$ps -ef|rukojeťcron

$SZO|rukojeťkdm

Ukázkový soubor

Abyste si mohli vyzkoušet revizi, nejprve vytvořte následující ukázkový soubor.

Pomocí editoru, jako je nano nebo vim, zkopírujte níže uvedený text do souboru s názvem lidé:

Osobní J. Smith 25 000
Osobní E.Smith 25400
Školení A. Brown 27500
Školení C.Browen 23400
(Správce) R.Bron 30500
Goodsout T.Smyth 30 000
Osobní F. Jones 25 000
školení* C. Evan 25500
Goodsout W. Pope 30400
Přízemí T.Smythe 30500
Zaměstnanci J. Maler 33000

Cvičení II

  1. Zobrazit soubor lidé a prozkoumejte jeho obsah.
  2. Najděte všechny řádky obsahující řetězec Kovář v souboru people.Hint: použijte příkaz grep, ale pamatujte, že ve výchozím nastavení rozlišují velká a malá písmena.
  3. Vytvořte nový soubor npeople obsahující všechny řádky začínající řetězcem Osobní v souboru lidí. Tip: použijte příkaz grep s>.
  4. Potvrďte obsah souboru npeople vypsáním souboru.
  5. Nyní připojte všechny řádky, kde text končí řetězcem 500 v souboru people to the file npeople. Tip: použijte příkaz grep s >>.
  6. Znovu potvrďte obsah souboru npeople uvedením souboru.
  7. Najděte IP adresu serveru, který je uložen v souboru /etc/hosts .Tip: použijte příkaz grep s $ (název hostitele)
  8. Použití egrep extrahovat z /etc/passwd řádky souborového účtu obsahující lp nebo vlastní uživatelské ID .

Řešení cvičení najdete na konci tohoto článku.

Více regulárních výrazů

Regulární výraz lze považovat za zástupné znaky steroidů.

Existuje jedenáct znaků se zvláštními významy: otevírací a zavírací hranaté závorky [], zpětné lomítko , stříška ^, znak dolaru $, tečka nebo tečka, svislý pruh nebo symbol potrubí |, otazník?, hvězdička nebo hvězdička *, znaménko plus + a otevírací a zavírací kulatá závorka {}. Tyto speciální znaky se také často nazývají metaznaky.

Zde je kompletní sada speciálních znaků:

^ Začátek řádku
$ Konec řádku
. Libovolný znak (kromě n nového řádku)
* 0 nebo více předchozího výrazu
| Střídání, buď jedno, nebo druhé
[…] Explicitní sada odpovídajících znaků
+ 1 nebo více z předchozího výrazu
? 0 nebo 1 předchozího výrazu
Předcházející symbol z něj činí doslovný znak
{…} Explicitní zápis kvantifikátoru
(…) Logické seskupení části výrazu

Výchozí verze rukojeť má pouze omezenou podporu regulárních výrazů. Aby všechny následující příklady fungovaly, použijte egrep místo nebo grep -E .

K vyhledání řádků pomocí | aby odpovídal jakémukoli výrazu:

$egrep‘Xxz|xzz ‘myfile

K vyhledání řádků pomocí | pro shodu buď výrazu v řetězci také použijte ():

$egrep„^ X(Yz|yz)‘Můj soubor

Chcete -li najít řádky pomocí [], aby odpovídaly libovolnému znaku:

$egrep„^ X[Ano]z’ myfile

Chcete -li najít řádky pomocí [], které NEodpovídají žádnému znaku:

$egrep„^ X[^ Ano]z’ myfile

Chcete -li najít řádky pomocí * pro shodu 0 nebo více předchozího výrazu:

$egrep„^Xy*z’ myfile

Chcete -li najít řádky pomocí +, aby odpovídaly 1 nebo více předchozímu výrazu:

$egrepMůj soubor „^xy+z“

Chcete -li najít řádky pomocí? aby odpovídalo 0 nebo 1 předchozího výrazu:

$egrep‚^Xy? Z‘ myfile

Cvičení III

  1. Najděte všechny řádky obsahující jména Evans nebo malíř v souboru lidí.
  2. Najděte všechny řádky obsahující jména Smith, Smyth nebo Smythe v souboru lidí.
  3. Najděte všechny řádky obsahující jména Brown, Browen nebo Zdroj v souboru people.If you have time:
  4. Najděte řádek obsahující řetězec (admin), včetně závorek v souboru lidí.
  5. Najděte v souboru lidí řádek obsahující znak *.
  6. Zkombinujte 5 a 6 výše, abyste našli oba výrazy.

Další příklady

K vyhledání řádků pomocí . a * aby odpovídaly libovolné sadě znaků:

$egrep„^Xy.*z’ myfile

Chcete -li najít řádky pomocí {}, které odpovídají počtu N znaků:

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

Chcete -li najít řádky pomocí {} tak, aby odpovídaly N nebo vícekrát:

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

Chcete -li najít řádky pomocí {} tak, aby odpovídaly N krát, ale ne více než M krát:

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

Závěr

V tomto tutoriálu jsme se nejprve podívali na používání rukojeť v jednoduché formě najdete text v souboru nebo ve více souborech. Hledaný text jsme poté spojili s jednoduchými regulárními výrazy a poté pomocí složitějších egrep .

Další kroky

Doufám, že zde získané znalosti dobře využijete. Vyzkoušet rukojeť příkazy na vašich vlastních datech a pamatujte, regulární výrazy, jak jsou zde popsány, lze použít ve stejné formě v my , sed a awk !

Cvičení řešení

Cvičení I

Nejprve spočítejte, kolik řádků je v souboru /etc/passwd .
$ wc -l /etc/passwd
Nyní najděte všechny výskyty textu kde v souboru /etc /passwd.
$ grep var /etc/passwd
Zjistěte, kolik řádků v souboru obsahuje text kde

rukojeť -Ckde/atd/passwd

Zjistěte, kolik řádků NEOBSAHUJE text kde .

rukojeť -životopiskde/atd/passwd

Najděte položku pro své přihlášení v /etc/passwd soubor
grep kdm /etc/passwd

Cvičení II

Zobrazit soubor lidé a prozkoumejte jeho obsah.
$ cat people
Najděte všechny řádky obsahující řetězec Kovář v souboru lidé .
$ grep 'Smith' people
Vytvořte nový soubor, n lidí , obsahující všechny řádky začínající řetězcem Osobní v lidé soubor
$ grep '^Personal' people> npeople
Potvrďte obsah souboru n lidí vypsáním souboru.
$ cat npeople
Nyní připojte všechny řádky, kde text končí řetězcem 500 v souboru lidé do souboru n lidí .
$ grep '500$' people>>npeople
Znovu potvrďte obsah souboru n lidí vypsáním souboru.
$ cat npeople
Najděte IP adresu serveru, který je uložen v souboru /etc/hosts .
$ grep $(hostname) /etc/hosts
Použití egrep extrahovat z /etc/passwd řádky souborového účtu obsahující lp nebo vaše vlastní uživatelské ID.
$ egrep '(lp|kdm:)' /etc/passwd

Cvičení III

Najděte všechny řádky obsahující jména Evans nebo malíř v souboru lidé .
$ egrep 'Evans|Maler' people
Najděte všechny řádky obsahující jména Kovář , Smyth nebo Smythe v souboru lidé .
$ egrep 'Sm(i|y)the?' people
Najděte všechny řádky obsahující jména Hnědý , Prohlížet nebo Zdroj v souboru lidí.
$ egrep 'Brow?e?n' people
Najděte řádek obsahující řetězec (admin), včetně závorek v souboru lidé .

$egrep ' (Admin )'lidé

Najděte řádek obsahující znak * v souboru lidí.
$ egrep '*' people
Zkombinujte 5 a 6 výše, abyste našli oba výrazy.

$egrep ' (Admin ) | *'lidé