Android

Grep parancs a linuxban (szöveg keresése a fájlokban)

Words at War: The Veteran Comes Back / One Man Air Force / Journey Through Chaos

Words at War: The Veteran Comes Back / One Man Air Force / Journey Through Chaos

Tartalomjegyzék:

Anonim

A grep parancs, amely a „globális reguláris kifejezés nyomtatását” jelenti, az egyik legerősebb és leggyakrabban használt parancs Linuxban.

Grep egy vagy több bemeneti fájlt keres egy sornak megfelelő soroknál, és minden illesztési sort a normál kimenetre ír. Ha nem ad meg fájlokat, akkor a grep a normál bemenetről olvas, amely általában egy másik parancs kimenete.

Ebben az oktatóanyagban megmutatjuk, hogyan kell használni a grep parancsot gyakorlati példák segítségével, és részletes magyarázatokat adunk a leggyakoribb GNU grep opciókról.

Grep parancs szintaxisa

Mielőtt megtudnánk, hogyan kell használni a grep parancsot, kezdjük meg az alapszintaxis áttekintésével.

A grep segédprogram kifejezései a következők:

grep PATTERN

A szögletes zárójelben lévő tételek választhatók.

  • OPTIONS - Nulla vagy több lehetőség. A Grep számos lehetőséget kínál a viselkedésének ellenőrzésére. PATTERN - keresési minta. FILE - nulla vagy több bemeneti fájlnév.

A fájlban való kereséshez a parancsot futtató felhasználónak olvasási hozzáféréssel kell rendelkeznie a fájlhoz.

A grep használata a karakterlánc kereséséhez a fájlokban

A grep parancs legegyszerűbb használata egy karakterlánc (szöveg) keresésére a fájlban.

Például, a bash karakterláncot tartalmazó /etc/passwd fájl sorainak megjelenítéséhez használhatja a következő parancsot:

grep bash /etc/passwd

A kimenetnek így kell kinéznie:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Ha a karakterlánc szóközöket tartalmaz, akkor azokat egy vagy két idézőjelbe kell beilleszteni:

grep "Gnome Display Manager" /etc/passwd

Fordított mérkőzés (kizárás)

A mintának nem megfelelő sorok megjelenítéséhez használja a -v (vagy - - --invert-match ) opciót.

Például az /etc/passwd fájl sorainak megjelenítéséhez, amelyek nem tartalmazzák a nologin karaktersort, használhatja a következő parancsot:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Hogyan használható a Grep a parancskimenet karakterláncának keresésére?

A bemeneti fájlok megadása helyett egy másik parancs kimenetét grep vezetheti, majd csak az adott mintának megfelelő sorokat jelenítheti meg.

Például a következő ps paranccsal megtudhatja, mely folyamatok futnak a rendszeren felhasználói www-data :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Ezenkívül több csövet is láncolhat a parancson. Mint látható a fenti kimenetből, van egy sor, amely tartalmazza a grep folyamatot. Ha nem akarja, hogy ez a sor megjelenjen, vigye a kimenetet egy másik grep példányhoz, az alább látható módon.

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

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Rekurzív keresés

A minta rekurzív kereséséhez használja a -r opciót (vagy - - rekurzív). Ez megkeresi a megadott könyvtár összes fájlját, és átugorja a rekurzívan előforduló szimbólumokat. Az összes szimbolikus hivatkozás követéséhez használja az -R opciót (vagy - - --dereference-recursive ).

A következő példában a linuxize.com karakterláncot linuxize.com az /etc könyvtár összes linuxize.com :

grep -r linuxize.com /etc

A parancs kinyomtatja a megfelelő sorokat, amelyeket a fájl teljes elérési útja előz meg.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Ha ehelyett -r használ -R akkor a grep az összes szimbolikus linket követni fogja:

grep -R linuxize.com /etc

Figyelje meg a kimenet utolsó sorát. Ezt a sort nem nyomtatja ki a fenti példa, mert az Nginx sites-enabled könyvtárában található fájlok a linkek a sites-available könyvtárában lévõ konfigurációs fájlokhoz.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Csak a fájlnév megjelenítése

Az alapértelmezett grep kimenet elnyomására és csak az egyeztetett mintát tartalmazó fájlok nevének kinyomtatására használhatja az -l (vagy - - --files-with-matches ) opciót.

Például, hogy megkeresse az összes, a .conf fájllal végződő fájlt az aktuális munkakönyvtárban, és csak a linuxize.com típust tartalmazó fájlok nevét nyomtassa ki:

grep -l linuxize.com *.conf

A kimenet így néz ki:

tmux.conf haproxy.conf

Az -l opciót általában a -R rekurzív opcióval kombinálva használják:

grep -Rl linuxize.com /tmp

Az eset érzékeny keresése

Alapértelmezés szerint a grep parancs kis- és nagybetűk között érzékeny. Ez azt jelenti, hogy a nagy- és a kisbetűket különállóként kezelik.

Ha figyelmen kívül hagyja a kis- és nagybetűket a keresés során, használja a -i opciót (vagy - --ignore-case ).

Például, amikor a Zebra opciót keresi opció nélkül, a következő parancs nem fog megjeleníteni semmilyen kimenetet, azaz vannak egyező sorok:

grep Zebra /usr/share/words

De ha a -i kapcsolóval a kis- és nagybetűk között érzéketlen keresést hajt végre, akkor az megegyezik a nagy- és a kisbetűkkel:

grep -i Zebra /usr/share/words

A „Zebra” megadása megegyezik a „zebra”, „ZEbrA” vagy bármilyen más kis- és nagybetû kombinációjával az adott karakterláncon.

zebra zebra's zebras

Teljes szavak keresése

A „gnu” keresésekor a grep azon sorokat is kinyomtatja, ahol a „gnu” nagyobb szavakkal van beágyazva, például „cygnus” vagy „magnum”.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Csak azoknak a soroknak a visszatéréséhez, ahol a megadott karakterlánc egy teljes szó (nem szó karakterekkel zárva), használja a -w (vagy --word-regexp ) opciót.

A szókarakterek alfanumerikus karaktereket ( az , AZ és 0-9 ) és aláhúzást ( _ ) tartalmaznak. Az összes többi karaktert nem szavaknak tekintjük.

grep -w gnu /usr/share/words

gnu

Mutasd a sorszámokat

A -n (vagy a --line-number ) opcióval annak megjelenítéséhez, hogy a mintának megfelelõ karakterláncot tartalmazó sorok --line-number . Ennek az opciónak a használatakor a grep a találatokat szabványos kimenetre nyomtatja, előtaggal, annak a sorszámnak a segítségével, amelyen megtalálható volt.

Például az /etc/services fájl sorai megjelenítéséhez, amelyek tartalmazzák a megfelelő vonal számmal előírt bash karaktersorozatot, használhatja a következő parancsot:

grep -n 10000 /etc/services

Az alábbi kimenet azt mutatja, hogy az egyezések a 10423 és a 10424 soron találhatók.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Gróf mérkőzések

A megfelelő sorok számának a szabványos kimenetre történő kinyomtatásához használja a -c (vagy - - --count ) opciót.

Az alábbi példában azon fiókok számát számoljuk, amelyek héja az /usr/bin/zsh .

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

4

Több húr keresése (minták)

Két vagy több keresési mintát lehet összekapcsolni a VAGY operátorral.

Alapértelmezés szerint a grep a mintát alapvető reguláris kifejezésként értelmezi, ahol a meta-karakterek, például a | elveszítik speciális jelentéseiket, és visszahúzott verzióikat kell használni.

Az alábbi példában a fatal , error és critical szavak minden előfordulását keresjük az Nginx naplófájl fájljában:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Csendes mód

A -q (vagy --quiet ) azt mondja a grep hogy ne írjon semmit a terminálra (standard kimenet). Ha talált egyezést, akkor a parancs 0 állapotú lesz. Ez akkor hasznos, ha grep parancsfájlokat használ, ahol ellenőrizni szeretné, hogy egy fájl tartalmaz-e karakterláncot, és az eredménytől függően egy bizonyos műveletet végezzen.

Íme egy példa a grep csendes módban történő használatára tesztparancsként if utasításban:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Alapvető szabályos kifejezés

A GNU Grepnek két reguláris kifejezés szolgáltatáskészlete van: Basic és Extended. Alapértelmezés szerint a grep a mintát alapvető reguláris kifejezésként értelmezi.

Alapvető reguláris kifejezés módban történő felhasználás esetén az összes többi karakter, a metakarakterek kivételével, valójában szabályos kifejezések, amelyek megegyeznek egymással. Az alábbiakban felsoroljuk a leggyakrabban használt meta-karaktereket:

  • Használja a ^ (caret) szimbólumot, hogy egyezzen a sor elején található kifejezéssel. A következő példában a ^kangaroo karakterlánc csak akkor felel meg, ha egy sor legelején fordul elő.

    grep "^kangaroo" file.txt

    Használja a $ (dollár) szimbólumot a sor végén található kifejezés illesztéséhez. A következő példában a kangaroo$ karakterlánc csak akkor felel meg, ha a sor végén fordul elő.

    grep "kangaroo$" file.txt

    Használja a . (periódus) szimbólum, hogy megfeleljen bármely karakternek. Például, ha valami kan felel meg, amely kan kezdődik, akkor két karakterből áll, és a roo karakterlánccal fejeződik be, akkor a következő mintát használhatja:

    grep "kan..roo" file.txt

    Használat (zárójelben), hogy megfeleljen a zárójelben szereplő egyes karaktereknek. Például keresse meg azokat a sorokat, amelyek accept vagy „ accent accent , a következő mintát használhatja:

    grep "accet" file.txt

    Használat (zárójelben), hogy megfeleljen a zárójelben szereplő egyes karaktereknek. A következő minta megegyezik a co(any_letter_except_l)a tartalmú karakterláncok bármelyik kombinációjával, mint például a co(any_letter_except_l)a , cobalt és így tovább, de nem egyezik a cola tartalmú vonalakkal, grep "coa" file.txt

A következő karakter speciális jelentésének elkerüléséhez használja a \ (visszajelzés) szimbólumot.

Bővített szabályos kifejezések

A minta kibővített reguláris kifejezésként való értelmezéséhez használja az -E (vagy - - --extended-regexp ) beállítást. A kibővített reguláris kifejezések tartalmazzák az összes alapvető meta-karaktert, valamint további meta-karaktereket, hogy összetettebb és hatékonyabb keresési mintákat hozzanak létre. Az alábbiakban bemutatunk néhány példát:

  • Egyezzen és bontsa ki az összes e-mail címet egy adott fájlból:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Egyezzen meg és bontsa ki az összes érvényes IP-címet egy adott fájlból:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Az -o opció csak a megfelelő karakterlánc kinyomtatásához használható.

Vonalak nyomtatása mérkőzés előtt

--before-context számú sor kinyomtatásához a sorok illesztése előtt használja a -B (vagy - --before-context ) beállítást.

Például, ha öt vezető sor jelenik meg a sorok illesztése előtt, akkor a következő parancsot használja:

grep -B 5 root /etc/passwd

Nyomtasson sorokat egy mérkőzés után

--after-context számú sor kinyomtatásához a sorok illesztése után használja az -A (vagy --after-context utáni) opciót.

Például, ha öt sor vonalat jelenít meg a sorok illesztése után, akkor a következő parancsot használja:

grep -A 5 root /etc/passwd

Következtetés

A grep parancs lehetővé teszi a minták keresését a fájlokban. Ha talál egyezést, a grep kinyomtatja a megadott mintát tartalmazó sorokat.

Sokkal többet megtudhat a Grepről a Grep Felhasználói Kézikönyv oldalon.

grep terminál