Vysvetlenie: Čo je príkaz Grep v systéme Linux?
Grep je možno jedným z najpoužívanejších príkazov v Linuxe. V tomto vysvetľujúcom článku sa dozviete, prečo bol vytvorený a ako sa používa.
Ak používate Linux na bežnú prácu alebo vývoj a nasadzovanie softvéru, určite ste sa stretli s príkazom grep.
V tomto vysvetľujúcom článku vám poviem, čo je príkaz grep a ako funguje.
čo je grep?
Grep je nástroj príkazového riadka v systémoch Unix a Linux. Používa sa na nájdenie vzorov vyhľadávania v obsahu daného súboru.
S jeho nezvyčajným názvom ste možno uhádli, že grep je skratka. Je to aspoň čiastočne pravda, ale záleží na tom, koho sa pýtate.
Podľa renomovaných zdrojov je názov v skutočnosti odvodený od príkazu v textovom editore UNIX s názvom ed. V ktorom vstup g/re/p
vykonal globálne (g) vyhľadávanie regulárneho výrazu (re) a následne vytlačil (p) všetky zodpovedajúce riadky.
Príkaz grep robí to, čo príkazy g/re/p v editore. Vykoná globálny prieskum regulárneho výrazu a vytlačí ho. Je oveľa rýchlejší pri vyhľadávaní veľkých súborov.
Toto je oficiálny príbeh, ale môžete ho vidieť aj opísaný ako Global Rregular Expression (P processor |
Parser |
Printer). Po pravde, robí to všetko.
Zaujímavý príbeh za vznikom grep
Ken Thompson urobil niekoľko neuveriteľných príspevkov do počítačovej vedy. Pomohol vytvoriť Unix, spopularizoval jeho modulárny prístup a napísal mnoho jeho programov vrátane grep.
Thompson postavil grep, aby pomohol jednému z jeho kolegov v Bell Labs. Cieľom tohto vedca bolo preskúmať lingvistické vzorce s cieľom identifikovať autorov (vrátane Alexandra Hamiltona) Federalist Papers. Tento rozsiahly súbor prác bol zbierkou 85 anonymných článkov a esejí vypracovaných na obranu ústavy Spojených štátov amerických. Ale keďže tieto články boli anonymné, vedec sa snažil identifikovať autorov na základe jazykového vzoru.
Pôvodný unixový textový editor, ed, (tiež vytvorený Thompsonom) nebol schopný prehľadávať také veľké množstvo textu vzhľadom na hardvérové obmedzenia tej doby. Thompson teda premenil funkciu vyhľadávania na samostatnú pomôcku, nezávislú od editora ed.
Ak sa nad tým zamyslíte, znamená to, že Alexander Hamilton technicky pomohol vytvoriť grep. Neváhajte a podeľte sa o tento zábavný fakt so svojimi priateľmi na párty s hodinkami Hamilton. 🤓
Čo je to opäť regulárny výraz?
Regulárny výraz (alebo regulárny výraz) si možno predstaviť ako vyhľadávací dopyt. Regulárne výrazy sa používajú na identifikáciu, zhodu alebo inú správu textu.
Regex však dokáže oveľa viac ako len vyhľadávanie kľúčových slov. Môže sa použiť na nájdenie akéhokoľvek vzoru, ktorý si možno predstaviť. Vzory možno ľahšie nájsť pomocou metaznakov. Tieto špeciálne znaky robia tento vyhľadávací nástroj oveľa výkonnejším.
Treba poznamenať, že grep je len jeden nástroj, ktorý používa regex. V celom rade nástrojov existujú podobné možnosti, ale metaznaky a syntax sa môžu líšiť. To znamená, že je dôležité poznať pravidlá pre váš konkrétny procesor regulárnych výrazov.
Praktický príklad grep: Priraďovanie telefónnych čísel
Tento nástroj môže zastrašiť začiatočníkov aj skúsených používateľov Linuxu. Bohužiaľ, aj relatívne jednoduchý vzor, akým je telefónne číslo, môže mať za následok „strašidelný“ reťazec regulárneho výrazu.
Chcem vás ubezpečiť, že keď vidíte takéto výrazy, netreba prepadať panike. Keď sa zoznámite so základmi regulárneho výrazu, môže vám to otvoriť nový svet možností pre vašu prácu s počítačom.
Kultúrna poznámka: Tento príklad používa pre telefónne čísla konvencie USA (NANP). Ide o 10-miestne ID, ktoré sú rozdelené na kód oblasti (3 číslice) a jedinečnú kombináciu 7 číslic, kde prvé 3 číslice zodpovedajú centrálnej telekomunikačnej kancelárii (známej ako predvoľba) a posledné 4 sa nazývajú linka. číslo. Vzor je teda AAA-PPP-LLLL.
Vytvoril som súbor s názvom phone.txt
a zapísal som si 4 bežné variácie toho istého telefónneho čísla. Budem používať grep na rozpoznanie číselného vzoru bez ohľadu na formát.
Tiež som pridal jeden riadok, ktorý nebude v súlade s výrazom, ktorý sa má použiť ako ovládací prvok. Posledný riadok 555!123!1234
nie je štandardný vzor telefónneho čísla a výraz grep ho nevráti.
Obsah súborov phone.txt
je:
christopher@linux-handbook:~$ cat phone.txt
5551231234
555 123 1234
555-123-1234
(555)-123-1234
555!123!1234
Ak chcete „grep“ telefónne čísla, napíšem svoj regulárny výraz pomocou metaznakov, aby som izoloval relevantné údaje a ignoroval to, čo nepotrebujem.
Kompletný príkaz bude vyzerať takto:
christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt
Vyzerá to trochu intenzívne, však? Poďme si to rozdeliť na kúsky, aby sme mali lepšiu predstavu o tom, čo sa deje.
Pochopenie regulárneho výrazu, jeden segment po druhom
Najprv oddeľme časť regulárneho výrazu, ktorá v telefónnom čísle hľadá „predvoľbu“.
Podobný vzor sa čiastočne opakuje, aby sa získali aj zvyšné číslice. Je dôležité poznamenať, že kód oblasti je niekedy zapuzdrený v zátvorkách, takže to musíte zohľadniť pri výraze tu.
Logika celej sekcie s predvoľbou je zapuzdrená do okrúhlych zátvoriek. Môžete vidieť, že môj kód začína \(
a končí \)
.
Keď použijete hranaté zátvorky [0-9]
, dáte grepu vedieť, že hľadáte číslo medzi 0 a 9. Podobne môžete použiť [a-z]
, aby sa zhodovali písmená abecedy.
Číslo v zložených zátvorkách {3\}
znamená, že položka v hranatých zátvorkách sa zhoduje presne trikrát.
Stále zmätený? Nenechajte sa vystresovať. Na tento príklad sa pozriete niekoľkými spôsobmi, aby ste sa cítili sebavedomo napredovať.
Skúsme sa pozrieť na logiku sekcie kódu oblasti v pseudokóde. Izoloval som každý segment výrazu.
Pseudokód RegEx kódu oblasti
\(
(3-ciferné číslo)
|
3-ciferné číslo
\)
Dúfajme, že keď to vidíte takto, bude regulárny výraz priamočiarejší. V jednoduchom jazyku hľadáte 3-miestne čísla. Každá číslica môže byť 0 až 9 a okolo kódu oblasti môžu byť alebo zátvorky.
Potom je tu tento zvláštny kúsok na konci našej prvej časti.
[ -]\?
Čo to znamená? Symbol \?
znamená "zhoduje sa s nulou alebo jedným z predchádzajúcich znakov". Tu ide o to, čo je v našich hranatých zátvorkách [ -]
.
Inými slovami, za číslicami môže alebo nemusí byť spojovník.
Kód oblasti
Teraz znova zostavme ten istý blok so skutočným kódom. Potom pridám ďalšie časti výrazu.
\(
([0-9]\{3\})
|
[0-9]\{3\}
\)
[ -]\?
Predpona
Na dokončenie vzoru telefónneho čísla stačí znova použiť niektoré zo svojich existujúcich kódov.
[0-9]\{3\}[ -]\?
Zátvorky okolo predvoľby vás nemusia znepokojovať, no medzi predvoľbou a číslicami v riadku telefónneho čísla môžete alebo nemusíte mať -
.
Čísla riadkov
Posledná časť telefónneho čísla nevyžaduje, aby sme hľadali ďalšie znaky, ale musíte aktualizovať výraz tak, aby odrážal ďalšiu číslicu.
[0-9]\{4\}
To je všetko. Teraz sa uistite, že výraz je obsiahnutý v úvodzovkách, aby sa minimalizovalo neočakávané správanie.
Tu je opäť úplný výraz
christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt
Môžete vidieť, že výsledky sú farebne zvýraznené. Toto nemusí byť predvolené správanie vo vašej distribúcii Linuxu.
Bonusový tip
Ak chcete, aby boli vaše výsledky zvýraznené, môžete do príkazu pridať --color=auto
. Môžete to tiež pridať do svojho shell profilu ako alias, takže zakaždým, keď zadáte grep
, spustí sa ako grep --color=auto
.
Dúfam, že teraz lepšie rozumiete príkazu grep. Na vysvetlenie vecí som ukázal len jeden príklad. V prípade záujmu si môžete pozrieť tento článok, kde nájdete ďalšie praktické príklady príkazu grep.
Uveďte svoj návrh na článok zanechaním komentára.