GNU/Linux >> Znalost Linux >  >> Linux

Regulární výrazy v Grepu (regex)

grep je jedním z nejužitečnějších a nejvýkonnějších příkazů v Linuxu pro zpracování textu. grep hledá v jednom nebo více vstupních souborech řádky, které odpovídají regulárnímu výrazu, a zapisuje každý odpovídající řádek na standardní výstup.

V tomto článku prozkoumáme základy používání regulárních výrazů v GNU verzi grep , který je standardně dostupný ve většině operačních systémů Linux.

Regulární výraz Grep #

Regulární výraz nebo regulární výraz je vzor, ​​který odpovídá sadě řetězců. Vzor se skládá z operátorů, vytváří doslovné znaky a metaznaky, které mají zvláštní význam. GNU grep podporuje tři syntaxe regulárních výrazů, Basic, Extended a Perl-kompatibilní.

Ve své nejjednodušší podobě, kdy není uveden žádný typ regulárního výrazu, grep interpretovat vyhledávací vzory jako základní regulární výrazy. Chcete-li vzor interpretovat jako rozšířený regulární výraz, použijte -E (nebo --extended-regexp ).

V GNU implementaci grep není žádný funkční rozdíl mezi základní a rozšířenou syntaxí regulárních výrazů. Jediný rozdíl je v tom, že v základních regulárních výrazech jsou metaznaky ? , + , { , | , ( a ) jsou interpretovány jako doslovné znaky. Chcete-li zachovat zvláštní význam metaznaků při používání základních regulárních výrazů, musí být znaky ukončeny zpětným lomítkem (\ ). Význam těchto a dalších metaznaků vysvětlíme později.

Obecně byste měli regulární výraz vždy uzavřít do jednoduchých uvozovek, abyste se vyhnuli interpretaci a rozšíření metaznaků pomocí shellu.

Doslovné shody #

Nejzákladnější použití grep příkaz je vyhledat doslovný znak nebo řadu znaků v souboru. Chcete-li například zobrazit všechny řádky obsahující řetězec „bash“ v /etc/passwd soubor, spustíte následující příkaz:

grep bash /etc/passwd

Výstup by měl vypadat nějak takto:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

V tomto příkladu je řetězec „bash“ základní regulární výraz, který se skládá ze čtyř doslovných znaků. To říká grep k vyhledání řetězce, který má „b“ bezprostředně následované „a“, „s“ a „h“.

Ve výchozím nastavení grep příkaz rozlišuje velká a malá písmena. To znamená, že velká a malá písmena jsou považována za odlišná.

Chcete-li při vyhledávání ignorovat malá a velká písmena, použijte -i možnost (nebo --ignore-case ).

Je důležité si uvědomit, že grep hledá vzor hledání jako řetězec, nikoli slovo. Pokud jste tedy hledali „gnu“, grep vytiskne také řádky, kde je „gnu“ vloženo do větších slov, jako je „cygnus“ nebo „magnum“.

Pokud hledaný řetězec obsahuje mezery, musíte jej uzavřít do jednoduchých nebo dvojitých uvozovek:

grep "Gnome Display Manager" /etc/passwd

Ukotvení #

Kotvy jsou metaznaky, které vám umožňují určit, kde v řádku musí být nalezena shoda.

^ symbol (stříška) odpovídá prázdnému řetězci na začátku řádku. V následujícím příkladu bude řetězec „linux“ odpovídat pouze v případě, že se vyskytuje na samém začátku řádku.

grep '^linux' file.txt

$ symbol (dolar) odpovídá prázdnému řetězci na začátku řádku. Chcete-li najít řádek, který končí řetězcem „linux“, použijte:

grep 'linux$' file.txt

Můžete také vytvořit regulární výraz pomocí obou kotev. Chcete-li například najít řádky obsahující pouze „linux“, spusťte:

grep '^linux$' file.txt

Dalším užitečným příkladem je ^$ vzor, ​​který odpovídá všem prázdným řádkům.

Odpovídající jeden znak #

. symbol (tečka) je metaznak, který odpovídá libovolnému jednotlivému znaku. Chcete-li například porovnat vše, co začíná na „kan“, pak má dva znaky a končí řetězcem „roo“, použijete následující vzor:

grep 'kan..roo' file.txt

Výrazy v závorce #

Výrazy v hranatých závorkách umožňují shodu skupiny znaků tak, že je uzavřete do hranatých závorek [] . Například vyhledejte řádky, které obsahují „accept“ nebo „accent“, můžete použít následující výraz:

grep 'acce[np]t' file.txt

Pokud je první znak v závorce stříška ^ , pak odpovídá libovolnému jednotlivému znaku, který není uzavřen v závorkách. Následující vzor bude odpovídat jakékoli kombinaci řetězců začínajících na „co“ následované libovolným písmenem kromě „l“ následovaným „la“, jako je „coca“, „cobalt“ atd., ale nebude odpovídat řádkům obsahujícím „cola“. “:

grep 'co[^l]a' file.txt

Namísto umístění znaků jeden po druhém můžete zadat rozsah znaků uvnitř závorek. Výraz rozsahu je vytvořen zadáním prvního a posledního znaku rozsahu oddělených pomlčkou. Například [a-a] je ekvivalentní [abcde] a [1-3] je ekvivalentní [123] .

Následující výraz odpovídá každému řádku, který začíná velkým písmenem:

grep '^[A-Z]' file.txt

grep také podporují předdefinované třídy znaků, které jsou uzavřeny v závorkách. Následující tabulka ukazuje některé z nejběžnějších tříd znaků:

Kvantifikátor Třídy postav
[:alnum:] Alfanumerické znaky.
[:alpha:] Abecední znaky.
[:blank:] Mezerník a karta.
[:digit:] Číslice.
[:lower:] Malá písmena.
[:upper:] Velká písmena.

Úplný seznam všech tříd postav naleznete v příručce Grep.

Kvantifikátory #

Kvantifikátory umožňují určit počet výskytů položek, které musí být přítomny, aby došlo ke shodě. Následující tabulka ukazuje kvantifikátory podporované GNU grep :

Kvantifikátor Popis
* Odpovídající předchozí položce nula nebo vícekrát.
? Odpovídá předchozí položce nula nebo jednou.
+ Vyrovnejte předchozí položku jednou nebo vícekrát.
{n} Přesně odpovídá předchozí položce n krát.
{n,} Odpovídá předchozí položce alespoň n krát.
{,m} Odpovídá předchozí položce nejvýše m krát.
{n,m} Odpovídají předchozí položce z n na m krát.

* (hvězdička) odpovídá předchozí položce nula nebo vícekrát. Následující bude odpovídat „pravá“, „správná“ „ssright“ atd.:

grep 's*right'

Níže je pokročilejší vzor, ​​který odpovídá všem řádkům začínajícím velkým písmenem a končícím tečkou nebo čárkou. .* regulární výraz odpovídá libovolnému počtu libovolných znaků:

grep -E '^[A-Z].*[.,]$' file.txt

? (otazník) činí předchozí položku volitelnou a může se shodovat pouze jednou. Následující bude odpovídat „světlý“ i „pravý“. ? znak je ukončen zpětným lomítkem, protože používáme základní regulární výrazy:

grep 'b\?right' file.txt

Zde je stejný regulární výraz používající rozšířený regulární výraz:

grep -E 'b?right' file.txt

+ (plus) znak odpovídá předchozí položce jednou nebo vícekrát. Následující bude odpovídat „sright“ a „ssright“, ale nikoli „right“:

grep -E 's+right' file.txt

Složené závorky {} umožňuje zadat přesné číslo, horní nebo dolní hranici nebo rozsah výskytů, které musí nastat, aby došlo ke shodě.

Následující odpovídá všem celým číslům, která mají 3 až 9 číslic:

grep -E '[[:digit:]]{3,9}' file.txt

Alternativa č.

Termín střídání je jednoduché „NEBO“. Alternativní operátor | (pipe) umožňuje určit různé možné shody, které mohou být doslovné řetězce nebo sady výrazů. Tento operátor má nejnižší prioritu ze všech operátorů regulárních výrazů.

V níže uvedeném příkladu hledáme všechny výskyty slov fatal , error a critical v souboru logerror Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Pokud používáte rozšířený regulární výraz, pak operátor | by nemělo být escapováno, jak je uvedeno níže:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Skupina č.

Seskupování je funkce regulárních výrazů, která vám umožňuje seskupovat vzory dohromady a odkazovat na ně jako na jednu položku. Skupiny se vytvářejí pomocí závorek () .

Při použití základních regulárních výrazů musí být závorka ukončena zpětným lomítkem (\ ).

Následující příklad odpovídá slovům „nebojácný“ i „méně“. ? kvantifikátor vytváří (fear) skupina volitelné:

grep -E '(fear)?less' file.txt

Speciální zpětné lomítko #

GNU grep zahrnuje několik metaznaků, které se skládají ze zpětného lomítka následovaného běžným znakem. Následující tabulka ukazuje některé z nejběžnějších speciálních výrazů zpětného lomítka:

Výraz Popis
\b Přizpůsobte hranici slova.
\< Shodujte se s prázdným řetězcem na začátku slova.
\> Shodujte se s prázdným řetězcem na konci slova.
\w Shodujte se se slovem.
\s Přiřaďte mezeru.

Následující vzor bude odpovídat samostatným slovům „abject“ a „object“. Nebude se shodovat se slovy, pokud bude vložen do větších slov:

grep '\b[ao]bject\b' file.txt

Závěr č.

Regulární výrazy se používají v textových editorech, programovacích jazycích a nástrojích příkazového řádku, jako je grep , sed a awk . Vědět, jak konstruovat regulární výrazy, může být velmi užitečné při prohledávání textových souborů, psaní skriptů nebo filtrování výstupu příkazů.

Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.


Linux
  1. Regulární výrazy:Stahování všeho dohromady

  2. Regex a grep:Datový tok a stavební bloky

  3. Bash:Regulární výrazy v substituci?

  1. Začínáme s regulárními výrazy:Příklad

  2. Představení regulárních výrazů

  3. Co znamená \b ve vzoru grep?

  1. Potřebujete uniknout z regulárních znaků v Sed, aby byly interpretovány jako regulární znaky?

  2. Definice regulárního výrazu?

  3. Pokročilé regulární výrazy v příkazu Grep s 10 příklady – část II