Jak používat příkaz grep v systému Linux

Příkaz Linux grepje nástroj pro porovnávání řetězců a vzorů, který zobrazuje odpovídající řádky z více souborů. Funguje také s odvedeným výstupem z jiných příkazů. Ukážeme vám jak.

Příběh za grep

Tento greppříkaz je v kruzích Linux a Unix známý ze tří důvodů. Za prvé, je to nesmírně užitečné. Zadruhé, množství možností může být ohromující. Zatřetí, byl napsán přes noc, aby uspokojil konkrétní potřebu. První dva jsou bouchnutí; třetí je mírně vypnutý.

Ken Thompson z ededitoru vytáhl možnosti vyhledávání regulárních výrazů (vyslovuje se ee-dee) a vytvořil malý program - pro vlastní potřebu - prohledávání textových souborů. Vedoucí jeho oddělení v laboratořích Bell Labs Doug Mcilroy oslovil Thompsona a popsal problém, kterému čelil jeden z jeho kolegů Lee McMahon.

McMahon se pokoušel identifikovat autory federalistických článků pomocí textové analýzy. Potřeboval nástroj, který by dokázal vyhledávat fráze a řetězce v textových souborech. Thompson toho večera strávil asi hodinu tím, že svůj nástroj vytvořil jako obecný nástroj, který mohli používat i ostatní, a přejmenovali jej na grep. Název převzal z edpříkazového řetězce g/re/p, což se překládá jako „hledání globálního regulárního výrazu“.

Můžete sledovat Thompsona, jak mluví s Brianem Kernighanem o narození grep.

Jednoduché vyhledávání s grep

Chcete-li vyhledat řetězec v souboru, předejte hledaný výraz a název souboru na příkazový řádek:

Zobrazí se odpovídající řádky. V tomto případě se jedná o jeden řádek. Odpovídající text je zvýrazněn. Důvodem je, že u většiny distribucí grepje aliasem:

alias grep = "grep --colour = auto"

Pojďme se podívat na výsledky, kde existuje více řádků, které odpovídají. Hledáme slovo „průměr“ v souboru protokolu aplikace. Protože si nemůžeme vzpomenout, jestli je slovo v souboru protokolu malými písmeny, použijeme možnost -i (ignorovat velká písmena):

grep -i Průměrný geek-1.log

Zobrazí se každý odpovídající řádek, přičemž v každém je zvýrazněn odpovídající text.

Můžeme zobrazit neshodné řádky pomocí volby -v (invertovat shodu).

grep -v Mem geek-1.log

Neexistuje žádné zvýraznění, protože se jedná o neodpovídající řádky.

Můžeme způsobit grepúplné ticho. Výsledek je předán do shellu jako návratová hodnota z grep. Výsledek nula znamená, že řetězec byl nalezen, a výsledek jednoho znamená, že nebyl nalezen. Můžeme zkontrolovat návratový kód pomocí  $?speciálních parametrů:

grep -q průměrný geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Rekurzivní vyhledávání s grep

Chcete-li prohledávat vnořené adresáře a podadresáře, použijte volbu -r (rekurzivní). Všimněte si, že na příkazovém řádku nezadáte název souboru, musíte zadat cestu. Zde hledáme v aktuálním adresáři „.“ a všechny podadresáře:

grep -r -i memfree.

Výstup obsahuje adresář a název souboru každého shodného řádku.

Můžeme vytvořit  grep  následující symbolické odkazy pomocí možnosti -R(rekurzivní dereference). V tomto adresáři máme symbolický odkaz s názvem logs-folder. Ukazuje na /home/dave/logs.

ls -l složka protokolů

Zopakujme naše poslední hledání s možností  -R(rekurzivní dereference):

grep -R -i memfree.

Následuje symbolický odkaz a prohledá se greptaké adresář, na který ukazuje .

Hledání celých slov

Ve výchozím nastavení grepbude odpovídat řádku, pokud se cíl vyhledávání objeví kdekoli v tomto řádku, včetně uvnitř jiného řetězce. Podívejte se na tento příklad. Budeme hledat slovo „zdarma“.

grep -i zdarma geek-1.log

Výsledkem jsou řádky, které mají řetězec „volný“, ale nejsou to samostatná slova. Jsou součástí řetězce „MemFree“.

Chcete-li vynutit grep shodu pouze samostatných „slov“, použijte možnost -w(word regexp).

grep -w -i zdarma geek-1.log
echo $?

Tentokrát nejsou k dispozici žádné výsledky, protože hledaný výraz „zdarma“ se v souboru neobjevuje jako samostatné slovo.

Používání více hledaných výrazů

Možnost -E(rozšířený regulární výraz) umožňuje vyhledávat více slov. (Tato -Emožnost nahradí zastaralou egrepverzi grep.)

Tento příkaz vyhledá dva hledané výrazy, „průměrný“ a „memfree“.

grep -E -w -i "průměr | memfree" geek-1.log

Všechny odpovídající řádky se zobrazí pro každý z hledaných výrazů.

Můžete také vyhledat více výrazů, které nemusí být nutně celá slova, ale mohou to být také celá slova.

Možnost -e(vzory) umožňuje použít na příkazovém řádku více hledaných výrazů. K vytvoření vzoru vyhledávání používáme funkci závorky regulárního výrazu. Říká, grepaby odpovídala některému ze znaků obsažených v závorkách „[].“ To znamená, že grepbude při vyhledávání odpovídat buď „kB“, nebo „KB“.

Oba řetězce jsou shodné a ve skutečnosti některé řádky obsahují oba řetězce.

Přesné přiřazení řádků

-x(Linka regexp) bude odpovídat pouze řádky, kde se celý řádek s vyhledávacím dotazem shoduje. Vyhledejme razítko data a času, o kterém víme, že se v souboru protokolu objeví pouze jednou:

grep -x "20. ledna - 06 15:24:35" geek-1.log

Jeden řádek, který odpovídá, je nalezen a zobrazen.

Opak toho ukazuje pouze řádky, které se neshodují. To může být užitečné při prohlížení konfiguračních souborů. Komentáře jsou skvělé, ale někdy je těžké najít mezi nimi skutečné nastavení. Zde je /etc/sudoerssoubor:

Můžeme efektivně odfiltrovat řádky komentářů takto:

sudo grep -v "#" / etc / sudoers

To je mnohem snazší analyzovat.

Zobrazuje se pouze odpovídající text

Může nastat situace, kdy nechcete vidět celý odpovídající řádek, pouze odpovídající text. Možnost -o(pouze shoda) dělá právě to.

grep -o MemFree geek-1.log

Displej se zmenší tak, že místo celého shodného řádku se zobrazí pouze text, který odpovídá hledanému výrazu.

Počítám s grep

grepnejde jen o text, může poskytnout i číselné informace. Můžeme greppro nás počítat různými způsoby. Pokud chceme vědět, kolikrát se hledaný výraz objeví v souboru, můžeme použít možnost -c(count).

grep -c průměrný geek-1.log

grep hlásí, že se hledaný výraz v tomto souboru objeví 240krát.

grepPomocí možnosti -n(číslo řádku) můžete provést zobrazení čísla řádku pro každý odpovídající řádek .

grep -n Jan geek-1.log

Číslo řádku pro každý odpovídající řádek se zobrazí na začátku řádku.

Chcete-li snížit počet zobrazených výsledků, použijte možnost -m(maximální počet). Omezíme výstup na pět shodných řádků:

grep -m5 -n Jan geek-1.log

Přidání kontextu

Být schopen vidět některé další řádky - možná neshodné řádky - pro každý shodný řádek je často užitečné. může vám pomoci rozlišit, které z uzavřených řádků vás zajímají.

Chcete-li zobrazit některé řádky za odpovídajícím řádkem, použijte volbu -A (po kontextu). V tomto příkladu žádáme o tři řádky:

grep -A 3 -x "20. ledna-06 15:24:35" geek-1.log

Chcete-li zobrazit některé řádky před odpovídajícím řádkem, použijte možnost -B(kontext před).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

Chcete-li zahrnout řádky před a za odpovídající řádek, použijte volbu -C(kontext).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Zobrazení odpovídajících souborů

Chcete-li zobrazit názvy souborů, které obsahují hledaný výraz, použijte možnost -l (soubory se shodou). Chcete-li zjistit, které soubory zdrojového kódu C obsahují odkazy na sl.hsoubor záhlaví, použijte tento příkaz:

grep -l "sl.h" * .c

Jsou uvedeny názvy souborů, nikoli odpovídající řádky.

A samozřejmě můžeme hledat soubory, které neobsahují hledaný výraz. Možnost -L(soubory bez shody) dělá právě to.

grep -L "sl.h" * .c

Začátek a konec řádků

Můžeme vynutit grepzobrazení pouze shod, které jsou buď na začátku nebo na konci řádku. Operátor regulárního výrazu „^“ odpovídá začátku řádku. Prakticky všechny řádky v souboru protokolu budou obsahovat mezery, ale budeme hledat řádky, které mají jako první znak mezeru:

grep "^" geek-1.log

Zobrazí se řádky, které mají jako první znak mezeru - na začátku řádku.

Ke shodování s koncem řádku použijte operátor regulárního výrazu „$“. Budeme hledat řádky, které končí na „00“.

grep "00 $" geek-1.log

Na displeji se zobrazují řádky, které mají jako poslední znaky „00“.

Používání Pipes s grep

Samozřejmě můžete vstupovat do grepkanálu, výstup z kanálu grepdo jiného programu a grepumístit se uprostřed řetězce potrubí.

Řekněme, že chceme vidět všechny výskyty řetězce „ExtractParameters“ v našich souborech zdrojového kódu C. Víme, že jich bude docela málo, a proto výstup zavedeme do less:

grep "ExtractParameters" * .c | méně

Výstup je uveden v less.

To vám umožní procházet seznam souborů a používat less'svyhledávací zařízení.

Pokud propojíme výstup grepdo wca použijeme možnost -l(řádky), můžeme spočítat počet řádků v souborech zdrojového kódu, které obsahují „ExtractParameters“. (Mohli bychom toho dosáhnout pomocí možnosti grep-c(count), ale toto je čistý způsob, jak demonstrovat vyřazování grep.)

grep "ExtractParameters" * .c | wc -l

S dalším příkazem jsme piping výstup z lsdo grepa piping výstup z grepdo sort. Seznamujeme soubory v aktuálním adresáři, vybíráme ty, které mají v sobě řetězec „Aug“, a řazíme je podle velikosti souboru:

ls -l | grep "Aug" | třídit + 4n

Pojďme to rozdělit:

  • ls -l : Provede dlouhý formát seznamu souborů pomocí ls.
  • grep „Aug“ : Vyberte řádky ze lsseznamu, které mají v sobě „Aug“. Toto by také našlo soubory, které mají v názvu „Aug“.
  • sort + 4n : Seřadí výstup z grepu ve čtvrtém sloupci (velikost souboru).

Dostaneme seřazený seznam všech souborů upravených v srpnu (bez ohledu na rok) ve vzestupném pořadí podle velikosti souboru.

SOUVISEJÍCÍ: Jak používat potrubí v systému Linux

grep: Méně velení, více spojence

grepje úžasný nástroj, který máte k dispozici. Pochází z roku 1974 a stále sílí, protože potřebujeme to, co dělá, a nic to nedělá lépe.

Spojení greps některými regulárními výrazy-fu to opravdu posune na další úroveň.

SOUVISEJÍCÍ: Jak používat základní regulární výrazy k lepšímu vyhledávání a úspoře času