GNU/Linux >> Znalost Linux >  >> Linux

Jak používat Linuxový příkaz grep

Jedním z klasických unixových příkazů, vyvinutých již v roce 1974 Kenem Thompsonem, je příkaz Global Regular Expression Print (grep). Je tak všudypřítomný ve výpočetní technice, že se často používá jako sloveso ("procházení souboru") a v závislosti na tom, jak podivínské je vaše publikum, se hodí i do scénářů reálného světa. (Například „Budu muset grep své paměťové banky vyvolat, abych si tuto informaci vybavil.“) Stručně řečeno, grep je způsob, jak v souboru vyhledávat konkrétní vzor znaků. Pokud to zní jako moderní funkce Najít dostupná v jakémkoli textovém procesoru nebo textovém editoru, pak jste již zažili účinky grepu na počítačový průmysl.

Skutečná síla grepu není jen starým zvláštním příkazem, který byl nahrazen moderní technologií, ale spočívá ve dvou aspektech:

  • Grep pracuje v terminálu a pracuje s proudy dat, takže je můžete začlenit do složitých procesů. Můžete nejen najít slovo v textovém souboru; můžete slovo extrahovat, odeslat jinému příkazu a tak dále.
  • Grep používá regulární výraz k poskytování flexibilních možností vyhledávání.

Naučte se grep ovládání je snadné, i když to vyžaduje určitý cvik. Tento článek vás seznámí s některými jeho funkcemi, které považuji za nejužitečnější.

[Stáhněte si náš bezplatný cheat sheet grep]

Instalace grep

Pokud používáte Linux, máte již nainstalovaný grep.

V systému macOS máte verzi BSD grep. To se mírně liší od verze GNU, takže pokud chcete přesně postupovat podle tohoto článku, nainstalujte si GNU grep z projektu jako Homebrew nebo MacPorts.

Základní grep

Základní syntaxe grep je vždy stejná. Zadáte grep příkaz vzor a soubor, který chcete prohledat. Na oplátku vytiskne každý řádek na váš terminál se shodou.

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Ve výchozím nastavení grep příkaz rozlišuje velká a malá písmena, takže "gnu" se liší od "GNU" nebo "Gnu." Můžete jej nastavit tak, aby ignoroval velká písmena pomocí --ignore-case možnost.

$ grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Můžete také vytvořit grep příkaz vrátí všechny řádky bez shodu pomocí --invert-match možnost:

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

Potrubí

Je užitečné umět najít text v souboru, ale skutečná síla POSIX je jeho schopnost zřetězit příkazy dohromady pomocí „potrubí“. Zjistil jsem, že grep nejlépe používám, když je kombinován s jinými nástroji, jako je řez, tr nebo curl.

Předpokládejme například, že mám soubor se seznamem některých technických dokumentů, které si chci stáhnout. Mohl bych otevřít soubor a ručně kliknout na každý odkaz a poté proklikat možnosti Firefoxu, abych si každý soubor uložil na pevný disk, ale to je spousta času a klikání. Místo toho jsem mohl hledat odkazy v souboru a tisknout pouze odpovídající řetězec pomocí --only-matching možnost:

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

Výstupem je seznam URL, každá na jednom řádku. To se přirozeně hodí k tomu, jak Bash zpracovává data, takže místo toho, abych si nechal vytisknout adresy URL na svůj terminál, mohu je jednoduše převést do curl :

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Tím se stáhne každý soubor a uloží se podle jeho vzdáleného souboru na můj pevný disk.

Můj vyhledávací vzorec v tomto příkladu se může zdát záhadný. Je to proto, že používá regulární výraz, druh „zástupného“ jazyka, který je zvláště užitečný při prohledávání velkého množství textu.

Regulární výraz

Nikdo si nedělá iluze, že regulární výraz (zkráceně „regex“) je snadný. Zjišťuji však, že má často horší pověst, než si zaslouží. Je pravda, že lidé mohou být trochu příliš chytří s regulárním výrazem, dokud nebude tak nečitelný a tak široký, že se složí sám do sebe, ale nemusíte svůj regulární výraz přehánět. Zde je stručný úvod k regulárnímu výrazu, jak jej používám.

Nejprve vytvořte soubor s názvem example.txt a zadejte do něj tento text:

Albania
Algeria
Canada
0
1
3
11

Nejzákladnějším prvkem regulárního výrazu je skromný . charakter. Představuje jeden znak.

$ grep Can.da example.txt
Canada

Vzor Can.da úspěšně vráceno Canada protože . znak reprezentovaný libovolným jeden postava.

. zástupný znak lze upravit tak, aby reprezentoval více než jeden znak s těmito zápisy:

  • ? odpovídá předchozí položce nula nebo jednou
  • * odpovídá předchozí položce nula nebo vícekrát
  • + odpovídá předchozí položce jednou nebo vícekrát
  • {4} odpovídá předchozí položce čtyřikrát (nebo libovolnému číslu, které zadáte do složených závorek)

Vyzbrojeni těmito znalostmi si můžete procvičit regulární výraz v example.txt celé odpoledne a uvidíte, jaké zajímavé kombinace vymyslíte. Některé nebudou fungovat; ostatní budou. Důležité je analyzovat výsledky, abyste pochopili proč.

Pokročilý regulární výraz vyžaduje --extended-regexp nebo -E možnost.

Toto například nedokáže vrátit žádnou zemi:

$ grep -E A.a example.txt

Selže, protože . postava může odpovídat pouze jedné postavě, pokud ji nezvýšíte. Pomocí * znak, můžete říct grep pro shodu s jedním znakem nula nebo tolikrát, kolikrát je potřeba, dokud nedosáhne konce slova. Protože znáte seznam, se kterým máte co do činění, víte, že nulakrát je v tomto případě k ničemu. V tomto seznamu rozhodně nejsou žádné třípísmenné názvy zemí. Místo toho můžete použít + pro shodu jednoho znaku alespoň jednou a potom znovu tolikrát, kolikrát je potřeba, až do konce slova:

$ grep -E A.+a example.txt
Albania
Algeria

K uvedení seznamu písmen můžete použít hranaté závorky:

$ grep -E [AC].+a example.txt
Albania
Algeria
Canada

To funguje i pro čísla. Výsledky vás možná překvapí:

$ grep [1-9] example.txt
1
3
11

Jste překvapeni, že při hledání číslic 1 až 9 vidíte 11?

Co se stane, když na svůj seznam přidáte 13?

Tato čísla jsou vrácena, protože obsahují 1, což je mezi seznamem číslic, které mají odpovídat.

Jak vidíte, regex je něco jako hádanka, ale díky experimentování a praxi se s ním můžete sžít a používat ho ke zlepšení způsobu, jakým procházíte svými daty.

Stáhněte si cheatsheet

grep příkaz má mnohem více možností, než jsem ukázal v tomto článku. Existují možnosti pro lepší formátování výsledků, seznam souborů a čísel řádků obsahujících shody, poskytování kontextu pro výsledky tiskem řádků obklopujících shodu a mnoho dalšího. Pokud se učíte grep, nebo jej jen často používáte a uchylujete se k prohledávání jeho info stránky, uděláte si laskavost tím, že si stáhnete náš cheat sheet. Cheat sheet používá krátké volby (-v místo --invert-matching , například) jako způsob, jak se seznámit s běžnou grepovou zkratkou. Obsahuje také sekci regulárních výrazů, která vám pomůže zapamatovat si nejběžnější kódy regulárních výrazů. Stáhněte si grep cheat ještě dnes!


Linux
  1. Jak používat příkaz historie v Linuxu

  2. Jak používat Su Command v Linuxu

  3. Použijte příkaz Linux grep

  1. Jak používat příkaz sudo v Linuxu

  2. Jak používat příkaz id v Linuxu

  3. Jak používat příkaz „screen“ v Linuxu

  1. Jak používat Linux na Command

  2. Jak používat příkaz historie Linuxu

  3. Jak používat příkaz xargs pro Linux