Úvod
Příkaz Linux grep se používá jako metoda pro filtrování vstupu.
GREP znamená globální regulární výrazovou tiskárnu, a proto je nutné, abyste ji efektivně využili, měli byste mít nějaké znalosti o regulárních výrazech.
V tomto článku vám ukážeme řadu příkladů, které vám pomohou pochopit příkaz grep.
01 ze dne 09
Jak vyhledávat řetězec v souboru pomocí GREP
Představte si, že máte textový soubor nazvaný knihy s následujícími dětskými knihami:
- 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žijete následující syntaxi:
grep Knihy
Zobrazí se 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ě se zvýrazní slovo "The".
Všimněte si, že vyhledávání je citlivé na velká a malá písmena, takže pokud jeden z titulů měl "the" namísto "The" pak by nebyl vrácen.
Chcete-li případ ignorovat, můžete přidat následující přepínač:
Grep knihy - case-case
Můžete také použít přepínač -i následujícím způsobem:
grep -i knihy
02 ze dne 09
Vyhledání řetězce v souboru pomocí zástupných znaků
Příkaz grep je velmi silný. Pro filtrování výsledků můžete použít množství technik pro porovnávání vzorků.
V tomto příkladu vám ukážeme, jak hledat ř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
inverzní
inverzi
newburgh
nový jeleň
nový galloway
Glasgow
Edinburgh
Chcete-li najít všechna místa s obrácením v názvu, použijte následující syntaxi:
grep inver * místa
Hvězdička (*) zástupný znak znamená 0 nebo mnoho. Proto pokud máte místo nazvané inver nebo místo nazvané inverness pak oba budou vráceny.
Dalším zástupným znakem, který můžete použít, je období (.). Můžete to použít pro jedno písmeno.
grep inver.r místa
Na výše uvedeném příkazu by se nacházely místa nazývaná "inverurie" a "inverse", ale nenašli by se neúmyslně, protože mezi oběma dvěma písmeny r může být pouze jedna zástupná značka.
Doba zástupného znaku je užitečná, ale může způsobit problémy, pokud ji máte jako součást textu, který hledáte.
Podívejte se například na tento seznam názvů domén
- linux.about.com
- kusupport.about.com
- mp3.about.com
- minecraft.about.com
- androidgames.about.com
- netforbeginners.about.com
- everydaylinuxusus.com
- google.co.uk
- google.au
- direct.gov.uk
Chcete-li najít všechny stránky about.coms, stačí vyhledávat pomocí následující syntaxe:
grep * about * domain names
Výše uvedený příkaz by spadl, pokud by obsahoval následující název:
- everydaylinuxuser.com/about.html
Mohli byste proto zkusit následující syntaxi:
grep * domain.com
To by fungovalo v pořádku, pokud neexistovala doména s následujícím názvem:
aboutycom.com
Chcete-li skutečně hledat termín about.com, musíte uniknout bodkou následujícím způsobem:
grep * o názvech domén \ .com
Konečným zástupným znakem, který vám ukáže, je otázka, která znamená nula nebo jeden znak.
Například:
grapple placenames
Výše uvedený příkaz vrátí aberdeen, aberystwyth nebo dokonce berwick.
03 ze dne 09
Hledání řetězců na začátku a konci řádku Použití grep
Symboly carat (^) a 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 Spojené Manchester
Pokud jste chtěli najít všechny týmy, které začaly s Manchesterem, použijete následující syntaxi:
grep ^ Manchester týmy
Výše uvedený příkaz by se vrátil Manchester City a Manchester United, ale ne FC United Manchester.
Případně můžete najít všechny týmy, které končí s United, pomocí následující syntaxe:
grep United $ týmy
Výše uvedený příkaz vrátí Manchester United a Newcastle United, ale ne FC United Manchester.
04 ze dne 09
Počítání počtu shody pomocí grep
Pokud nechcete vrátit skutečné řádky, které odpovídají vzoru pomocí grep, ale chcete vědět, kolik existuje, můžete použít následující syntaxi:
grep -c pattern input file
Pokud byl vzor dvakrát porovnán, vrátí se číslo 2.
05 ze dne 09
Hledání všech výrazů, které neodpovídají použití grep
Představte si, že máte seznam míst s následujícími zeměmi:
- aberdeen scotland
- glasgow scotland
- liverpool anglie
- colwyn bay
- Londýn, Anglie
Možná jste si všimli, že v zátoce Colwyn není s ní přidružena žádná země.
Chcete-li vyhledat všechna místa se zemí, můžete použít následující syntaxi:
grep land $ places
Vrátí se výsledky všech míst s výjimkou zálivu Colwyn.
To samozřejmě funguje pouze pro místa, která končí v zemi (sotva vědecká).
Výběr můžete invertovat pomocí následující syntaxe:
grep -v země $ místa
To by nalezlo všechna místa, která neskončila zemí.
06 z 09
Jak najít prázdné čáry v souborech pomocí grep
Představte si, že máte vstupní soubor, který používá aplikace třetí strany, která přestane číst soubor, když najde prázdný řádek takto:
- aberdeen scotland
- inverzní skotsko
- liverpool anglie
- colwyn bay wales
Když se aplikace dostane po linii po liverpoolu, přestane číst, což znamená, že Colwyn Bay je zcela chybí.
Pomocí příkazu grep můžete hledat prázdné řádky s následující syntaxí:
grep ^ $ místa
Bohužel to není zvláště užitečné, protože právě vrací prázdné řádky.
Samozřejmě můžete získat počet prázdných řádků jako kontrolu, zda je soubor platný následovně:
grep -c ^ $ místa
Bylo by však mnohem užitečnější znát čísla řádků, které mají prázdný řádek, abyste je mohli nahradit. Můžete to provést následujícím příkazem:
grep -n ^ $ místa
07 ze dne 09
Jak vyhledávat řetězce velkých nebo malých znaků pomocí grep
Pomocí příkazu grep můžete určit, které řádky v souboru mají velká písmena pomocí následující syntaxe:
grep '[AZ]' název souboru
Hranaté závorky [] umožňují určit rozsah znaků. Ve výše uvedeném příkladu odpovídá libovolnému znaku, který je mezi A a Z.
Chcete-li tedy přiřadit malá písmena, můžete použít následující syntaxi:
grep '[az]' název souboru
Pokud chcete odpovídat pouze písmenům, nikoli číslicím nebo jiným symbolům, můžete použít následující syntaxi:
grep '[a-zA-Z]'
Stejně můžete provést následující čísla:
grep '[0-9]' název souboru
08 z 09
Hledání opakujících se vzorků pomocí grep
Můžete použít zkroucené závorky {} pro vyhledání opakujícího se vzoru.
Představte si, že máte soubor s telefonními čísly následujícím způsobem:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
Víte, že první část čísla musí být tři číslice a chcete najít řádky, které neodpovídají tomuto vzoru.
Z předchozího příkladu víte, že [0-9] vrací všechna čísla v souboru.
V tomto případě chceme řádky, které začínají třemi číslicemi, za kterými následuje pomlčka (-). Můžete to udělat pomocí následující syntaxe:
grep "^ [0-9] [0-9] [0-9] -" čísla
Jak víme z předchozích příkladů, karát (^) znamená, že čára musí začínat následujícím vzorem.
[0-9] vyhledá libovolné číslo v rozmezí 0 až 9. Protože je toto zahrnuto třikrát, odpovídá 3 číslům. Konečně je pomlčka, která označuje, že pomlčka musí mít tři čísla.
Použitím zkroucených závorek můžete provést vyhledávání menší:
grep "^ [0-9] \ {3 \} -" čísla
Lomítko uniká {bracket tak, že funguje jako součást regulárního výrazu, ale v podstatě to, co říká, je [0-9] {3}, což znamená, že libovolné číslo mezi 0 a 9 třikrát.
Konzolové konzoly lze použít také takto:
{5,10}
{5,}
{5,10} znamená, že hledaný znak musí být opakován nejméně pětkrát, ale ne více než 10, zatímco {5,} znamená, že znak musí být opakován alespoň pětkrát, ale může to být více než to.
09 z 09
Použití výstupu z jiných příkazů Použití příkazu grep
Zatím jsme se podívali na přizpůsobení vzoru v rámci jednotlivých souborů, ale grep může použít výstup z ostatních příkazů jako vstup pro přizpůsobení vzoru.
Velkým příkladem toho je použití příkazu ps, který uvádí aktivní procesy.
Například spusťte následující příkaz:
ps -ef
Zobrazí se všechny spuštěné procesy ve vašem systému.
Pomocí příkazu grep můžete vyhledávat konkrétní spuštěný proces následujícím způsobem:
ps -ef | grep firefox