Hlavní navigace

Hrátky z řádky: grep v mnoha příchutích

30. 8. 2012
Doba čtení: 5 minut

Sdílet

Příkaz grep zná pravděpodobně každý, kdo už zavítal do unixové příkazové řádky. Je to jeden z klasických systémových programů a brzy oslaví čtyřicet let od svého vzniku. Existuje celá řada jeho odnoží a některé zajímavé tipy si ukážeme v dnešním článku. Budeme grepovat síť, procesy a grep si obarvíme.

Článků typu „podrobný návod k používání grepu“ byly napsány celé harddisky. Pokud projevíte zájem, můžeme pro vás nějaký další klidně připravit. Tento článek ale bude z jiného šuplíku. Jeho cílem není naučit vás dokonale používat grep za osm a půl minuty, ale spíše ukázat některé další možnosti, o kterých jste třeba neslyšeli.

Grep v barvách

Grep standardně nijak neobarvuje svůj výstup. Pokud ale grepujeme dlouhé řádky, hodí se nám možnost obarvovat nalezené řetězce. Slouží k tomu parametr --color, za který musíme uvést, kdy se má výstup obarvovat. Doporučuji přidat =auto. Grep pak inteligentně obarvuje jen výstup na terminál. Pokud použijeme přesměrování do souboru, obarvení se samo vypne. Můžete také použít variantu =never nebo  =always.

Pokud chcete obarvování nechat zapnuté trvale, připište si do souboru ~/.bashrc následující řádek.

export GREP_OPTIONS='--color=auto'

Standardně grep obarvuje červeně, jak vidíte na obrázku. Pokud se vám tahle barva nelíbí, můžete ji změnit proměnnou GREP_COLOR nebo novější a podrobnější GREP_COLORS. Pokud chcete místo červené zelenou, přidejte si do  ~/.bashrc:

export GREP_COLOR='1;32'

Pro obarvování se používají klasické escape sekvence, které najdete v článku Barvy pro shell. Podle něj si můžete zvolit svou oblíbenou barvu. Poznámka: Některé distribuce (třeba Gentoo) tohle mají ve výchozím stavu už zapnuté.

Ngrep pro grepování sítě

Velmi zajímavou a užitečnou variantou grepu je ngrep. Ten umí prakticky totéž co klasický grep, ale aplikuje se na síťový provoz. Můžete tak jednoduše ze sítě vyzobávat konkrétní data a pak je třeba podrobněji analyzovat pomocí nástroje Wireshark.

Ngrep umí filtrovat pomocí syntaxe pcap, takže můžete jednoduše vybírat pakety podle protokolu, portu, zdrojové či cílové adresy a podobně. Pokud syntaxi neznáte, podívejte se do manuálové stránky pcap-filter. Přidáme několik příkladů využití ngrep:

Potřebujete zjistit, odkud tahá flashový přehrávač rádia svůj stream.

# ngrep -q -d eth0 '^GET.*mp3'

Chcete zaznamenat veškerý DNS provoz včetně časových značek.

# ngrep -O /tmp/dns_provoz.pcap -d any -T port 53

Zapomněli jste heslo uložené ve svém FTP klientovi a chcete ho zjistit.

# ngrep -i -q 'pass|user' port 21

Toto jsou reálné příklady, ke kterým jsem už ngrep použil. Určitě jich ale najdete daleko více. Příkaz se hodí zejména při hledání problémů na síti.

Pgrep pro hledání procesů

Pokud chcete vyhledat konkrétní proces, můžete použít ps a jeho výstup poslat přes awk, grep nebo jiný „filtr“. Existuje ale utilita pgrep, který tohle umí přímo. Ve výchozím stavu vypíše PID všech procesů, jejichž název obsahuje zadaný řetězec.

$ pgrep sh
1489
1564
2856
2880
2929
27907
28065
28184
30673

Pokud chcete vidět i názvy procesů, přidejte parametr  -l.

$ pgrep sh -l
1489 flush-8:0
1564 gvfsd-trash
2856 kdmflush
2880 flush-254:0
2929 ssh-agent
27907 bash
28065 bash
28184 bash
30673 bash

Pravidel je možné aplikovat samozřejmě více, například můžete určit uživatele, kterému mají procesy patřit.

$ pgrep -u petr -l sh
1564 gvfsd-trash
2929 ssh-agent
27907 bash
28065 bash
28184 bash
30673 bash

Můžeme také invertovat požadavek (třeba úlohy, které nepatří uživateli root) pomocí -v nebo si nechat vypsat jen poslední spuštěný proces pomocí  -n.

Grepcidr hledá v IP adresách

Velmi užitečná varianta grepu, která se hodí zejména při filtrování logů ze sítě. Rozumí totiž CIDR zápisu IP adres. Tedy zápisu prefixu nebo rozsahu adres. Pokud pak prohledáváme logy, můžeme si grepnout jen ty řádky, kde se vyskytuje některá IP adresa z našeho rozsahu.

$ grepcidr 192.168.1.0/24 /var/log/sitovy_log.log

Kromě CIDR je možné použít i rozsah, třeba 192.168.1.1-192.168.10.20. Pokud máte rozsahů více, můžete si ze zapsat do souboru po řádcích a pak je načítat pomocí parametru -f. Jedinou vadou utility grepcidr je, že nepodporuje (zatím?) IPv6.

PDFgrep hledá v PDF

Další malou šikovnou grepovskou utilitkou je pdfgrep. Už podle názvu je zřejmé, že umí prohledávat obsah PDF dokumentu. Opět zvládá spoustu přepínačů z klasického grepu, v následujícím příkladu jsem použil jen -i pro ignorování velkých/malých písmen.

$ pdfgrep -i sixxs Satrapa-internetovy-protokol-ipv6-treti-vydani.pdf
6 Generátor prefixů je k dispozici na adrese http://www.sixxs.net/tools/grh/ula/
                 poskytovatelé tunelových serverů: Freenet6, SixXS a Hurricane Electric. Je-
 SixXS Velice podobné služby nabízí i síť SixXS. Opět se jedná o systém otevře-
 SixXS Velice podobné služby nabízí i síť SixXS. Opět se jedná o systém otevře-
       tras menší, než v případě konkurenčních služeb. SixXS nemá anonymní re-
www▸          http://www.sixxs.net/
       „proč já, nebohý zemský červ, požaduji na SixXS připojení“. Ne aby vás na-
       na schvalování žádostí a nutnost hlídat kredity od SixXS spolehlivě odradí
                                 Obrázek 13.2: Parametry tunelu u SixXS
žádat o založení tunelu (Create Regular Tunnel). Na rozdíl od SixXS žádost
                   U SixXS je rozjezd znatelně pomalejší, odměnou vám ale bude připojení
vykazovaly dramatické odlišnosti. Ovšem jakmile zamíříte domů, SixXS se
test6.cesnet.cz) připojení přes SixXS vykazuje pro IPv6 přibližně o 10 % nižší
Hustota sítě serverů Hurricane Electric převyšuje Freenet6, ale na SixXS ne-
radvd, 371                         SixXS, 295

Samozřejmě je možné pdfgrepovat ve více souborech najednou, program pak na výstupu sype i názvy souborů, ve kterých byl řetězec nalezen. Šikovný je ještě parametr -n, který do výstupu přidává čísla stran, na kterých se nalezené řádky nalézají.

Taggrepper prohledá vaši hudební sbírku

Taggrepper umí v hudebních souborech (mp3, Ogg, FLAC) prohledávat tagy. Můžete si tak ve své sbírce najít hudbu konkrétních interpretů, žánrů nebo z konkrétního roku. K tomu má utilita řadu parametrů, ze kterých zmíníme jen ty nejběžnější.

CS24_early

  • t – název skladby
  • a – jméno umělce
  • l – název alba
  • y – rok nahrání
  • g – žánr

Použití je pak už jednoduché. Můžeme si třeba nechat ve své sbírce nechat najít všechny písničky od jednoho interpreta.

$ taggrep -a Gott -r /home/petr/mp3/

Grepuji, tedy jsem

Grep je základní unixová utilita, bez které se neobejde žádný admin. Jak je vidět, za čtyřicet let své existence inspirovala řadu dalších autorů, kteří se rozhodli na jejím základě napsat utilitky pro konkrétní využití. Je užitečné jich pár znát, třeba zmíněný ngrep používám poměrně často. Znáte ještě nějaké příbuzné grepu?

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.