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

Linuxový příkaz grep je nástroj pro vyhledávání řetězců a vzorů, který zobrazuje odpovídající řádky z více souborů. Pracuje také s výstupem z jiných příkazů. Ukážeme vám jak.

Příběh za grep

Příkaz grep je známý v Linuxu a Unix kruhy ze tří důvodů. Za prvé, je to nesmírně užitečné. Za druhé, množství možností může být ohromující. Za třetí, byla napsána přes noc, aby uspokojila konkrétní potřebu. První dva jsou prásk; třetí je mírně mimo.

Ken Thompson extrahoval možnosti vyhledávání regulárních výrazů z editoru ed (vyslovené ee-dee) a vytvořil malý program – pro vlastní potřebu – pro vyhledávání v textových souborech. Jeho vedoucí oddělení v Bell Labs, Doug Mcilroy, oslovil Thompsona a popsal problém jeden z jeho kolegů, Lee McMahon, čelil.

McMahon se snažil identifikovat autory Federalistické listy prostřednictvím 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 ze svého nástroje vytvořil obecný nástroj, který by mohli používat ostatní, a přejmenoval ho na grep. Název převzal z ed příkazového řetězce g/re/p , což se překládá jako „globální vyhledávání regulárních výrazů“.

Můžete sledovat Thompsona, jak mluví na Brian Kernighan o zrození grep.

Jednoduché vyhledávání s grep

Chcete-li vyhledat řetězec v souboru, zadejte hledaný výraz a název souboru na příkazovém řádku:

Zobrazí se odpovídající čáry. V tomto případě se jedná o jeden řádek. Odpovídající text je zvýrazněn. Je to proto, že na většině distribucí je grep přiřazen k:

alias grep='grep --colour=auto'

Podívejme se na výsledky, kde se shoduje více řádků. Budeme hledat slovo „Průměr“ v souboru protokolu aplikace. Protože si nemůžeme vzpomenout, zda je slovo v souboru protokolu napsáno malými písmeny, použijeme volbu -i (ignorovat malá a velká písmena):

grep -i Average geek-1.log

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

Neodpovídající řádky můžeme zobrazit pomocí volby -v (invertovat shodu).

grep -v Mem geek-1.log

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

  Jak zašifrovat domovskou složku v systému Linux

Můžeme způsobit, že grep bude úplně zticha. 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 jedna znamená, že nebyl nalezen. Můžeme zkontrolovat návratový kód pomocí $? speciální parametry:

grep -q average geek-1.log
echo $?
grep -q wdzwdz 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 neuvádíte název souboru, musíte zadat cestu. Zde hledáme v aktuálním adresáři „.“ a jakékoli podadresáře:

grep -r -i memfree .

Výstup obsahuje adresář a název souboru každého odpovídajícího řádku.

Můžeme přimět grep, aby sledoval symbolické odkazy pomocí volby -R (rekurzivní dereference). V tomto adresáři máme symbolický odkaz nazvaný logs-folder. Ukazuje na /home/dave/logs.

ls -l logs-folder

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

grep -R -i memfree .

Následuje symbolický odkaz a adresář, na který ukazuje, je prohledán také pomocí grep.

Hledání celých slov

Ve výchozím nastavení bude grep 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 free geek-1.log

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

Chcete-li, aby grep odpovídal pouze samostatným „slovům“, použijte volbu -w (regulární výraz slova).

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

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

Použití více hledaných výrazů

Volba -E (extended regexp) umožňuje vyhledávat více slov. (Volba -E nahrazuje zastaralé egrep verze grep.)

Tento příkaz hledá dva hledané výrazy, „průměr“ a „bez paměti“.

grep -E -w -i "average|memfree" geek-1.log

grep -E -w -i

Pro každý hledaný výraz se zobrazí všechny odpovídající řádky.

Výstup z grep -E -w -i

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

Volba -e (vzory) umožňuje použít více hledaných výrazů na příkazovém řádku. K vytvoření vyhledávacího vzoru využíváme funkci závorky regulárního výrazu. Řekne grepu, aby odpovídal kterémukoli 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 spárovány a ve skutečnosti některé řádky obsahují oba řetězce.

Přesně odpovídající čáry

-x (řádkový regulární výraz) bude odpovídat pouze řádkům, kde celý řádek odpovídá hledanému výrazu. Pojďme hledat datum a časové razítko, o kterém víme, že se v souboru protokolu objeví pouze jednou:

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

grep -x

Je nalezen a zobrazen jediný odpovídající řádek.

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

Opakem je pouze zobrazení čar, které se neshodují. To může být užitečné, když si prohlížíte konfigurační soubory. Komentáře jsou skvělé, ale někdy je těžké mezi nimi najít skutečné nastavení. Zde je soubor /etc/sudoers:

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

sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

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. Volba -o (pouze shoda) dělá právě to.

grep -o MemFree geek-1.log

Zobrazení je omezeno na zobrazení pouze textu, který odpovídá hledanému výrazu, namísto celého odpovídajícího řádku.

Počítání s grep

grep není jen o textu, může poskytovat i číselné informace. Můžeme přimět grep počítat za nás různými způsoby. Pokud chceme vědět, kolikrát se hledaný výraz objeví v souboru, můžeme použít volbu -c (count).

grep -c average geek-1.log

grep uvádí, že hledaný výraz se v tomto souboru vyskytuje 240krát.

Pomocí volby -n (číslo řádku) můžete nastavit, aby grep zobrazoval číslo řá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 volbu -m (max. počet). Omezíme výstup na pět odpovídající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é – pro každý odpovídající řádek je často užitečné. může pomoci rozlišit, které ze shodných řádků jsou ty, které 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 požadujeme tři řádky:

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

grep -A 3 -x

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

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

grep -B 3 -x

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

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

grep-C3-x

Zobrazení odpovídajících souborů

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

grep -l "sl.h" *.c

grep -l

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

  Jak nainstalovat Ardor Audio Editor na Linux

Výstup z grep -l

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

grep -L "sl.h" *.c

grep -L

Začátek a konec řádků

Můžeme přinutit grep, aby zobrazoval pouze shody, 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 my budeme hledat řádky, které mají jako první znak mezeru:

grep "^ " geek-1.log

grep

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

Výstup grep

Chcete-li odpovídat konci řádku, použijte operátor regulárního výrazu „$“. Budeme hledat řádky, které končí „00“.

grep "00$" geek-1.log

grep

Na displeji se zobrazí řádky, jejichž poslední znaky jsou „00“.

výstup grep

Použití Pipes s grep

Samozřejmě můžete vstup do grep routovat, výstup z grep přenést do jiného programu a nechat grep zahnízděný uprostřed řetězce rour.

Ř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, takže výstup zavedeme do méně:

grep "ExtractParameters" *.c | less

grep

Výstup je prezentován v méně.

Výstup z grep

To vám umožní listovat v seznamu souborů a používat méně vyhledávací zařízení.

Pokud převedeme výstup z grep do wc a použijeme volbu -l (řádky), we umí spočítat počet řádků v souborech zdrojového kódu, které obsahují „ExtractParameters“. (Mohli bychom toho dosáhnout pomocí volby grep -c (count), ale je to úhledný způsob, jak demonstrovat vyřazení z grep.)

grep "ExtractParameters" *.c | wc -l

grep

S dalším příkazem převedeme výstup z ls do grep a výstup z grep do sort . Vypisujeme soubory v aktuálním adresáři, vybíráme ty, které obsahují řetězec „Aug“, a seřadit je podle velikosti souboru:

ls -l | grep "Aug" | sort +4n

ls -l |  grep

Pojďme si to rozebrat:

ls -l: Provede dlouhý formátový výpis souborů pomocí ls.
grep „Aug“: Vyberte řádky ze seznamu ls, které mají v sobě „Aug“. Všimněte si, že by to také našlo soubory, které mají ve svém názvu „Aug“.
sort +4n: Seřadí výstup z grep na čtvrtém sloupci (velikost souboru).

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

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

grep je skvělý nástroj, který máte k dispozici. Pochází z roku 1974 a je stále silný, protože potřebujeme to, co dělá, a nic to neumí lépe.

Spojení grep s některými regulárními výrazy-fu to skutečně posouvá na další úroveň.