Příkaz Linux grep se používá jako metoda pro filtrování vstupu. GREP je zkratka pro Global Regular Expression Printer, a proto, abyste ji mohli efektivně používat, měli byste mít nějaké znalosti o regulárních výrazech. V tomto článku se dozvíte několik příkladů, které vám pomohou porozumět příkazu grep.
Jak vyhledat řetězec v souboru pomocí GREP
Představte si, že máte textový soubor s názvem knihy s následujícími názvy dětských knih:
- Robin Hood
- Červená Karkulka
- Peter Pan
- Zlatovláska a tři medvědi
- Sněhurka a sedm trpaslíků
- Pinnochio
- Kočka v klobouku
- Tři malé prasátka
- Gruffalo
- Karlík a továrna na čokoládu
Chcete-li najít všechny knihy se slovem „The“ v názvu, použijte následující syntaxi: grep The books
Budou vráceny následující výsledky: Zlatovláska a tři medvědi
Sněhurka a sedm trpaslíků
Kočka v klobouku
Tři malé prasátka
Gruffalo
Karlík a továrna na čokoládu
V každém případě bude zvýrazněno slovo „The“. Při hledání se rozlišují velká a malá písmena, takže pokud by jeden z titulů obsahoval „the“ místo „The“, nebyl by vrácen. Chcete-li případ ignorovat, můžete přidat následující přepínač: grep the books –ignore-case
Přepínač -i můžete také použít následovně: grep -i knihy
Vyhledejte řetězec v souboru pomocí regulárních výrazů
Příkaz grep je velmi silný. K filtrování výsledků můžete použít množství technik porovnávání vzorů. V tomto příkladu si ukážeme, jak vyhledat řetězec v souboru pomocí zástupných znaků. Představte si, že máte soubor nazvaný místa s následujícími skotskými názvy míst: aberdeen
aberystwyth
aberlour
inverurie
inverze
Newburgh
nový jelen
nový galloway
Glasgow
Edinburgh
Pokud chcete najít všechna místa s invertorem v názvu, použijte následující syntaxi: grep inver * places
Hvězdička
postava nefunguje úplně stejně jako v běžném Bashi. V kontextu grep, který pracuje s regulárními výrazy, se hvězdička chová jinak. Namísto shody s libovolnými nebo žádnými znaky, jako je Bash, odpovídá zadanému vzoru plus jakémukoli nebo žádnému následnému opakování tohoto vzoru. Ve výše uvedeném příkladu odpovídá: inverurie
inverze
protože oba obsahují vzor „inverzní“, jak je zadán, plus nulové další opakování tohoto vzoru. Chcete-li to znovu vidět jasněji, přidejte: repeatinverinverinver
do seznamu. Ne, nedává to moc smysl, ale bude to demonstrovat, jak hvězdička funguje. Zkuste příkaz spustit znovu. grep inver * places Vidíte nový řádek? To by v Bashovi nefungovalo, ale tady to funguje. Aby byly věci ještě podivnější, spusťte příkaz bez hvězdičky. grep inverzní místa
Výsledky jsou stejné. Ve výchozím nastavení bude grep hledat vzor na libovolném místě, které se objeví v řetězci textu. Nerozlišuje ani to, kolikrát se objeví. Dalším zástupným znakem, který můžete použít, je tečka (.). Můžete jej použít k přiřazení jednoho písmene. grep inver.r místa
- Výše uvedený příkaz by našel místa zvaná inverurie a inverary, ale nenašel by invereerie, protože mezi dvěma r může být pouze jeden zástupný znak, jak je označeno jedinou periodou. Zástupný znak období je užitečný, ale může způsobit problémy, pokud máte jeden jako součást hledaného textu. Podívejte se například na tento seznam názvů domén
- linux.lifewire.com
- pcsupport.lifewire.com
- mp3.lifewire.com
- minecraft.lifewire.com
- androidgames.lifewire.com
- netforbeginners.lifewire.com
- Everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
fakesite.lifewire1com.com
Chcete-li najít všechny adresy URL webu lifewire.com, můžete jednoduše vyhledat pomocí následující syntaxe: grep .com domainnames
Výše uvedený příkaz by spadl, pokud by seznam obsahoval následující název: everydaylinuxuser.com
Můžete proto vyzkoušet následující syntaxi: grep lifewire.com doménová jména
To by fungovalo dobře, pokud by neexistovala doména s následujícím názvem: fakesite.lifewire1com.com
Chcete-li skutečně hledat výraz lifewire.com, musíte tečce uniknout následovně: grep lifewire . Com názvy domén
Poslední zástupný znak, který se zobrazí, je otazník, který označuje nulu nebo jeden znak. Například: grep -E? Ber placenames
Výše uvedený příkaz by vrátil aberdeen, aberystwyth nebo dokonce berwick, pokud by byl na seznamu. Všimněte si také zvláštního příznaku „-E“. Grep nerozpozná? znak bez povolení rozšířené podpory regulárních výrazů.
Vyhledejte řetězce na začátku a na konci řádku pomocí grep
- Karát (^) a symbol dolaru ($) umožňují vyhledávat vzory na začátku a na konci řádků. Představte si, že máte soubor s názvem fotbal s následujícími názvy týmů:
- Blackpool
- Liverpool
- město Manchester
- Leicester City
- Manchester United
- Newcastle United
FC United Of Manchester
Pokud byste chtěli najít všechny týmy, které začaly s Manchesterem, použili byste následující syntaxi: grep ^ Manchesterské týmy
Výše uvedený příkaz vrátí Manchester City a Manchester United, ale ne FC United Of Manchester. Alternativně můžete najít všechny týmy končící na United pomocí následující syntaxe: grep United $ týmy
Výše uvedený příkaz by se vrátil do Manchester United a Newcastle United, ale ne do FC United Of Manchester.
Počítání počtu shod pomocí grep
Pokud nechcete vrátit skutečné řádky, které odpovídají vzoru pomocí grep, ale chcete jen vědět, kolik jich je, můžete použít následující syntaxi: grep -c pattern inputfile
Pokud by se vzor shodoval dvakrát, vrátilo by se číslo 2.
Hledání všech výrazů, které se neshodují, pomocí grep
- Představte si, že máte seznam názvů míst s níže uvedenými zeměmi:
- aberdeen Skotsko
- Glasgow Skotsko
- Liverpool Anglie
- colwyn bay
Londýn, Anglie
Možná jste si všimli, že zátoka colwyn není spojena s žádnou zemí. Chcete-li vyhledat všechna místa v zemi, můžete použít následující syntaxi: grep land $ places
Výsledky by byly všude kromě Colwyn Bay. To samozřejmě funguje pouze pro místa, která končí v zemi (těžko vědecká). Výběr můžete invertovat pomocí následující syntaxe: grep -v land $ places
Tím by se našla všechna místa, která nekončí souš.
Jak najít prázdné řádky v souborech pomocí grep
- Představte si, že máte vstupní soubor, který používá aplikace třetí strany, která zastaví čtení souboru, když najde prázdný řádek takto:
- aberdeen skotsko
- Inverness Skotsko
- Liverpool Anglie
colwyn bay wales
Když se aplikace dostane na řádek po Liverpoolu, přestane číst, což znamená, že colwyn bay je zcela vynechán. Můžete použít grep k vyhledání prázdných řádků s následující syntaxí: grep ^ $ places
To není nijak zvlášť užitečné, protože pouze vrací prázdné řádky. Samozřejmě můžete získat počet prázdných řádků jako kontrolu, abyste zjistili, zda je soubor platný, takto: grep -c ^ $ places
Bylo by však užitečnější znát čísla řádků, která mají prázdný řádek, abyste je mohli nahradit. Můžete to udělat pomocí následujícího příkazu: grep -n ^ $ places
Jak hledat řetězce velkých a malých znaků pomocí grep[A-Z]Pomocí grep můžete určit, které řádky v souboru mají velká písmena, pomocí následující syntaxe: grep ‚
‚ název souboru [] Hranaté závorky[a-z]vám umožní určit rozsah znaků. Ve výše uvedeném příkladu odpovídá jakémukoli znaku, který je mezi A a Z. Proto pro shodu malých znaků můžete použít následující syntaxi: grep ‚
‚ název souboru[a-zA-Z]Pokud chcete porovnávat pouze písmena, nikoli číslice nebo jiné symboly, můžete použít následující syntaxi: grep ‚
‚ název souboru[0-9]Totéž můžete udělat s čísly takto: grep ‚
‚ název souboru
Hledáte opakující se vzory pomocí grep
- K vyhledání opakujícího se vzoru můžete použít složené závorky {}. Představte si, že máte soubor s telefonními čísly takto:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
x44-1234 [0-9] Víte, že první část čísla musí mít tři číslice a chcete najít řádky, které neodpovídají tomuto vzoru. Z předchozího příkladu to víte[0-9][0-9][0-9]vrátí všechna čísla v souboru. V tomto případě chceme řádky, které začínají třemi čísly, následovanými spojovníkem (-). Můžete to udělat s následující syntaxí: grep „^
– „čísla [0-9] Jak víme z předchozích příkladů, karát (^) znamená, že čára musí začínat následujícím vzorem. The[0-9]vyhledá libovolné číslo od 0 do 9. Jelikož je toto zahrnuto třikrát, odpovídá 3 číslům. Nakonec existuje spojovník, který označuje, že spojovník musí následovat po třech číslech. Pomocí složených závorek můžete hledání zmenšit následujícím způsobem: grep „^
{3 } – „čísla [0-9]Lomítko unikne {závorce, takže funguje jako součást regulárního výrazu, ale v podstatě to, co říká, je
{3}, což znamená jakékoli číslo mezi 0 a 9 třikrát. Kudrnaté závorky lze také použít následovně: {5,10}
{5,}
{5,10} znamená, že hledaný znak musí být opakován alespoň 5krát, ale ne více než 10, zatímco {5,} znamená, že znak musí být opakován alespoň 5krát, ale může to být i více.
Použití výstupu z jiných příkazů Použití grep
Dosud jsme se podívali na porovnávání vzorů v jednotlivých souborech, ale grep může použít výstup z jiných příkazů jako vstup pro porovnávání vzorů. Skvělým příkladem je použití příkazu ps, který obsahuje seznam aktivních procesů. Například spusťte následující příkaz: ps -ef
Zobrazí se všechny spuštěné procesy ve vašem systému. Můžete použít grep k vyhledání konkrétního spuštěného procesu následujícím způsobem: ps -ef | grep firefox
souhrn
Příkaz grep je základní příkaz Linuxu a stojí za to se ho naučit, protože vám při hledání souborů a procesů při používání terminálu výrazně usnadní život.