Článek přečtěte do 12 min.

Příkaz Grep (Global Regular Expression print) je výkonný nástroj pro vyhledávání textu v systémech Unix/Linux. Grep vezme vzor, ​​jako je regulární výraz nebo řetězec, a hledá v jednom nebo více vstupních souborech řádky, které obsahují očekávaný vzor. Příkaz Grep lze významně použít pro vyhledávání a filtrování textu, analýzu protokolů, skenování kódu, správu konfigurací, extrakci dat atd. Při vývoji softwaru se vyhledávání textu používá pro navigaci v kódu, refaktorování, ladění, diagnostiku chyb, skenování bezpečnostních hrozeb, kontrolu verzí a kontrolu kódu. Nástroje pro vyhledávání textu mohou výrazně zkrátit čas vývojářů na hledání konkrétních funkcí, proměnných nebo chybových hlášení. Při správě systému se textové vyhledávání hodí pro určité úkoly, jako je analýza a monitorování protokolů, zabezpečení a detekce hrozeb, zpracování dat a automatizace. Nástroje pro zpracování textu, jako jsou grep, awk a sed, se používají ke skenování protokolů za účelem analýzy událostí ověřování, konkrétních výjimek a filtrování protokolů podle závažnosti, časového razítka nebo klíčových slov pomáhají správcům odhalovat selhání, narušení zabezpečení a problémy s výkonem. V tomto blogu komplexně prozkoumáme funkce, příklady a případy použití Grepu. Select-String lze použít jako ekvivalent prostředí grep v prostředí Windows tím, že použijete párování regulárních výrazů k vyhledání textových vzorů v souborech a vstupech.

Základní syntaxe a použití

Příkaz Grep je mocný nástroj pro vyhledávání textových vzorů pro filtrování a analýzu textu v Unixu/Linuxu. Níže je uvedena základní struktura příkazů obsahující vzor, ​​soubor a možnosti.

grep [možnosti] vzor [soubor…]

  • Vzor: text regulárního výrazu k vyhledání.
  • Soubor: soubor nebo soubory, ve kterých se má vyhledávat.
  • Možnosti: Modifikátory nebo přepínače, které mění chování grep. Před možnostmi je obvykle spojovník (-).

Níže jsou uvedeny některé z nejčastěji používaných možností.

  • -i: ignoruje typ písmen ve vyhledávacím vzoru a datech. Například níže uvedený příkaz bude hledat „ahoj“, „HELLO“, „Ahoj“ atd.

grep -i „ahoj“ soubor.txt

  • -v: Invertuje shodu hledání a zobrazí řádky, které neodpovídají vzoru. Například níže uvedený příkaz zobrazí řádky, které neobsahují „ahoj“, tato možnost je užitečná při hledání řádků, které neodpovídají specifickým kritériím.

grep -v „ahoj“ soubor.txt

  • -n: Zobrazuje číslo řádku před každým řádkem, který odpovídá kritériím, a pomáhá při sdílení sestavy. Například níže uvedený příkaz zobrazí čísla řádků, kde se objeví slovo „funkce“.

grep -n „funkce“ soubor.txt

  • -r: Rekurzivně prohledávat adresáře, tj. hledat vzor ve všech souborech v adresáři a jeho podadresářích.
  • –color: Zvýrazní odpovídající řetězec ve výstupu. Například níže uvedený příkaz zvýrazní „ahoj“ ve výstupu.

grep – barva „ahoj“ soubor.txt

  • -l: vypíše pouze názvy souborů, ve kterých obsahují alespoň jednu shodu.

              grep -l “spouštění” *.log             

Kompatibilita platformy

Grep je standardně integrován do příkazového řádku v systémech Unix/Linux a chová se konzistentně podle očekávání. Pracuje s regulárními výrazy, podporuje propojení a bezproblémově se integruje s ostatními nástroji Unix/Linux. Grep je k dispozici v systémech Windows prostřednictvím podsystému Windows pro Linux (WSL), který uživatelům umožňuje spouštět prostředí GNU/Linux přímo v systému Windows, bez režie virtuálního stroje. Pro Windows je k dispozici několik nativních portů grep, jedná se o samostatné verze zkompilované pro spuštění přímo v oknech, jako je Git Bash, Gnuwin32.

I když je grep navržen tak, aby byl konzistentní napříč platformami, existují určité rozdíly a omezení, kterých si musíte být vědomi při používání na různých platformách.

  • Zakončení řádků: Systémy Unix/Linux používají pro zakončení řádků ‚\n‘, zatímco Windows používají ‚\r\n‘.
  • Specifikace cesty: Chování souborového systému se mezi Unixem/Linuxem a okny liší, cesty Windows používají zpětná lomítka ‚\‘ místo ‚/‘ používaných v Unixu/Linuxu.
  • Kódování znaků: Různé platformy používají různé výchozí kódování znaků, zejména pokud jde o text bez ASCII.
  • Možnosti příkazového řádku: Většina běžných možností grep je podporována napříč platformami, na různých platformách může být omezená podpora grep, jako je omezená podpora potrubí v okně.

Praktické příklady grep v akci

Jednoduché vyhledávání textu

V následujícím příkladu hledáme řetězec „deployment“ v souboru protokolu

Grep „deployment“ logemail.log

V následujícím příkladu hledáme řetězec „začínající“ volbou -i, který bude ignorovat rozdíl mezi velikostí písmen.

grep -i „spouštění“ logemail.log

Zatímco pokud nepoužijeme volbu -i, přesný řetězec bude v souboru nalezen, tj. příkaz grep „Starting“ logemail.log vyhledá Starting a bude ignorovat shody jako „starting“ nebo „STARTING“ nebo jakoukoli jinou kombinaci řetězce „starting“ rozlišující malá a velká písmena.

Rekurzivní vyhledávání

Někdy máme soubory rozptýlené v různých adresářích a potřebujeme spustit vyhledávání vzorů ve více souborech a adresářích. Rekurzivní vyhledávání pomocí příkazu grep pomocí volby -r spolu s –include a –exclude poskytuje rychlé řešení. V následujícím příkazu rekurzivně hledáme vzor „starting“ ve všech souborech .log v aktuálním adresáři a jeho podadresářích a tiskneme pouze první záznam ze souborů protokolu, kde se vzor shoduje. Momentálně se nacházíme v adresáři „Dokumenty“, kde jsou podadresáře, „kancelář“ a „projekt“.

grep -r “starting” –include=”*.log” -m1 –color=always

V následujícím příkladu vyjmeme všechny soubory protokolu a rekurzivně hledáme řetězec „starting“ ve všech souborech z adresáře „Documents“ a jeho podadresářů.

Grep -r „spuštění“ –exclude=“*.log“

Invertování shod

Můžeme použít volbu -v k invertování výsledku hledání, tímto způsobem můžeme prohledat řetězec a najít všechny řádky, které tento řetězec neobsahují. V následujícím příkladu hledáme hledaný řetězec „starting“ s volbou -v, abychom našli všechny řádky, které neobsahují „starting“.

Grep -v „spouštění“ logmail.log

Čísla řádků a kontextový výstup:

Při hledání vzorů v souborech je užitečné mít přesná čísla řádků s vyhledávacím vzorem a někdy je lepší, aby se kontext kolem vyhledávání shodoval, jako když zkoumáme výjimku v souboru protokolu, je lepší mít nějaké řádky zahrnuty ve výsledcích vyhledávání před a za vyhledávacím řetězcem. V následujícím příkladu používáme volbu -n k tisku čísel řádků spolu s odpovídajícím vzorem.

Grep -n „spouštění“ logemail.log

Pomocí voleb -A můžeme vytisknout řádky za výsledky shody, s volbou -B můžeme vytisknout několik řádků před výsledky shody a pomocí -C můžeme vytisknout nějaký řádek před a za výsledky hledání. V následujících příkladech používáme -A, -B a -C k zobrazení řádků před a za výsledky vyhledávání.

grep -A 2 „spouštění“ logemail.log

grep -B 2 „spouštění“ logemail.log

Grep -C 1 „spouštění“ logemail.log

Použití regulárních výrazů s grep

Regulární výraz je posloupnost znaků, které definují vyhledávací vzor, ​​používají se pro porovnávání řetězců a manipulaci. Některé ze základních regulárních výrazů jsou následující.

  • Tečka(.): odpovídá libovolnému jednotlivému znaku kromě nového řádku, tj. „ct“ odpovídá cat, cot, crt, cet atd.
  • Asterické (*): odpovídá nule nebo více výskytům předchozího znaku, tj. „c*t odpovídá ct, cat, caat, caaat atd.
  • Caret(^): Odpovídá začátku ie ^an odpovídá, pokud je na začátku řádku.
  • Znak dolaru ($): Odpovídá konci řádku, tj. $finished odpovídá dokončeno, pokud je na konci řádku.
  • Pipe (|):   svislý znak v regulárním výrazu funguje jako logické NEBO, tj. (jablko | banán) odpovídá buď jablku, nebo banánu v řádku.
  • Escape znak (\): Escape zvláštní znak, např. \. Odpovídá doslovné tečce.

Grep podporuje regulární výrazy; používá základní regulární výraz (BRE) a také podporuje rozšířený regulární výraz (ERE) s příznakem -E a regulární výrazy kompatibilní s Perlem (PCERE) s příznakem -P. Rozšířené regulární výrazy nabízejí další metaznaky jako + (jedna nebo více shod) , ? (nula nebo jedna shoda),| (logické OR) ,{} (seskupení vzorů ) pro pokročilejší vyhledávání vzorů. Regulární výrazy kompatibilní s Perlem jsou nejvýkonnější a nejflexibilnější, poskytují více možností, jako je dopředný pohled (?=), dopředný pohled (?<!), nezachycující skupiny (?:pattern) a další.

V následujícím příkladu hledáme celé slovo v souboru a variantu příkazu grep s porovnáváním řetězců.

  • Grep „end“ log.txt bude odpovídat všem možným variantám koncového slova
  • grep -w „end“ log.txt , bude odpovídat pouze celému slovu „end“
  • grep „\bend\b“ log.txt , bude odpovídat pouze celému slovu „end“ pomocí regulárního výrazu.
  • Grep „\bend“ log.txt bude odpovídat řetězci „end“ na začátku řádku.

V následujících příkladech porovnáváme číslice v souboru „log.txt“ s různými variacemi.

  • grep “[0-9]” log.txt najde všechny řádky obsahující libovolnou číslici.
  • grep “[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}” log.txt , najde telefonní číslo v daném souboru.
  • grep -E “[0-9]{2,4}” log.txt najde řádky, které mají 2, 3 nebo 4 po sobě jdoucí číslice.

V následujícím příkladu hledáme mezery v souboru log.txt

  • grep „^[[:mezera:]]“ log.txt   najde mezeru na začátku řádku.
  • grep „^[[:mezera:]]“ log.txt najde mezeru na konci řádku.

Pomocí příkazu grep můžeme najít složité vzory, jako jsou IP adresy a e-maily. V následujícím příkladu používáme k nalezení IP adresy regulární výraz.

grep -E “\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}” log.txt

V následujícím příkladu používáme k vyhledání e-mailové adresy regulární výraz.

grep -E “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}” log.txt

Pokročilé techniky regulárních výrazů (např. dopředný a dopředný pohled s -P)

Lookahead a lookbehind jsou výkonné techniky k nalezení vzoru založeného na vzorcích kolem nich. Například pokud chceme hledat „chybu“ v souboru protokolu, ale pouze tehdy, když v řádku začíná i aplikace. Existují dva typy napřed, Pozitivní napřed a Negativní napřed.

  • Pozitivní předhled (?=…) zajišťuje, že vzor v závorce následuje aktuální pozici, ale nezahrnuje ji do shody, tj. mohli bychom hledat „chybu“, pokud je v řádcích protokolu bezprostředně následováno slovem „začátek“.
  • Negativní výhled ((?!…) zajišťuje, že vzor uvnitř závorky nesleduje aktuální pozici, tj. můžeme hledat vzor „začínající“, ale nenásledovaný vzorem „chyba“.

grep -P “chyba(?= spuštění)” log.txt

grep -P “spouštění(?!= chyba)” log.txt

Existují dva typy lookbehind, Positive lookbehind a Negative lookbehind.

  • Pozitivní lookbehind ( ?<=…) zajišťuje, že vzor v závorkách předchází aktuální pozici, ale nezahrnuje se do shody.
  • Negativní lookbehind (?<!…) zajišťuje, že vzor v závorce nepředchází aktuální pozici.

Grep -P “(?<=počáteční )chyba” log.txt

grep -P “chyba)?=.*spuštění)” log.txt

Pokročilé funkce grep

Kombinace více vzorů

Příkaz Grep nám také umožňuje kombinovat více vzorů pro vyhledávání, volbu -e lze použít pro kombinaci více vzorů. V následujícím příkladu hledáme dva různé vzory v jednom souboru.

Grep -e „spouštění“ -e „chyba“ log.txt

Také můžeme použít -e k nalezení více vzorů ve více souborech, tj. „spuštění“ v souboru log.txt a „chyba“ v logemail.log.

grep -e “spouštění” -e “chyba” log.txt logemail.log

Přizpůsobení výstupu

Volbou –color můžeme zvýraznit hledaný vzor ve výstupu, ať už tisk na konzoli nebo přesměrování do souboru.

  • –color=auto rozhodlo, zda se má použít barva, pokud výstup směřuje na terminál
  • –color=vždy, vždy použít barvu, i když je výstup přesměrován do souboru.
  • –color=nikdy, nikdy nepoužívejte barvu.

grep –color=auto „chyba“ log.txt

grep –color=vždy „chyba“ log.txt

grep –color=nikdy „chyba“ log.txt

Můžeme použít volbu -q k úpravě výstupu příkazů grep, k tichému provozu. Použití volby -q nevytiskne všechny odpovídající řádky, pouze vlastní zprávu. V následujících příkladech hledáme v souboru log.txt vzor „chyba“ a tiskneme „chyba nalezena“.

grep -q „chyba“ log.txt && echo „chyba nalezena!“ || echo „Nebyla nalezena žádná chyba“

if grep -qi “chyba” log.txt; pak echo ”chyba nalezena”; fi

Optimalizace výkonu

grep čte velké soubory, aniž by je zcela načítal do paměti, jeho výkon však můžeme zlepšit některými dalšími technikami.

  • Nadužívání regulárního výrazu: Regex je výpočetně nákladný, ve scénářích, kde hledáme doslovný řetězec, můžeme použít pevný řetězec grep, abychom se vyhnuli režii výpočtu Regex.
  • Použití –mmap : –mmap lze použít k povolení přístupu k souboru mapovanému do paměti, pokud v souboru provádíme mnoho náhodných přístupů.
  • Paralelní zpracování: Pokud nám náš úkol umožňuje rozdělit velký soubor a spouštět více procesů grep na různých částech, může to být užitečné při optimalizaci výkonu, protože spustí více instancí procesu grep a výsledky můžeme následně kombinovat.
  • Omezení výstupu: můžeme omezit výstup tak, aby zobrazoval pouze první nebo druhý výskyt hledání, nebo můžeme výstup potlačit a pouze zkontrolovat existenci vzoru.

Příkaz Grep standardně ukládá výstup do vyrovnávací paměti, což může zpozdit zpracování v reálném čase při řetězení příkazů v kanálech. Možnost „–line-buffered“ se používá k vynucení okamžitého výstupu pro každý zápas. V následujícím příkladu řetězíme ocas s grep, abychom nepřetržitě monitorovali soubor protokolu a výstupní vzor „chyba“ řádek po řádku.

Tail -f log.txt | grep – „chyba“ s vyrovnávací pamětí řádků

Shoda vzorů na základě souboru

Můžeme vytvořit soubor vzorů pro vyhledávání pomocí příkazu grep a pak použít –file k prohledání těchto více vzorů ze souboru. V následujícím příkladu jsme vytvořili soubor pattern.txt obsahující vzory „start“, „application“ a „INFO“ a pomocí –file v příkazu grep hledáme tyto vzory v souboru logemail.log s volbou -m2 pro zobrazení na dvou výskytech.

grep –file=pattern.txt -m2 logemai.log

Potrubí a přesměrování s grep

Pro různé scénáře můžeme použít příkaz grep zřetězený s jiným příkazem. V následujícím příkazu používáme příkaz status status (ps) k získání všech procesů a propojení s grep k tisku pouze procesů pythonu.

ps aux | grep python

V následujícím příkladu získáváme všechny soubory a složky v aktuálním adresáři a filtrujeme pouze soubory protokolu pomocí příkazu grep.

ls -a | grep ‚\.log

V následujícím příkladu tiskneme jména uživatelů, kteří používají procesy python pomocí příkazů ps , grep a awk.

ps aux | grep python | awk ‚{print $1}‘

V následujícím příkladu nacházíme vzor „error“ v souboru erros.txt a pomocí příkazu sed zvýrazníme všechny výskyty „error“ jako „Alert“.

grep „chyba“ erros.txt | sed ‚s/error/ALERT/‘

V následujících příkladech hledáme vzor „chyba“ v souboru log.txt a přesměrováváme výstup do jiného souboru erros.txt v aktuálním adresáři. Prvním příkazem přepíšeme výstup v souboru errors.txt a druhým příkazem připojíme výstup grep do souboru error.txt.

grep „chyba“ log.txt > errors.txt

grep “chyba” logemail.log >> errors.txt

V následujícím příkazu používáme tee k zápisu výstupu grep do souboru erros.txt a zároveň jej tiskneme na konzoli.

grep „spouštění“ logemail.log | tee errors.txt

Případy a příklady použití v reálném světě

Analýza a filtrování souborů protokolu

(vzhledem k mnoha příkladům výše)

Zpracování textu a extrakce z datových souborů

(vzhledem k mnoha příkladům výše)

Můžeme použít příkazy netstat a ss, abychom získali stav různých portů a jaké procesy na těchto portech naslouchají, zkombinujeme to s grep a dále to filtrujeme na konkrétní porty. V následujících příkladech používáme příkazy netstat a ss k tomu, aby všechny procesy naslouchaly na různých portech.

netstat -lntp | grep „POSLOUCHEJTE“

ss -lntp | grep „POSLOUCHEJTE“

Příkaz grep můžeme použít s jinými příkazy, abychom získali systémové informace a rychle vyhledávali různá nastavení. V následujících příkladech kontrolujeme různé systémové informace, které se hodí pro diagnostické účely.

ps aux | grep „CPU“ # pro kontrolu statistik CPU.

df -h | grep „/dev/sd“ # pro kontrolu využití disku.

IP a | grep „inet“ # k nalezení IP adres

Přizpůsobení a aliasing grep

Můžeme definovat aliasy pro příkaz grep s jeho různými možnostmi a použít tyto aliasy místo příkazu grep s možnostmi pro vyhledávání vzoru.

alias g=’grep‘

alias gi=’grep -i‘

alias gr=’grep -r‘

alias gc=’gr -n –color=auto‘

Po definování těchto aliasů můžeme aliasy použít k vyhledávání vzorů pouze s aliasy.

g „chyba“ -m1 log.txt

gi „chyba“ -m1 log.txt

gr „chyba“ -m1 log.txt

gc „chyba“ -m1 log.txt

Můžeme napsat funkci pro čtení prvních 10 systémových protokolů. V následujícím příkladu píšeme funkci „find_error“ pro čtení souboru syslog v umístění „/var/log/systemlog“ a výstup posledních 10 řádků, které obsahují vzor „error“.

najít_chyby{

grep -I „chyba“ /var/log/syslog | ocas -n 10

}

Najít_chyby

Používáme příkazy tail , grep a tee k vyhledávání syslog a filtrování chyb pomocí klíčového slova „error“ a zobrazení výstupu na konzoli a jeho přidání do souboru protokolu.

tail -f /var/log/syslog | grep –line-buffered -i „chyba“ | tee errors.txt

Integrace se skriptováním Shell (používání grep s podmíněnými příkazy a smyčkami)

Příklady použití grep ve skriptech shellu pro automatizaci

(Tato část je velmi složitá a vyžaduje více nastavení virtuálních počítačů a oken s Linuxem, neměl čas sdílet příklady, doporučuji změnit H2 na „Použití grep s podmíněnými příkazy a smyčkami“).

V následujícím příkladu používáme grep -i k vyhledání konkrétního vzoru a nasměrování výstupu do smyčky while, která pak zpracuje každý odpovídající řádek.

#!/bin/bash

LOG_FILE=”/var/log/syslog”

PATTERN=”autentizace”

grep -i “$PATTERN” “$LOG_FILE” | při čtení -r řádek; dělat

    echo „Řádek zpracování: $řádek“

    # Zde proveďte další zpracování

hotovo

V následujícím příkladu používáme podmíněné příkazy s příkazy ps a grep ke kontrole stavu služby, zda běží nebo ne.

#!/bin/bash

SERVIS = ”ŠÁLKY”

pokud ! ps aux | grep -v grep | grep -q “$SLUŽBA”; pak

    echo „$SERVICE neběží!“

jiný

    echo „$SERVICE běží.“

fi

Odstraňování problémů a běžné úskalí

Překonání problémů s kódováním

Neshody kódování mohou způsobit selhání příkazu grep při hledání vzorů v různých znacích kódování. Můžeme nastavit národní prostředí (LC_ALL=C) nebo použít volbu –encoding k nápravě problémů s kódováním.

Práce se speciálními znaky a úniky

Regulární výrazy používají speciální znaky, které je třeba escapovat, aby mohly být použity v doslovném významu. Zpětné lomítko (\) se používá k escapování těchto znaků nebo můžeme použít volbu -F (pevný řetězec) pro zpracování vzorů jako doslovných řetězců.

Ladění složitých vzorů regulárních výrazů

Složité regulární výrazy mohou být někdy náročné, když nevrací výsledky podle požadovaného scénáře, rozdělit je na malé části a testovat je jeden po druhém a poté je kombinovat, což může ušetřit čas a také identifikovat problém.

Závěr

O příkazu grep jsme toho probrali hodně, od základních funkcí až po pokročilé techniky, jako jsou regulární výrazy, různé možnosti příkazu grep, propojení grep s dalšími příkazy, přesměrování výstupu, skriptování a techniky odstraňování problémů. Stejně jako jakákoli jiná technika PowerShell, praktické procvičování a experimentování s příkazem grep zlepší porozumění a může odemknout skryté možnosti zvládnutí automatizace systému. Pro další informace nás neváhejte kontaktovat.

Zdroj: Netwrix