GREP(1)

NAME
grep, egrep, fgrep - tiskne řádky, které odpovídají zadanému vzoru

PŘEHLED
grep [volby] VZOR [SOUBOR...]
grep [volby] [-e VZOR | -f SOUBOR] [SOUBOR...]

POPIS

Grep prohledává zadaný vstup SOUBOR (nebo standardní vstup, pokud nejsou zadány žádné soubory nebo soubor -) a hledá řádky obsahující zadaný VZOR. Ve výchozím nastavení grep vypisuje řádky, které vzoru odpovídají.

Dostupné jsou navíc dvě varianty programu - egrep a fgrep. Chování programu egrep je stejné jako grep -E, chování programu fgrep je stejné jako grep -F.

VOLBY

-A POČET, --after-context=POČET
    Tiskni POČET řádků které následují po platném (odpovídajícím) řádku.

-a, --text
    Pracuj s binárním souborem jako by to byl text; ekvivalentní k volbě --binary-files=text

-B POČET, --before-context=POČET
    Tiskni POČET řádků které předcházejí platnému řádku.

-C [POČET], -POČET, --context[=POČET]
    Tiskni POČET řádků (výchozí počet je 2) ke každému platného řádku.

-b, --byte-offset
    Tiskni offset bajtu ve vstupním souboru před každým řádkem výstupu.

--binary-files=TYP
    Jestliže podle prvních několika bajtů obsahuje soubor binární data, předpokládej, že je typu TYP. Výchozím nastavením TYP je binary a grep standardně vypíše buď jednořádkovou zprávu, že binární soubor odpovídá, nebo žádnou zprávu pokud neodpovídá. Jestliže je TYP without-match, grep předpokládá že binární soubory neodpovídají; je to stejné jako volba -I Jestliže je TYP text, grep zpracovává binární soubor jako by to byl text; stejné jako volba -a. Pozor: grep --binary-files=text může způsobit, že se budou vypisovat nesmyslné binární znaky, což může mít nepříjemné vedlejší účinky pokud je výstupem terminál a některé znaky se v něm začnou brát jako příkazy.

-c, --count
    Potlač normální výstup; místo toho napiš počet odpovídajících řádků pro každý vstupní soubor. S volbou -v, --invert-match (viz níže), počítej neodpovídající řádky.

-d AKCE, --directories=AKCE
    Pokud je vstupním souborem adresář, použij AKCI k jeho zpracování. Výchozím nastavením AKCE je read, to znamená, že adresáře se čtou jako by to byly běžné soubory. Jestliže AKCE je skip, adresáře se mlčky přeskočí. Jestliže AKCE je recurse, grep čte rekurzivně všechny soubory v každém adresáři; je to stejné jako volba -r

-E, --extended-regexp
    Považuj VÝRAZ za rozšířený regulární výraz (viz níže).

-e VÝRAZ, --regexp=VÝRAZ
    Jako vzor použij VÝRAZ; užitečné pro zachování vzorů začínajících -.

-F, --fixed-strings
    VÝRAZ je seznam pevných řetězců oddělených znaky konce řádku, ze kterých může odpovídat kterýkoliv.

-f SOUBOR, --file=SOUBOR
    Načte vzory ze souboru SOUBOR, na každém řádku jeden. Prázdné řádky obsahují nulové vzory a tedy neodpovídají ničemu.

-G, --basic-regexp
    Považuj VÝRAZ za základní regulární výraz (viz níže). Toto je výchozí nastavení.

-H, --with-filename
    Tiskni jméno souboru pro každou shodu.

-h, --no-filename
    Potlač vkládání jmen souborů do výstupu při prohledávání více souborů.

--help
    Vytiskni stručnou nápovědu.

-I  Zpracuj binární soubor jako by neobsahoval shody; to je stejné jako volba --binary-files=without-match

-i, --ignore-case
    Nerozlišuj velká a malá písmena ve VÝRAZU ani ve vstupních souborech.

-L, --files-without-match
    Potlač normální výstup; místo toho tiskni jméno každého souboru, ze kterého by se jinak žádný výstup netiskl. Prohledávání skončí s první shodou.

-l, --files-with-matches
    Potlač normální výstup; místo toho tiskni jméno každého souboru, ze kterého by se jinak tiskl nějaký výstup. Prohledávání skončí s první shodou.

--mmap
    Pokud je to možné, použij systémové volání mmap(2) ke čtení vstupních dat, místo běžného volání read(2) --mmap zlepšit výkon. Na druhou stranu --mmap může způsobit potíže (včetně core dump) jestliže se vstupní soubor za běhu programu grep zmenší nebo pokud nastane chyba vstupu/výstupu.

-n, --line-number
    Před každý řádek výstupu přidej jeho číslo v příslušném vstupním souboru.

-q, --quiet, --silent
    Tiše; potlač normální výstup. Prohledávání skončí s první shodou. Viz také volbu -s or --no-messages uvedenou dále.

-r, --recursive
    Rekurzivně načti všechny soubory v každém adresáři; to je stejné jako volba -d recurse

-s, --no-messages
    Potlač chybové hlášky o neexistujících nebo nečitelných souborech. Poznámka o přenositelnosti: na rozdíl od GNU grep, tradiční grep neodpovídal specifikaci POSIX.2, protože neměl volbu -q a jeho volba -s se chovala jako volba GNU -q GNU grep. Shellové skripty které mají být přenositelné na tradiční grep by se měly voleb -q a -s vyvarovat a přesměrovat místo toho výstup do /dev/null.

-U, --binary
    Pracuj se soubory jako s binárními. Normálně typ souboru pod MS-DOS a MS-Windows určuje grep tak, že se podívá na prvních přečtených 32KB dat. Když grep rozhodne že soubor je textový, vynechá z původního obsahu znaky CR (aby nepřestaly správně fungovat regulární výrazy obsahující ^ a $ ). Uvedením volby -U se toto pravidlo ruší a všechny soubory se předají porovnávacímu mechanismu doslovně. Pokud obsahuje soubor text s páry CR/LF na koncích řádků, způsobí to, že některé regulární výrazy přestanou fungovat. Tato volba nemá žádný účinek na platformách jiných než MS-DOS a MS-Windows.

-u, --unix-byte-offsets
    Hlásit offsety jako v Unixu. Tento přepínač zajistí, že grep bude tisknout offsety bajtů jako by soubor byl textový soubor v Unixu, tedy bez znaků CR. To znamená, že výsledky grep budou stejné jako v systému Unix. Tato volba nemá žádný efekt bez současného použití volby -b; také nemá efekt na platformách jiných než MS-DOS a MS-Windows.

-V, --version
    Vytiskni verzi grep na chybový výstup. Verze by měla být uvedena ve všech hlášeních chyb (viz níže).

-v, --invert-match
    Převrať význam shody - vytisknou se řádky které vzoru neodpovídají.

-w, --word-regexp
    Vyber jen řádky ve kterých se shoduje celé samostatné slovo. Odpovídající řetězec musí být buď na začátku řádku nebo mít před sebou znak který se nebere jako součást slova. Podobně musí řetězec být buď na konci řádku nebo za ním musí následovat znak který se nebere jako součást slova. Znaky které se považují za části slov jsou písmena, číslice a podtržítko.

-x, --line-regexp
    Vyber jen shody přes celý řádek.

-y  Zastaralá alternativa pro -i.

-Z, --null
    Vytiskni nulový bajt (znak ASCII NUL) místo znaku který následuje po jménech souborů. Například grep -lZ píše nulový bajt po každém názvu souboru místo obvyklého znaku konce řádku. Tato volba zajistí jednoznačnost výstupu i v případě, že názvy souborů obsahují neobvyklé znaky jako znaky konce řádku. Tuto volbu lze použít pro příkazy jako find -print0, perl -0, sort -z a xargs -0, ke zpracování libovolných jmen souborů včetně těch, které obsahují znaky konce řádku.

REGULÁRNÍ VÝRAZY

Regulární výraz je vzor, který popisuje množinu řetězců. Regulární výrazy se píší (podobně jako aritmetické výrazy) pomocí různých operátorů, které dávají dohromady menší výrazy.

Grep zná dvě různé verze syntaxe pro regulární výrazy: “základní” a “rozšířené.” Pro GNU grep, není v těchto dvou verzích žádný rozdíl co se týče funkčnosti. V jiných implementacích jsou základní regulární výrazy slabší. Následující popis platí pro rozšířené regulární výrazy; rozdíly pro základní regulární výrazy jsou uvedeny na konci.

Základním stavebním kamenem jsou regulární výrazy, které odpovídají jedinému znaku. Většina znaků, včetně všech písmen a číslic, jsou samy o sobě regulární výrazy které se shodují samy se sebou. Kterýkoli metaznak se zvláštním významem může být uveden ve svém původním významu tak, že se před něj napíše zpětné lomítko.

Seznam znaků v [ a ] odpovídá jakémukoli jednotlivému znaku ze seznamu; když je prvním znakem seznamu stříška ^ potom seznam odpovídá jakémukoli znaku který v seznamu není Například regulární výraz [0123456789] odpovídá jedné libovolné číslici. Rozsah znaků lze specifikovat prvním a posledním znakem, oddělenými pomlčkou. Jsou také přednastaveny některé skupiny znaků: [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:] a [:xdigit:] jsou postupně písmena a číslice, písmena, kontrolní znaky, číslice, obrázkové znaky, malá písmena, tisknutelné znaky, interpunkční znaménka, mezery, velká písmena a číslice šestnáctkové soustavy. Například [[:alnum:]] je stejné jako [0-9A-Za-z], až na to, že druhý vzor závisí na locale POSIX a kódování znaků ASCII, zatímco první je nezávislý na locale i znakové sadě (závorky v názvech skupin jsou součástí jejich symbolický jmen a musí být uvedené uvnitř závorek uzavírajících seznam). Většina metaznaků ztrácí v seznamech svůj zvláštní význam. K přidání znaku ] do seznamu stačí uvést ho jako první. Podobně znak ^ stačí uvést na jiném než prvním místě. Konečně znak - se uvede jako poslední.

Tečka . odpovídá jednomu libovolnému znaku. Znak \w je synonymem pro [[:alnum:]] a \W je synonymem pro [^[:alnum]].

Stříška ^ a znak dolaru $ jsou metaznaky, které odpovídají prázdnému řetězci na začátku, resp. na konci řádku. Symboly \< a \> označují prázdné řetězce na začátku, resp. na konci slova. Symbol \b odpovídá prázdnému řetězci na hranici slova a \B odpovídá prázdnému řetězci který není na hranici slova.

Regulární výraz může mít za sebou jeden z opakovacích operátorů:
?   Předcházející položka je volitelná a obsažená nejvýše jednou (tj. jednou nebo ani jednou).
*   Předcházející položka je volitelná a obsažená v libovolném počtu (tj. nula- nebo vícekrát).
+   Předcházející položka je obsažena jednou nebo vícekrát.
{n} Předcházející položka je obsažena právě n krát.
{n,}
    Předcházející položka je obsažena n nebo vícekrát.
{n,m}
    Předcházející položka je obsažena alespoň n krát, ale ne více než m krát.

Dva regulární výrazy se dají přímo spojit; výsledný regulární výraz odpovídá libovolnému řetězci vzniklému spojením dvou jiných, které odpovídají původním dvěma regulárním výrazům.

Dva regulární výrazy lze složit pevným operátorem |; výsledný regulární výraz odpovídá řetězci, který se shoduje s kterýmkoliv z uvedených regulárních výrazů.

Opakování má přednost před spojením, které má zase přednost před střídáním. Celý podvýraz stačí uzavřít do závorek aby se tato přednost zrušila.

Zpětný odkaz \n , kde n je číslice, odpovídá podřetězci, který byl předtím porovnáván a vyhodnocen jako shodný s n-tým podvýrazem odděleným závorkami od zbytku regulárního výrazu.

V základních regulárních výrazech ztrácejí metaznaky ?, +, {, |, (, a ) své zvláštní významy; místo nich se dají použít verze se zpětným lomítkem \?, \+, \{, \|, \(, a \).

Tradiční egrep nepodporoval metaznak { a některé implementace egrep místo toho podporovaly \{. Přenositelné skripty by tedy neměly { ve vzorech pro egrep používat a místo toho k porovnání se znakem { používat seznam s jediným znakem [{].

GNU egrep se snaží tradiční způsob použití podporovat tak, že { nebere jako metaznak pokud by měl být začátkem chybné specifikace rozsahu. Například příkaz egrep '{1' hledá dvouznakový řetězec {1 místo toho, aby hlásil chybu syntaxe v regulárním výrazu. POSIX.2 dovoluje toto chování jako rozšíření, ale přenositelné skripty by na něj neměly spoléhat.

PROMĚNNÉ PROSTŘEDÍ

GREP_OPTIONS
    Tato proměnná nastavuje volby, které se přidají na začátek dalších dodatečných voleb. Například kdyby GREP_OPTIONS bylo '--binary-files=without-match --directories=skip', grep se chová jako kdyby volby --binary-files=without-match a --directories=skip byly uvedené před ostatními dodatečnými volbami. Nastavení voleb jsou oddělená bílými znaky (např. mezerami nebo tabulátory). Zpětné lomítko uvádí další znak, takže jej lze použít pro volbu obsahující bílé znaky nebo zpětná lomítka.

LC_ALL, LC_MESSAGES, LANG
    Tyto proměnné nastavují locale LC_MESSAGES určující jazyk, kterým bude grep tisknout hlášení. Locale je nastaveno první existující proměnnou. Pokud neexistuje žádná, není nainstalován přeložený katalog hlášek nebo nebyl grep zkompilován s jazykovou podporou (NLS), použije se americká angličtina.

LC_ALL, LC_CTYPE, LANG
    Tyto proměnné nastavují locale LC_CTYPE určující typ znaků, tedy které znaky patří k tzv. bílým. Locale je nastaveno první existující proměnnou. Pokud neexistuje žádná, není nainstalován katalog locale nebo nebyl grep zkompilován s jazykovou podporou (NLS), použije se locale POSIX.

POSIXLY_CORRECT
    Pokud je nastaveno, grep se chová podle požadavků POSIX.2; jinak se chová grep více jako ostatní programy GNU. POSIX.2 vyžaduje, aby volby následující za jmény souborů byly brány už jen jako jména souborů; normálně se takové volby přesunou na začátek seznamu parametrů a berou se jako volby. POSIX.2 dále vyžaduje aby se neznámé volby pokládaly za “illegal”, ale protože nejsou tak úplně protizákonné, normálně se prohlásí za “invalid”. POSIXLY_CORRECT také ruší _N_GNU_nonoption_argv_flags_ popsané dále.

_N_GNU_nonoption_argv_flags_
    (Zde N je číslo procesu grep). Jestliže hodnota i-tého znaku této proměnné je 1, neber i-tý parametr grep jako volbu, i kdyby to vypadalo, že to volba je. Shell může dát tuto proměnnou do prostředí pro každý příkaz který spouští, aby určil, které parametry jsou výsledkem rozvinutí jmen souborů "žolíkovými" znaky (* a ?) a nemají být brány jako volby. Toho chování je možné jen s knihovnou GNU C a jen když není nastaveno POSIXLY_CORRECT.

NÁVRATOVÉ HODNOTY

Normálně je výstupní hodnota 0 když jsou nalezeny shody nebo 1 když žádné nalezeny nejsou (volba -v převrací smysl výstupní hodnoty). Výstupní hodnota 2 znamená, že jsou chyby syntaxe ve vzoru, nepřístupné soubory, nebo jiné systémové chyby.

VADY

Hlášení o vadách posílejte na bug-gnu-utils@gnu.org (anglicky). Ujistěte se, že někde v poli “Subject:” bude “grep”.

Velké počty opakování v konstrukci {m,n} můžou vést k tomu, že grep použije dost paměti. Navíc některé jiné neobvyklé regulární výrazy můžou mít exponenciální nároky na čas a prostor a způsobit že grep spotřebuje všechnu paměť.

Zpětné odkazy jsou velmi pomalé a doba jejich zpracování může růst exponenciálně.

PŘELOŽIL
Tomáš Andrle (tomas.andrle@pslib.cz).