A grep parancs használata Linux alatt

A Linux grepparancs egy karakterlánc és mintaillesztési segédprogram, amely több fájl egyező sorait jeleníti meg. Más parancsok csövezett kimenetével is működik. Megmutatjuk, hogyan.

A történet mögött grep

A grepparancs három okból híres Linux és Unix körökben. Először is, rendkívül hasznos. Másodszor, a lehetőségek sokasága elsöprő lehet. Harmadszor, egyik napról a másikra írták, hogy kielégítsenek egy adott igényt. Az első kettő dörömböl; a harmadik kissé kikapcsol.

Ken Thompson kivonta a edszerkesztőből a reguláris kifejezés keresési képességeit (ejtsd: ee-dee), és létrehozott egy kis programot - saját használatra - a szöveges fájlok közötti keresésre. A Bell Labs osztályvezetője, Doug Mcilroy megkereste Thompsont, és leírta a problémát, amellyel kollégái, Lee McMahon szembesültek.

McMahon szövegelemzéssel próbálta azonosítani a föderalista írások szerzőit. Szüksége volt egy eszközre, amely képes kifejezéseket és karakterláncokat keresni a szöveges fájlokban. Thompson azon az estén körülbelül egy órát töltött azzal, hogy eszközét általános hasznossá tette, amelyet mások is használhattak, és átnevezték grep. A nevet a edparancssorból vette át g/re/p, amely „globális reguláris kifejezés keresésként” jelent.

Megnézheti, ahogy Thompson Brian Kernighannal beszélget a születéséről grep.

Egyszerű keresések a grep segítségével

Ha egy fájlban szeretne karakterláncot keresni, adja meg a keresési kifejezést és a fájl nevét a parancssorban:

Megjelennek az egyező vonalak. Ebben az esetben egyetlen vonalról van szó. Az egyező szöveg ki van emelve. Ez azért van, mert a legtöbb disztribúcióban grepálneve:

alias grep = "grep --colour = auto"

Nézzük meg azokat az eredményeket, ahol több sor is egyezik. Megkeressük az „Átlag” szót egy alkalmazás naplófájljában. Mivel nem tudjuk felidézni, hogy a naplófájlban kis szó van-e, a (kisbetű -i figyelmen kívül hagyása) opciót fogjuk használni :

grep -i Átlagos geek-1.log

Minden egyező sor megjelenik, mindegyikben kiemelve az egyező szöveget.

A nem egyező vonalakat megjeleníthetjük a -v (invert match) opcióval.

grep -v Mem geek-1.log

Nincs kiemelés, mert ezek a nem egyező vonalak.

Mi okozhatja grep, hogy teljesen csendes. Az eredmény a héjhoz kerül, mint visszatérési érték innen grep:. Az eredmény nulla eszköz a húr volt találtak, és eredményeként az egyik eszköze, hogy nem talált. A visszatérési kódot a $?speciális paraméterek segítségével ellenőrizhetjük  :

grep -q átlagos geek-1.log
visszhang $?
grep -q howtogeek geek-1.log
visszhang $?

Rekurzív keresések a grep segítségével

Beágyazott könyvtárakban és alkönyvtárakban történő kereséshez használja a -r (rekurzív) beállítást. Ne feledje, hogy nem ad meg fájlnevet a parancssorban, meg kell adnia egy elérési utat. Itt keresünk az aktuális könyvtárban. és bármely alkönyvtár:

grep -r -i memfree.

A kimenet tartalmazza az illeszkedõ sorok könyvtárát és fájlnevét.

A  (rekurzív dereference) opció grep  segítségével követhetünk szimbolikus linkeket -R. Van egy szimbolikus linkünk ebben a könyvtárban, az úgynevezett logs-folder. Rámutat /home/dave/logs.

ls -l naplók-mappa

Ismételjük meg az utolsó keresést a  -R(rekurzív dereference) opcióval:

grep -R -i memfree.

A szimbolikus linket követi, és a könyvtár, amelyre mutat, szintén megkeresi grep.

Egész szavak keresése

Alapértelmezés szerint grepegyezik egy sorral, ha a keresési cél bárhol megjelenik a sorban, beleértve egy másik karakterláncot is. Nézd meg ezt a példát. Megkeressük a „szabad” szót.

grep -i ingyenes geek-1.log

Az eredmények olyan sorok, amelyekben a „free” karakterlánc szerepel, de ezek nem külön szavak. A MemFree karakterlánc részét képezik.

Kényszeríteni, grep hogy csak külön „szavaknak” feleljen meg, használja a -w(regexp szó) beállítást.

grep -w -i ingyenes geek-1.log
visszhang $?

Ezúttal nincsenek találatok, mert a „free” keresési kifejezés nem külön fájlként jelenik meg a fájlban.

Több keresési kifejezés használata

A -E(kiterjesztett regexp) opció lehetővé teszi több szó keresését. (Az -Eopció helyettesíti a .x elavult egrepverzióját grep.)

Ez a parancs két keresési kifejezést keres: „átlagos” és „memfree”.

grep -E -w -i "átlagos | memfree" geek-1.log

Az összes megfelelő sor megjelenik az egyes keresési kifejezéseknél.

Több olyan kifejezésre is kereshet, amelyek nem feltétlenül egész szavak, de lehetnek egész szavak is.

A -e(minták) opció lehetővé teszi több keresési kifejezés használatát a parancssorban. A rendszeres kifejezés zárójel funkcióját használjuk a keresési minta létrehozásához. Azt mondja, grephogy illeszkedjen a „[]” zárójelben szereplő karakterek bármelyikéhez. Ez azt jelenti grep, hogy a keresés során a „kB” vagy a „KB” megegyezik.

Mindkét húr illeszkedik, sőt, egyes sorok mindkét húrot tartalmazzák.

Pontok egyezése

-x(line regexp) csak azoknak a soroknak felel meg, amelyekben a teljes sor megegyezik a keresési kifejezéssel. Keressünk egy dátum- és időbélyegzőt, amelyről tudjuk, hogy csak egyszer jelenik meg a naplófájlban:

grep -x "Jan-20 - 06 15:24:35" geek-1.log

Megtalálja és megjeleníti az egyetlen sort, amely megfelel.

Ennek az ellenkezője csak a nem egyező vonalakat mutatja . Ez hasznos lehet, ha konfigurációs fájlokat néz. A megjegyzések nagyszerűek, de néha nehéz észrevenni a tényleges beállításokat mind között. Itt van a /etc/sudoersfájl:

Hatékonyan kiszűrhetjük az ilyen megjegyzéssorokat:

sudo grep -v "#" / etc / sudoers

Ezt sokkal könnyebb elemezni.

Csak egyező szöveget jelenít meg

Előfordulhat olyan eset, amikor nem a teljes egyező sort akarja látni, csak az egyező szöveget. A -o(csak egyező) opció éppen ezt teszi.

grep -o MemFree geek-1.log

A kijelző csak a keresési kifejezésnek megfelelő szöveget jeleníti meg a teljes egyező sor helyett.

Számolás grep-el

grepnem csak a szövegről szól, hanem számszerű információkat is szolgáltathat. Tudjuk, hogy grepgróf nekünk különböző módon. Ha tudni akarjuk, hogy egy keresési kifejezés hányszor jelenik meg egy fájlban, használhatjuk a -c(számlálás) opciót.

grep -c átlagos geek-1.log

grep jelentése szerint a keresési kifejezés 240-szer jelenik meg ebben a fájlban.

A (sorszám) opcióval grepmegjelenítheti az egyes illeszkedő -nsorok sorszámát.

grep -n Jan geek-1.log

Az egyes egyező sorok sorszáma a sor elején jelenik meg.

A megjelenített eredmények számának csökkentéséhez használja a -m(max. Szám ) opciót. A kimenetet öt egyező sorra fogjuk korlátozni:

grep -m5 -n Jan geek-1.log

Környezet hozzáadása

Gyakran hasznos, ha az egyes illeszkedő sorokhoz láthat néhány további sort - esetleg nem egyező sorokat. segíthet megkülönböztetni, hogy az illesztett vonalak közül melyek érdeklik.

Néhány vonal megjelenítéséhez az egyező sor után használja az -A (kontextus után) opciót. Három sort kérünk ebben a példában:

grep -A 3 -x "január-20-án 15:24:35" geek-1.log

Az egyező sor előtti sorok megtekintéséhez használja a -B(context előtt) opciót.

grep -B 3 -x "20. jan-20 15:24:35" geek-1.log

Az illesztési sor előtti és utáni sorok felvételéhez használja a -C(kontextus) opciót.

grep -C 3 -x "január-20-án 15:24:35" geek-1.log

Megfelelő fájlok megjelenítése

A keresési kifejezést tartalmazó fájlok nevének megtekintéséhez használja a -l (fájlok egyezéssel) beállítást. A következő sl.hparanccsal megtudhatja, hogy mely C forráskódfájlok tartalmaznak hivatkozásokat a fejlécfájlra:

grep -l "sl.h" * .c

A fájlnevek vannak felsorolva, nem az egyező sorok.

És természetesen kereshetünk olyan fájlokat is, amelyek nem tartalmazzák a keresési kifejezést. A -L(fájlok egyezés nélkül) opció éppen ezt teszi.

grep -L "sl.h" * .c

Vonalak kezdete és vége

Kényszeríthetjük, grephogy csak azokat a mérkőzéseket jelenítsük meg, amelyek vagy a sor elején vagy végén vannak. A „^” reguláris kifejezés operátor egyezik a sor elejével. A naplófájl gyakorlatilag az összes sorában szóközök lesznek, de olyan sorokat fogunk keresni, amelyek első karaktere szóköz:

grep "^" geek-1.log

Megjelennek azok a vonalak, amelyeknek első karakterként szóköz van - a sor elején.

A sor végének egyezéséhez használja a „$” reguláris kifejezés operátort. Olyan vonalakat fogunk keresni, amelyek vége „00”.

grep "00 $" geek-1.log

A kijelzőn azok a sorok láthatók, amelyek utolsó karaktere „00”.

Pipes használata grep-el

Természetesen be lehet vezetni grepa bemenetet , a kimenetet grepegy másik programba, és grepa csővezeték láncának közepén lehet.

Tegyük fel, hogy az „ExtractParameters” karakterlánc összes előfordulását meg akarjuk tekinteni a C forráskód fájljainkban. Tudjuk, hogy elég sok lesz, ezért a kimenetet a következőkbe csövezzük less:

grep "ExtractParameters" * .c | Kevésbé

A kimenetet a less.

Ez lehetővé teszi a fájlok felsorolását és a less'skeresési lehetőség használatát .

Ha a kimenetet innen csövezzük grep, wcés a -l(vonalak) opciót használjuk, megszámolhatjuk a forráskód fájlokban az „ExtractParameters” -t tartalmazó sorok számát. (Ezt elérhetnénk a grep-c(számlálás) opcióval, de ez egy jó módszer a csővezeték kiépítésének bemutatására grep.)

grep "ExtractParameters" * .c | wc -l

A következő parancs, mi irányítsuk kimenetét származó lsbe grepés csővezeték a kimenet grepbe sort. Felsoroljuk a fájlokat az aktuális könyvtárban, kiválasztjuk azokat, amelyekben szerepel az „Aug” karakterlánc, és fájlméret szerint rendezzük őket:

ls -l | grep "Aug" | rendezés + 4n

Bontjuk le ezt:

  • ls -l : Végezze el a fájlok hosszú formátumú felsorolását a gombbal ls.
  • grep „Aug” : Válassza ki a lslistából azokat a sorokat , amelyekben „Aug” szerepel. Ne feledje, hogy ez olyan fájlokat is talál, amelyek nevében „Aug” szerepel.
  • sort + 4n : A kimenet rendezése a negyedik oszlop grep-jéből (fájlméret).

Rendezzük az összes augusztusban módosított fájlt (évtől függetlenül), a fájlméret növekvő sorrendjében.

KAPCSOLÓDÓ: A csövek használata Linux rendszeren

grep: Kevesebb parancs, inkább szövetséges

grepegy fantasztikus eszköz, amely rendelkezésére áll. 1974-ből származik, és még mindig erős, mert szükségünk van arra, amit csinál, és semmi sem teszi jobban.

grepNéhány reguláris kifejezéssel összekapcsolva a fu valóban a következő szintre emeli.

KAPCSOLÓDÓ: Hogyan lehet az alapszintű reguláris kifejezéseket használni a jobb kereséshez és az időmegtakarításhoz?