Správné použití příkazů Find a Grep v Linuxu

Většina začínajících uživatelů unixových systémů, zejména Linux, není obeznámena se základními operátory příkazového řádku používanými v tomto OS. Podívejme se blíže na funkce a použití vyhledávacích a grepových operátorů.

Použití příkazů Find a Grep v Linuxu.

Najít

Příkaz Linux find je nástroj příkazového řádku pro procházení hierarchií souborů. Lze jej použít pro vyhledávání souborů a adresářů a následné operace s nimi. Podporuje vyhledávání podle souboru, složky, názvu, data vytvoření, data změny, vlastníka a oprávnění. Pomocí příkazu -exec lze pro nalezené soubory nebo složky provádět další příkazy systému UNIX. Syntaxe:

$ find [kde začít hledat] [výraz určuje, co najít] [-options] [co najít]

Možnosti:

  • -exec - požadovaný soubor, který splňuje výše uvedená kritéria a vrací 0 jako stav ukončení pro úspěšné provedení příkazu;
  • -ok - funguje stejně jako -exec, kromě toho, že uživatel je nejprve vyzván;
  • -inum N - hledat s číslem "N";
  • -links N - vyhledávání s odkazy "N";
  • -name demo - hledání souborů uvedených v „demo“;
  • -newer file - hledání souborů, které byly upraveny / vytvořeny po „file“;
  • -perm osmičkové - hledání, pokud je rozlišení osmičkové;
  • -print - zobrazí cestu k dokumentům nalezeným podle jiných kritérií;
  • -empty - hledání prázdných dokumentů a adresářů;
  • -size + N / -N - vyhledávací bloky „N“; "N" a "c" lze použít k měření velikosti znaků; „+ N“ znamená větší velikost „N“ bloků a „-N“ znamená menší velikost „N“ bloků;
  • -user name - vyhledá dokumenty, které patří k uživatelskému jménu nebo identifikátoru "name";
  • (expr) - True, pokud "expr" je pravdivé; Slouží ke seskupení kritérií ve spojení s OR nebo AND.

Grep

Příkaz grep se používá k vyhledávání souborů. Funkce znamená „globální tisk regulárních výrazů“ a je jedním z nejsilnějších a často používaných příkazů v Linuxu. Příkaz hledá jeden nebo více vstupních souborů, které odpovídají zadanému vzoru, a zapíše každý odpovídající řádek na standardní výstup. Pokud nejsou zadány žádné soubory, příkaz přečte ze standardního vstupu, který je obvykle výstupem jiného příkazu. V tomto článku vám ukážeme, jak zadat příkaz, s praktickými příklady a podrobným vysvětlením nejběžnějších možností GNU grep.

Syntaxe příkazu

Než začneme používat příkaz, začněme přezkoumáním základní syntaxe. Pomocné výrazy mají následující tvar:

[MOŽNOSTI] VZOR [SOUBOR ...]

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

  • MOŽNOSTI - nula nebo více možností. Tým poskytuje řadu možností, které řídí jeho chování.
  • PATTERN - Vzor vyhledávání.
  • FILE - nula nebo více názvů vstupních souborů.

Jak zadat příkaz pro vyhledávání souborů

Hlavním účelem příkazu je vyhledat text v souboru. Chcete-li například zobrazit soubor / etc / passwd obsahující řádek bash, můžete použít následující příkaz:

$ grep bash / etc / passwd

Výstup by měl vypadat takto:

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domain: / home / domain: / bin / bash

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

$ "Správce zobrazení Gnome" / etc / passwd

Invertovat shodu (ex)

Chcete-li zobrazit řádky, které neodpovídají vzoru, zadejte parametr –v (nebo –invert-match). Chcete-li například zobrazit soubor, který neobsahuje soubor nologin ze souboru / etc / passwd, můžete zadat následující příkaz:

$ -v nologin / etc / passwd

Výstup:

root 0: 0: root: / root: / bin / bash

colord 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: git daemon uživatel: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Jak použít příkaz pro vyhledávání ve výstupu

Pokud zadáte vstupní soubory, můžete přesměrovat výstup jiného příkazu a zobrazit pouze řádky, které odpovídají zadanému vzoru. Chcete-li například zjistit, které procesy ve vašem systému běží jako uživatel www dat, můžete použít následující příkaz:

$ ps -ef | www-data

Výstup:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pool www

kořen 18272 17714 0 16:00 pts / 0 00:00:00 —barva = auto - vyloučit-dir = .bzr —exclude-dir = CVS —exclude-dir = .git —exclude-dir = .hg —exclude-dir = .svn www-data

www-data 31147 12770 0 Oct22? Nginx: pracovní proces

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proces správce mezipaměti

Můžete také kombinovat více kanálů do týmu. Jak vidíte na výstupu výše, je zde také řádek obsahující proces. Pokud nechcete, aby byl tento řádek zobrazen, odešlete výstup do jiné instance, jak je uvedeno níže.

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

Výstup:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pool www

kořen 18272 17714 0 16:00 pts / 0 00:00:00 —barva = auto - vyloučit-dir = .bzr —exclude-dir = CVS —exclude-dir = .git —exclude-dir = .hg —exclude-dir = .svn www-data

www-data 31147 12770 0 Oct22? Nginx: pracovní proces

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proces správce mezipaměti

Rekurzivní vyhledávání

Chcete-li rekurzivně hledat vzorek, zadejte volbu –r (nebo –regresivní). To vám umožní prohledávat všechny soubory v zadaném adresáři a přeskakovat symbolické odkazy, které se vyskytují rekurzivně. Pro zobrazení všech symbolických odkazů použijte volbu –r (nebo –dereference-rekurzivní). V následujícím příkladu hledáme domain.com ve všech souborech v adresáři / etc:

$ -r domain.com / etc

Příkaz vytiskne odpovídající pole s předponou úplné cesty k souboru.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: název_serveru domain.com www.domain.com;

Pokud místo –r použijete volbu –R, příkaz bude následovat všechny symbolické odkazy:

$ -R domain.com / etc

Všimněte si poslední výstupní pole. Toto není vytištěno ve výše uvedeném příkladu, protože soubory v adresáři Nginx s povoleným webem jsou symbolickými odkazy na konfigurační soubory uvnitř adresáře, který je k dispozici.

Výstup:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: název_serveru domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: název_serveru domain.com www.domain.com;

Zobrazit pouze název souboru

Chcete-li potlačit výchozí výstup a tisknout pouze názvy souborů s odpovídajícím vzorem, můžete zadat volbu –l (nebo —files-with-matching “). Chcete-li například vyhledat všechny soubory končící v aktuálním pracovním adresáři .conf a vytisknout pouze názvy souborů obsahující typ domain.com, zadejte:

$ –L domain.com * .conf

Výstup bude vypadat takto:

tmux.conf

haproxy.conf

Volba -l se obvykle používá ve spojení s volbou rekurzivní -R:

$ -R domain.com / tmp

Necitlivost na případy

Ve výchozím nastavení příkaz rozlišuje velká a malá písmena, což znamená, že velká a malá písmena jsou považována za odlišná. Chcete-li ignorovat případ při vyhledávání, zadejte volbu –i (nebo –ignore-case). Pokud například hledáte Zebra bez jakékoli volby, následující příkaz nebude zobrazovat žádný výstup, tj. tam jsou odpovídající.

$ Zebra / usr / share / words

Pokud však provádíte vyhledávání nerozlišující velká a malá písmena, použijte volbu –i, bude se shodovat s velkými i malými písmeny:

$ grep -i Zebra / usr / share / words

Indikace “Zebra” bude odpovídat “Zebra”, “ZEbrA” nebo jiné kombinaci velkých a malých písmen.

Výstup:

zebra

zebra

zebry

Přesná shoda

Při hledání bude gnu také tisknout gnu, do kterého budou vkládána větší slova, například cygnus nebo magnum.

$ gnu / usr / share / words

Výstup:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

magnuson

sphagnum

wingnut

Pro návrat pouze těch výrazů, ve kterých je zadané pole celé slovo (není uzavřeno slovem), můžete použít volbu –w (nebo —word-regexp).

DŮLEŽITÉ. Mezi znaky slova patří alfanumerické znaky (az, AZ a 0-9) a podtržítka (_). Všechny ostatní znaky jsou považovány za neverbální znaky.

Pokud spustíte stejný příkaz jako výše, včetně volby –w, příkaz vrátí pouze ty, které obsahují gnu jako samostatné slovo.

$ grep -w gnu / usr / share / slova

Výstup: gnu

Zobrazit čísla

Chcete-li zobrazit počet řádků obsahujících vzorek, použijte parametr –n (nebo – line-number). Pomocí této možnosti vytisknete shodné položky se standardním výstupem s předponou čísla, ve kterém byla nalezena. Chcete-li například zobrazit soubor / etc / services obsahující předponu bash s odpovídajícím číslem, můžete použít následující příkaz:

$ grep -n 10000 / etc / services

Níže uvedený výstup ukazuje, že shody jsou na 10423 a 10424.

Výstup:

10423: ndmp 10 000 / tcp

10424: ndmp 10000 / udp

Počítání

Chcete-li vytisknout počet odpovídajících řádků na standardní výstup, použijte parametr –c (nebo –count). V níže uvedeném příkladu počítáme počet účtů, které mají shell / usr / bin / zsh.

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

Výstup: 4

Několik řádků (vzory)

Operátor OR může kombinovat dva nebo více vyhledávacích vzorů. Ve výchozím nastavení příkaz interpretuje jako hlavní regulární výraz, ve kterém metaznaky ztrácejí svůj konkrétní význam a měly by být použity jejich verze s zpětným lomítkem. V níže uvedeném příkladu hledáme všechny výskyty slov fatálních, chyb a kritických v souboru protokolu chyb Nginx:

$ grep 'fatální' chyba kritická '/var/log/nginx/error.log

Pokud použijete volbu rozšířeného regulárního výrazu –E (nebo -extended-regexp), příkaz by neměl být vynechán, jak je uvedeno níže:

$ grep -E 'fatální | chyba | kritický' /var/log/nginx/error.log

Regulární výraz

GNU Grep má dvě sady funkcí regulárního výrazu - Basic a Extended. Ve výchozím nastavení funkce interpretuje vzor jako základní regulární výraz, pro přepnutí na rozšířené regulární výrazy, musíte použít volbu –E. Při použití regulárních výrazů v hlavním režimu jsou všechny ostatní znaky, s výjimkou metaznaků, vlastně regulárními výrazy, které vzájemně odpovídají. Níže je uveden seznam nejčastěji používaných znaků:

  • Použijte znak ^ (znak znaku), aby odpovídal výrazu na začátku řádku. V následujícím příkladu bude ^ kangaroo odpovídat pouze v případě, že se objeví na samém začátku: $ grep "^ kangaroo" file.txt
  • Použijte symbol $ (dolar), aby odpovídal výrazu na konci. V následujícím příkladu bude kangaroo $ odpovídat pouze v případě, že se objeví na samém konci: grep "kangaroo $" file.txt
  • Použijte symbol. (tečka), aby odpovídala libovolnému jednotlivému znaku. Například, aby odpovídal vše, co začíná kan dvěma znaky a končí roo, můžete použít následující vzor: $ grep "kan..roo" file.txt
  • Použijte [] (závorky), aby odpovídaly libovolnému jednotlivému znaku uzavřenému v závorkách. Například najít ty, které obsahují akcent nebo "přízvuk, můžete použít následující vzor: $ grep" acce [np] t "file.txt

Chcete-li se vyhnout speciálnímu významu dalšího znaku, použijte znak \ t

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

Chcete-li interpretovat vzor jako rozšířený regulární výraz, použijte parametr –E (nebo –extended-regexp). Rozšířené regulární výrazy zahrnují všechny základní metacharaktery a další metaznaky pro vytváření složitějších a výkonnějších vzorů vyhledávání. Níže uvádíme několik příkladů:

  • Shoda a rozbalení všech e-mailových adres z tohoto souboru: $ grep -E -o "[A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + [A-Za-z] {2.6} b "file.txt
  • Mapovat a extrahovat všechny platné IP adresy z tohoto souboru: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 (25 [0-5] | 2 [0-4] [0-9] | [01] a [0-9] [0-9] a) (25 [0- 5] | 2 [0-4] [0-9] | [01] a [0-9] [0-9] a) (25 [0-5] | 2 [0-4] [0- 9] | [01] a [0-9] [0-9]?) 'File.txt

Volba -o se používá k tisku pouze shod.

Tisk před počítáním

Chcete-li před přiřazením vytisknout určitý počet řádků, použijte parametr –B (nebo „před kontextem“). Chcete-li například před porovnáním zobrazit 5 řádků počátečního kontextu, můžete použít následující příkaz: $ grep -A 5 root / etc / passwd

Tisknout po hledání

Chcete-li po shodě vytisknout určitý počet řádků, použijte parametr –A (nebo –after-context). Chcete-li například zobrazit 5 řádků konečného kontextu po odpovídajících řetězcích, můžete použít následující příkaz: $ grep -B 5 root / etc / passwd

To je nezbytné pro plné využití informací příkazů. Pokud již používáte Linux a můžete poskytnout jakékoli rady pro začátečníky, podělte se o komentáře podle tohoto článku.