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

Příkaz Linux grep
je 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 grep
pří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 ed
editoru 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 ed
pří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í grep
je 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 grep
také adresář, na který ukazuje .
Hledání celých slov
Ve výchozím nastavení grep
bude 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 -E
možnost nahradí zastaralou egrep
verzi 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á, grep
aby odpovídala některému ze znaků obsažených v závorkách „[].“ To znamená, že grep
bude 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/sudoers
soubor:
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
grep
nejde jen o text, může poskytnout i číselné informace. Můžeme grep
pro 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.
grep
Pomocí 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.h
soubor 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 grep
zobrazení 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 grep
kanálu, výstup z kanálu grep
do jiného programu a grep
umí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's
vyhledávací zařízení.
Pokud propojíme výstup grep
do wc
a 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 ls
do grep
a piping výstup z grep
do 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
ls
seznamu, 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
grep
je úž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í grep
s 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