Linux a systémy podobné UNIXu jsou všechny informace o konfiguraci systému uloženy a manipulovány ve formě prostého textu. Hledání textu by tedy bylo velmi častým úkolem pro úpravy a analýzu protokolů.
Příkaz grep umožňuje vyhledávat text nebo řetězec v souboru nebo z výstupní konzole příkazu, termín nebo vzor vyhovující regulárním výrazům. Když grep najde shodu v řádku, zkopíruje výsledky na obrazovku, tj. stdout.
V tomto tutoriálu se s praktickými příklady naučíme používat příkaz grep.
Příkaz Grep
Než začneme vysvětlovat jeho použití, podívejme se na syntaxi příkazu grep.
grep [OPTIONS] PATTERN [FILE...]
Podrobně probereme nejběžnější možnosti a vzory grep, které můžeme použít pro vyhledávání.
Jak hledat řetězec v souboru
V níže uvedeném příkladu grep hledá v souboru /etc/passwd řetězec 'root' a přesměrovaný výstup na stdout.
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
Vyhledávání textu z více souborů
Pomocí následujícího příkazu můžete vyhledat konkrétní text z více souborů:
$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root
Vyhledávání bez ohledu na velikost písmen Grep
Možnosti -i
vyhledává daný řetězec/vzor necitlivě.
V následujících příkladech grep odpovídá všem slovům jako „hal“, „HAL“ bez ohledu na velikost písmen:
$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
Rekurzivní vyhledávání
Rekurzivního vyhledávání je dosaženo pomocí -r
možnost, která bude prohledávat rekurzivně všechny soubory a přeskakovat symbolické odkazy. Pokud chcete zahrnout symbolické odkazy, použijte -R
.
V následujícím příkladu bude příkaz grep hledat řetězec 'ngnix' ve všech souborech v /var
adresář.
$ grep -r nginx /var
Vyhledejte řetězec ve výstupu příkazu (stdout)
Můžete použít výstup roura pro příkaz a grep pro vzor z jeho výstupu.
V následujícím příkladu hledám soubor s názvem 'backup' pomocí příkazu ls
$ ls | grep backup
Zde dělám více kanálů a hledám proces 'docker' a 'apache' z příkazu ps.
$ ps -ef | grep docker | grep apache
Regulární výrazy v souborech
Regulární výrazy jsou vzor pro každý vstupní řádek. Basic a Extended jsou dva regulární výrazy používané příkazem grep.
Základní regulární výraz
Ve výchozím nastavení grep interpretuje vzor jako základní regulární výraz.
Symbol ^ (stříška) – Vzor, který za ním následuje, se musí vyskytovat na začátku každého řádku. V následujícím příkladu se řetězec ^welcome bude shodovat, pouze pokud se vyskytuje na samém začátku řádku.
$ grep “^welcome” filename
Rozšířený regulární výraz
Použijte -E
(nebo --extended-regexp), pokud chcete, aby to grep chápal jako rozšířený regulární výraz.
Následující příkaz extrahuje všechny odkazy ze souboru
$ grep –Eoi '<a[^>]+>.*</a>' filename
o
:Ve výchozím nastavení grep vytiskne celý řádek, který obsahuje vyhledávací vzor. Tato volba dává příkazu grep pokyn, aby vytiskl pouze odpovídající slova namísto celého řádku.
i
:Tato volba požádá příkaz grep, aby ignoroval velká a malá písmena při porovnávání vzoru.
Vyhledejte celé slovo pomocí grep
-w
příznak (word-regexp) pro grep způsobí, že daný výraz bude odpovídat pouze celým slovům.
$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
Zobrazení řádků po shodě řetězce
-A
možnost, která zobrazí N
řádků po shodě řetězce.
$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
Zobrazení řádků před shodou řetězce
Můžeme použít -B
možnost zobrazení N řádků před řetězcem pro daný soubor
$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Hledat více řetězců
Můžeme vyhledávat více vzorů nebo řetězců pomocí operátoru OR |
a \|
. -E
(extended-regexp) určuje, zda je potřeba ukončit určité speciální znaky. -e
je striktně příznak pro označení vzoru, se kterým chcete porovnávat.
Příklad 1:použití volby -E
$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh
Nebo
$ grep -E "foo|bar" *.txt
Příklad 2:bez -E
$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh
Nebo
$ grep "foo\|soul\|bar" *.txt
Vyloučit konkrétní soubor z vyhledávání
Pro ignorování hledání můžete použít volbu -v. Následující příkaz vyhledá řetězec 'error' ve všech souborech kromě 'syslog.log'
$ grep -r error * | grep -v ‘/\syslog.log/’
Závěr
V tomto tutoriálu jsme se naučili používat příkaz grep k vyhledání textu v souborech. Doufám, že se vám toto čtení líbilo a zanechte prosím své návrhy v sekci komentářů níže.