close

Grep

Přejít na navigaci Přejít na hledání

V informatice je grep ( obecné pravidlo a xpression print ) příkaz unixových a unixových systémů a obecněji systémů POSIX [ 1] a GNU [2] , který vyhledává v jednom nebo více textových souborech . řádky, které odpovídají jednomu nebo více zadaným vzorům s regulárními výrazy nebo doslovnými řetězci , a vytvoří seznam řádků (nebo dokonce jen názvů souborů), které byly nalezeny. Je to typ filtru .

grep se běžně používá k vyhledávání výskytů jednoho nebo více slov v sérii souborů, často ve spojení s příkazy find a xargs prostřednictvím softwarového kanálu .

grep lze obecně použít také s binárními soubory , například k hledání přítomnosti konkrétních značek Exif v souborech obsahujících digitální obrázky . Konkrétně GNU verze grep v tomto případě uvádí názvy souborů obsahujících uvedený řetězec nebo regulární výraz (a ne také odpovídající textovou část, jak je tomu normálně u textových souborů).

Použití

Obecná syntaxe grep je:

grep [ možnosti ] [-e] model1 [-e model2 ...] [-] [ soubor1 [ soubor2 ...]]

Volitelné parametry souboru udávají názvy souborů, které mají být prohledávány. Pokud není zadáno, vyhledávání se provádí na datech načtených ze standardního vstupu . Zadáním více než jednoho parametru souboru předchází každému řádku, pro který byla nalezena shoda, název souboru, který jej obsahuje, a jeho číslo řádku; v případě jediného parametru souboru (nebo žádného) je uveden pouze obsah samotného řádku.

Parametry šablony určují kritéria vyhledávání a výchozí chování je, že se jedná o regulární výrazy . Čára se shoduje, pokud vyhovuje alespoň jednomu ze vzorů.

Dvojitá pomlčka --(volitelné) znamená, že následující parametry nelze považovat za možnosti.

Mezi hlavní možnosti patří:

-i
Ignorujte rozdíly mezi velkými a malými písmeny.
-n
Před každý řádek výsledků uveďte číslo řádku v souboru (začínající 1).
-l
Označuje pouze názvy souborů, ve kterých byla nalezena alespoň jedna shoda (každý soubor je uveden pouze jednou, bez ohledu na počet nalezených shod).
-v
Neguje zadané vzory a vytváří seznam řádků, které nevyhovují žádnému vzoru.
-E
Vzory jsou spíše rozšířené regulární výrazy než základní regulární výrazy.
-F
Vzory jsou řetězce , které je třeba hledat doslova.
-c
Pro každý soubor vytvoří pouze počet odpovídajících řádků.

GNU verze grep (dostupná například na systémech GNU/Linux ) také mimo jiné podporuje následující možnosti:

-numero
Každý řádek, pro který byla nalezena shoda, je uveden spolu se zadaným počtem řádků sousedících s ním (pro poskytnutí kontextu). Každý řádek je uveden pouze jednou, takže i když jsou v sousedních řádcích shody, nebudou se opakovat.
-A numero
Následuje každý řádek, pro který byla nalezena shoda, o zadaný počet řádků, které za ním následují ("A" znamená za - za).
-B numero
Před každý řádek, pro který byla nalezena shoda, uveďte zadaný počet řádků předcházejících ("B" znamená před - před).

Varianty

Existují také historicky varianty grep nazývané egrep a fgrep , které interpretují vzory jako rozšířené regulární výrazy a doslovné řetězce.

Použití možností -Ea -Fje ekvivalentní použití těchto variant.

Původ jména grep

Název programu se odvozuje od příkazu g/re/ptextového editoru a plní podobnou funkci, tedy globálně (tj. v celém souboru a ne na jednom řádku) vyhledat regulární výraz ( r egular a xpression ) a zobrazit ( tisknout ) shoduje se .

Body pozornosti

Ukotvěte text, který chcete vyhledat

Regulární výraz, který nemá žádné kotvy, může najít shodu kdekoli na řádku, a tedy i uprostřed slova. To může být zdrojem neočekávaných výsledků, pokud to, co jste hledali, bylo ve skutečnosti celé slovo. Například regulární výraz „10“ odpovídá také výrazu „100“, „101“, „320103“ a tak dále.

Řešení s GNU grep

GNU verze grep má kromě kotev na začátku a konci řádku také podporu pro konkrétní metaznaky , které představují začátek a/nebo konec libovolného slova, a lze je použít k ukotvení zbytku běžného výraz . Konkrétně sekvence \<odpovídá počátečnímu bodu slova, \>bodu, kde slovo končí, a \bpočátečnímu nebo koncovému bodu slova. Regulární výraz se například \<10\>shoduje pouze v řádcích, které obsahují „10“ jako samostatné, vizuálně izolované slovo, a nikoli „100“ nebo „210“.

Řešení regulárních výrazů POSIX

Kotvy poskytované standardem POSIX jsou pouze ty, které představují začátek a konec řádku, respektive cirkumflex ^a symbol dolaru $; v tomto případě je možným řešením rozšíření regulárního výrazu tak, že jej obklopíte [^[:alnum:]], například [^[:alnum:]]10[^[:alnum:]]; to se však nevztahuje na případy, kdy je shoda na začátku nebo na konci řádku (kde nejsou žádné předchozí nebo následující znaky), ani se to nevztahuje na případy, kdy je výrazem celý řádek. Aby bylo možné zohlednit i tyto situace, je nutné tyto čtyři případy rozšířit ručně pomocí více možností -e. Například příkazový řádek grep by se stal:

grep -e "[^ [: alnum:]] 10 [^ [: alnum:]]" -e "[^ [: alnum:]] 10 $" -e "^ 10 [^ [: alnum:]]" -e "^ 10 $" ...

Nebo můžete také použít rozšířené regulární výrazy ( volba grep -E ) a metaznak | k označení více alternativních výrazů, například:

grep -E "[^ [: alnum:]] 10 [^ [: alnum:]] | [^ [: alnum:]] 10 $ | ^ 10 [^ [: alnum:]] | ^ 10 $" .. .

Doslovné řetězce hledané jako regulární výrazy

Výchozí chování grep je, že vzory používané pro vyhledávání jsou regulární výrazy a ne doslovné řetězce (pro které musí být zadána příslušná volba -F), ale je snadné zapomenout na rozdíl, protože se často nestává, že byste museli hledat pro text obsahující metaznaky jako bod ..

Problém je v tom, že rozdíl skutečně existuje a že často řetězce obsahující metaznaky (jako je číselná IP adresa10.10.1.1 ) jsou také platnými regulárními výrazy, takže grep nehlásí žádné chyby, ale může poskytnout zcela neočekávané výsledky. Regulární výraz se například 10.1.1.1také shoduje v 10.101.1nebo v 1091a1b1nebo jinde a spolu s tím, že není ukotven, zvyšuje možnost neočekávaných výsledků.

Jedním z možných řešení je použít volbu -Fk provedení doslovného vyhledávání; to však zabrání ukotvení textu (nezapomeňte, že doslovný řetězec 10.1.1.1také odpovídá v 10.1.1.100nebo dokonce 210.1.1.1).

Pokud by to byl problém, je nutné znovu se uchýlit k regulárním výrazům, což naznačuje, že metaznaky je třeba brát v úvahu doslovně tak, že je jeden po druhém uvedeme zpětným lomítkem \a pak se postupuje jako v případě, kdy je potřeba kotva. Například s GNU verzí grep :

grep -e '\ <10 \ .1 \ .1 \ .1 \>'…

Použití zpětného lomítka

Textové shelly Unixu a systémů podobných Unixu provádějí substituce na celém příkazovém řádku před jeho spuštěním, včetně sekvencí znaků začínajících zpětným lomítkem \ , pokud nejsou uvedeny ve dvojitých nebo jednoduchých uvozovkách. Například příkazový řádek

grep -e 10 \ .1 \ .1 \ .1

je přeměněn skořápkou v

grep -e 10.1.1.1

a pak by grep zjistil, že hledá s regulárním výrazem 10.1.1.1, což pravděpodobně nebyl původní záměr.

Regulární výrazy by proto měly být specifikovány ve dvojitých nebo jednoduchých uvozovkách, například v

grep -e '10 \ .1 \ .1 \ .1 '

Použijte s find

Chcete-li prohledat více souborů v hierarchii adresářů , grep se často používá v kombinaci s příkazem find , například s:

nalézt. -type f -name "* .c" -exec grep -e " výraz " {} +

Přitom však existuje možnost, že grep je vyvolán příkazem find s jedním souborem k prozkoumání (například pokud příkaz find nalezne pouze jeden soubor), v takovém případě grep pokračuje ve výpisu odpovídajících řádků, aniž by jim předponoval název souboru. ke kterému patří (což je výchozí chování v případě jednoho souboru), a nabízí tak jiný výsledek, než jaký se běžně očekává.

Chcete-li to napravit, můžete zadat název prvního souboru přímo mezi parametry grep , takže grep bude vždy vyvolán s alespoň dvěma názvy souborů, které mají být prozkoumány. K tomuto účelu je užitečný /dev/null, který je vždy přítomen a nikdy neobsahuje data, a proto je ideální jako "výplňový" soubor, který neovlivňuje vyhledávání. Například:

nalézt. -type f -name "* .c" -exec grep -e " expression " / dev / null {} +

Poznámky

  1. ^ Grep , na The Open Group Base Specifications Issue 6 IEEE Std 1003.1-2008 . Staženo 26. června 2009 .
  2. ^ Grep , tisk řádků odpovídajících vzoru v příručce GNU grep . Staženo 19. května 2008 .

Další projekty

Externí odkazy