grep
je výkonný nástroj příkazového řádku, který se používá k prohledávání jednoho nebo více vstupních souborů pro řádky, které odpovídají regulárnímu výrazu, a zapisuje každý odpovídající řádek na standardní výstup.
V tomto článku vám ukážeme, jak vyloučit jedno nebo více slov, vzorů nebo adresářů při vyhledávání pomocí grep
.
Vyloučit slova a vzory #
Chcete-li zobrazit pouze řádky, které neodpovídají vyhledávacímu vzoru, použijte -v
(nebo --invert-match
).
Chcete-li například vytisknout řádky, které neobsahují řetězec nologin
byste použili:
grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
-w
volba říká grep
vrátit pouze ty řádky, kde je zadaný řetězec celé slovo (uzavřené neslovnými znaky).
Ve výchozím nastavení grep
rozlišuje velká a malá písmena. To znamená, že velká a malá písmena jsou považována za odlišná. Chcete-li při vyhledávání ignorovat velká a malá písmena, vyvolejte grep
pomocí -i
možnost.
Pokud hledaný řetězec obsahuje mezery, musíte jej uzavřít do jednoduchých nebo dvojitých uvozovek.
Chcete-li zadat dva nebo více vzorů vyhledávání, použijte -e
možnost:
grep -wv -e nologin -e bash /etc/passwd
Můžete použít -e
možnost tolikrát, kolikrát potřebujete.
Další možností, jak vyloučit více vzorů vyhledávání, je spojit vzory pomocí operátoru OR |
.
Následující příklad vytiskne řádky, které neobsahují řetězce nologin
nebo bash
:
grep -wv 'nologin\|bash' /etc/passwd
GNU grep
podporuje tři syntaxe regulárních výrazů, Basic, Extended a Perl-kompatibilní. Ve výchozím nastavení grep
interpretuje vzor jako základní regulární výraz, kde jsou metaznaky jako |
ztratí svůj zvláštní význam a musíte použít jejich verze se zpětným lomítkem.
Pokud použijete možnost rozšířeného regulárního výrazu -E
, pak operátor |
by nemělo být escapováno, jak je uvedeno níže:
grep -Ewv 'nologin|bash' /etc/passwd
Můžete zadat různé možné shody, které mohou být doslovné řetězce nebo sady výrazů. V následujícím příkladu jsou řádky, kde je řetězec games
vyskytující se na samém začátku řádku jsou vyloučeny:
grep -v "^games" file.txt
Výstup příkazu lze filtrovat pomocí grep
potrubím a na terminálu budou vytištěny pouze čáry odpovídající danému vzoru.
Chcete-li například vytisknout všechny běžící procesy ve vašem systému kromě těch, které běží jako uživatel „root“, můžete filtrovat výstup ps
příkaz:
ps -ef | grep -wv root
Vyloučit adresáře a soubory #
Někdy při provádění rekurzivního vyhledávání pomocí -r
nebo -R
můžete chtít vyloučit konkrétní adresáře z výsledku vyhledávání.
-r
nebo -R
možnosti je, že když je grep vyvolán s velkým R
bude následovat všechny symbolické odkazy
Chcete-li vyloučit adresář z vyhledávání, použijte --exclude-dir
volba. Cesta k vyloučenému adresáři je relativní k vyhledávacímu adresáři.
Zde je příklad ukazující, jak hledat řetězec linuxize
ve všech souborech v /etc
, kromě /etc/pki
adresář:
grep -R --exclude-dir=pki linuxize /etc
Chcete-li vyloučit více adresářů, uzavřete vyloučené adresáře do složených závorek a oddělte je čárkami bez mezer.
Chcete-li například ve svém systému Linux najít soubory obsahující řetězec ‚gnu‘ s výjimkou proc
, boot
a sys
adresáře, které byste spustili:
grep -r --exclude-dir={proc,boot,sys} gnu /
Při použití shody zástupných znaků můžete vyloučit soubory, jejichž základní název odpovídá GLOB specifikovanému v --exclude
možnost.
V níže uvedeném příkladu hledáme ve všech souborech v aktuálním pracovním adresáři řetězec linuxize
, kromě souborů končících na .png
a .jpg
adresář:
grep -rl --exclude=*.{png,jpg} linuxize *
Závěr č.
grep
umožňuje vyloučit vzory a adresáře při hledání souborů.