Android

Příkaz Grep v Linuxu (najděte text v souborech)

Fedora Linux - Argumenty příkazů #07

Fedora Linux - Argumenty příkazů #07

Obsah:

Anonim

Příkaz grep který znamená „globální tisk regulárních výrazů“, je jedním z nejvýkonnějších a nejčastěji používaných příkazů v systému Linux.

Grep prohledává jeden nebo více vstupních souborů pro řádky, které odpovídají danému vzoru, a zapisuje každý odpovídající řádek na standardní výstup. Pokud nejsou zadány žádné soubory, grep přečte ze standardního vstupu, který je obvykle výstupem jiného příkazu.

V tomto tutoriálu vám ukážeme, jak používat příkaz grep prostřednictvím praktických příkladů a podrobných vysvětlení nejběžnějších možností GNU grep .

Syntaxe příkazu Grep

Než se podíváme na to, jak používat příkaz grep , začneme kontrolou základní syntaxe.

Výrazy grep utility mají následující podobu:

grep PATTERN

Položky v hranatých závorkách jsou volitelné.

  • OPTIONS - Nula nebo více možností. Grep poskytuje řadu možností, které řídí jeho chování. PATTERN - Hledání vzoru. FILE - Nula nebo více názvů vstupních souborů.

Aby uživatel mohl soubor prohledávat, musí mít uživatel, který příkaz spouští, přístup ke čtení.

Jak používat grep k hledání řetězce v souborech

Nejzákladnějším použitím příkazu grep je hledání řetězce (textu) v souboru.

Chcete-li například zobrazit řádky ze souboru /etc/passwd obsahující řetězec bash , můžete použít následující příkaz:

grep bash /etc/passwd

Výstup by měl vypadat asi takto:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Pokud řetězec obsahuje mezery, musíte jej uzavřít do jednoduchých nebo dvojitých uvozovek:

grep "Gnome Display Manager" /etc/passwd

Invertovat shodu (Vyloučit)

Chcete-li zobrazit čáry, které neodpovídají vzoru, použijte volbu -v (nebo - --invert-match ).

Chcete-li například zobrazit řádky ze souboru /etc/passwd , které neobsahují řetězec nologin , můžete použít následující příkaz:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Jak používat Grep k hledání řetězce ve výstupním příkazu

Místo zadání vstupních souborů můžete poslat výstup jiného příkazu do grep a pak zobrazit pouze řádky odpovídající danému vzoru.

Chcete-li například zjistit, které procesy ve vašem systému běží jako uživatel www-data , můžete použít následující příkaz ps :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Můžete také zřetězit více potrubí na příkaz. Jak je vidět na výstupu výše, existuje také řádek obsahující proces grep . Pokud nechcete, aby se tento řádek zobrazoval, předejte výstup do jiné grep instance, jak je ukázáno níže.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Rekurzivní vyhledávání

Chcete-li rekurzivně hledat vzorek, použijte volbu -r (nebo --recursive ). Tím se prohledají všechny soubory v zadaném adresáři a přeskočí se na odkazy, které se vyskytují rekurzivně. Chcete-li sledovat všechny symbolické odkazy, použijte volbu -R (nebo --dereference-recursive ).

V následujícím příkladu hledáme řetězec linuxize.com ve všech souborech v adresáři /etc :

grep -r linuxize.com /etc

Příkaz vytiskne odpovídající řádky předponou úplnou cestou k souboru.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Pokud místo toho použijete volbu -R grep bude následovat všechny symbolické odkazy:

grep -R linuxize.com /etc

Všimněte si posledního řádku výstupu. Tento řádek není ve výše uvedeném příkladu vytištěn, protože soubory uvnitř adresáře s sites-enabled Nginx jsou odkazy na konfigurační soubory uvnitř adresáře s sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Zobrazit pouze název souboru

Chcete-li potlačit výchozí výstup grep a tisknout pouze názvy souborů obsahujících odpovídající vzor, ​​můžete použít volbu -l (nebo --files-with-matches ).

Například prohledávat všechny soubory končící na .conf v aktuálním pracovním adresáři a tisknout pouze názvy souborů obsahujících typ řetězce linuxize.com :

grep -l linuxize.com *.conf

Výstup bude vypadat asi takto:

tmux.conf haproxy.conf

Možnost -l se obvykle používá v kombinaci s rekurzivní volbou -R :

grep -Rl linuxize.com /tmp

Vyhledávání bez rozlišování velkých a malých písmen

Ve výchozím nastavení příkaz grep rozlišuje velká a malá písmena. To znamená, že velká a malá písmena jsou považována za zřetelná.

Chcete-li při vyhledávání ignorovat případ, použijte volbu -i (nebo --ignore-case ).

Například při hledání Zebra bez jakékoli možnosti, následující příkaz nezobrazí žádný výstup, tj. Existují odpovídající řádky:

grep Zebra /usr/share/words

Pokud však provedete vyhledávání nerozlišující velká a malá písmena pomocí volby -i , bude se shodovat velká i malá písmena:

grep -i Zebra /usr/share/words

Zadáním slova „Zebra“ bude odpovídat „zebra“, „ZEbrA“ nebo jakékoli jiné kombinaci velkých a malých písmen pro daný řetězec.

zebra zebra's zebras

Hledejte úplná slova

Při hledání výrazu „gnu“ grep vytiskne také řádky, ve kterých je výraz „gnu“ vložen většími slovy, například „cygnus“ nebo „magnum“.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Chcete-li vrátit pouze ty řádky, ve kterých je zadaný řetězec celé slovo (uzavřené jinými slovy než znaky), použijte volbu -w (nebo --word-regexp ).

Znaky slov zahrnují alfanumerické znaky ( az , AZ a 0-9 ) a podtržítka ( _ ). Všechny ostatní znaky jsou považovány za jiné slovo.

grep -w gnu /usr/share/words

gnu

Zobrazit čísla linek

Chcete-li zobrazit počet řádků, které obsahují řetězec, který odpovídá vzoru, použijte volbu -n (nebo --line-number ). Při použití této možnosti grep vytiskne zápasy na standardní výstup s předponou s číslem řádku, na kterém bylo nalezeno.

Chcete-li například zobrazit řádky ze souboru /etc/services obsahující řetězec bash s předponou odpovídajícím číslem řádku, můžete použít následující příkaz:

grep -n 10000 /etc/services

Výstup níže ukazuje, že shody jsou nalezeny na řádcích 10423 a 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Počet shody

Chcete-li vytisknout počet odpovídajících řádků na standardní výstup, použijte volbu -c (nebo --count ).

V níže uvedeném příkladu spočítáme počet účtů, které mají jako shell shell /usr/bin/zsh .

grep -c '/usr/bin/zsh' /etc/passwd

4

Vyhledat více řetězců (vzory)

Pomocí operátoru OR | lze spojit dva nebo více vzorů vyhledávání.

Ve výchozím nastavení interpretuje grep vzor jako základní regulární výraz, kde meta-znaky, jako je | ztratí svůj zvláštní význam a je nutné použít jejich zpětně lomené verze.

V níže uvedeném příkladu prohledáváme všechny výskyty slov fatal , error a critical v souboru chyb protokolu Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Tichý režim

-q (nebo --quiet ) říká grep aby na terminál nic nenapsal (standardní výstup). Pokud je nalezena shoda, příkaz skončí se stavem 0 . To je užitečné při použití grep ve shell skriptech, kde chcete zkontrolovat, zda soubor obsahuje řetězec a provést určitou akci v závislosti na výsledku.

Zde je příklad použití grep v tichém režimu jako testovacího příkazu v příkazu if :

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Základní regulární výraz

GNU Grep má dvě sady funkcí regulárních výrazů, základní a rozšířenou. Ve výchozím nastavení interpretuje grep vzor jako základní regulární výraz.

Při použití v základním režimu regulárních výrazů jsou všechny ostatní znaky kromě meta-znaků ve skutečnosti regulární výrazy, které se shodují. Níže je uveden seznam nejčastěji používaných meta-znaků:

  • Použijte symbol ^ (stříška) k přiřazení výrazu na začátku řádku. V následujícím příkladu bude řetězec ^kangaroo odpovídat, pouze pokud k němu dojde na samém začátku řádku.

    grep "^kangaroo" file.txt

    Použijte symbol $ (dolar) k přiřazení výrazu na konci řádku. V následujícím příkladu bude řetězec kangaroo$ odpovídat, pouze pokud k němu dojde na samém konci řádku.

    grep "kangaroo$" file.txt

    Použijte . (tečka) symbol, který odpovídá jednomu znaku. Chcete-li například porovnat vše, co začíná na kan pak má dva znaky a končí řetězcem roo , můžete použít následující vzorec:

    grep "kan..roo" file.txt

    Použití (závorky), aby odpovídaly jednotlivým znakům uzavřeným v závorkách. Například najděte řádky, které obsahují accept nebo „ accent , můžete použít následující vzor:

    grep "accet" file.txt

    Použití (závorky), aby odpovídaly jednotlivým znakům uzavřeným v závorkách. Následující vzor bude odpovídat jakékoli kombinaci řetězců obsahujících co(any_letter_except_l)a , jako je coca , cobalt atd., Ale nebude odpovídat řádkům obsahujícím cola , grep "coa" file.txt

Chcete-li uniknout zvláštnímu významu dalšího znaku, použijte symbol \ (zpětné lomítko).

Rozšířené regulární výrazy

K interpretaci vzoru jako rozšířeného regulárního výrazu použijte volbu -E (nebo --extended-regexp ). Rozšířené regulární výrazy zahrnují všechny základní meta-znaky spolu s dalšími meta-znaky pro vytvoření složitějších a výkonnějších vzorů vyhledávání. Níže uvádíme několik příkladů:

  • Porovnejte a rozbalte všechny e-mailové adresy z daného souboru:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Porovnejte a extrahujte všechny platné adresy IP z daného souboru:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Možnost -o se používá k tisku pouze odpovídajícího řetězce.

Tisk čar před zápasem

Chcete-li vytisknout určitý počet řádků před odpovídajícími řádky, použijte volbu -B (nebo --before-context ).

Například pro zobrazení pěti řádků úvodního kontextu před odpovídajícími řádky byste použili následující příkaz:

grep -B 5 root /etc/passwd

Tisk čar po zápase

Chcete-li vytisknout určitý počet řádků po odpovídajících řádcích, použijte volbu -A (nebo --after-context ).

Například pro zobrazení pěti řádků koncového kontextu po odpovídajících řádcích byste použili následující příkaz:

grep -A 5 root /etc/passwd

Závěr

Příkaz grep vám umožní vyhledat vzor uvnitř souborů. Pokud je nalezena shoda, grep vytiskne řádky obsahující zadaný vzor.

O Grepovi se dozvíte mnohem více na stránce Grep User's Manual.

grep terminál