A Linux grep parancs egy karakterlánc- és mintaegyeztető segédprogram, amely több fájl egyező sorait jeleníti meg. Más parancsok vezetékes kimenetével is működik. Megmutatjuk, hogyan.
Tartalomjegyzék
The Story Behind grep
A grep parancs híres Linux és Unix körökben három okból. Először is, rendkívül hasznos. Másodszor, a a lehetőségek tárháza elsöprő lehet. Harmadszor, egyik napról a másikra íródott, hogy egy adott igényt kielégítsen. Az első kettő bumm; a harmadik kissé ki van kapcsolva.
Ken Thompson kibontotta a reguláris kifejezés keresési lehetőségeit az ed szerkesztőből (kiejtve ee-dee), és készített egy kis programot – saját használatra –, amellyel szöveges fájlok között kereshet. Osztályvezetője a Bell Labs, Doug Mciroy, felkereste Thompsont, és egyik kollégája leírta a problémát, Lee McMahon, volt szemben.
McMahon megpróbálta azonosítani a szerzőket Federalista lapok szövegelemzés révén. Olyan eszközre volt szüksége, amely képes kifejezéseket és karakterláncokat keresni a szöveges fájlokban. Thompson körülbelül egy órát töltött azon az estén, hogy általános segédprogramot készítsen eszközéből, amelyet mások is használhatnak, és átnevezte grep-re. A nevet a g/re/p ed parancskarakterláncból vette, ami „globális reguláris kifejezés-keresés”-nek felel meg.
Nézheted, ahogy Thompson beszél nak nek Brian Kernighan grep születéséről.
Egyszerű keresések grep segítségével
Ha egy karakterláncot szeretne keresni egy fájlban, adja meg a keresett kifejezést és a fájl nevét a parancssorban:
Megjelennek a megfelelő sorok. Ebben az esetben egyetlen sorról van szó. A megfelelő szöveg kiemelve. Ennek az az oka, hogy a legtöbb disztribúcióban a grep álneve:
alias grep='grep --colour=auto'
Nézzük azokat az eredményeket, ahol több sor is egyezik. Megkeressük az „Átlagos” szót az alkalmazásnaplófájlban. Mivel nem tudjuk felidézni, ha a szó kisbetűvel szerepel a naplófájlban, a -i (kis- és nagybetűk figyelmen kívül hagyása) kapcsolót használjuk:
grep -i Average geek-1.log
Minden egyező sor megjelenik, mindegyikben kiemelve a megfelelő szöveget.
A nem egyező sorokat a -v (invert match) kapcsolóval tudjuk megjeleníteni.
grep -v Mem geek-1.log
Nincs kiemelés, mert ezek a nem egyező sorok.
A grep teljesen elnémulhat. Az eredmény a grep visszatérési értékeként kerül átadásra a shell-nek. A nulla eredmény azt jelenti, hogy a karakterlánc megtalálható, az egy pedig azt, hogy nem található. A visszaküldési kódot a $? speciális paraméterek:
grep -q average geek-1.log
echo $?
grep -q wdzwdz geek-1.log
echo $?
Rekurzív keresések grep segítségével
A beágyazott könyvtárak és alkönyvtárak közötti kereséshez használja a -r (rekurzív) kapcsolót. Vegye figyelembe, hogy nem ad meg fájlnevet a parancssorban, hanem elérési utat kell megadnia. Itt az aktuális „.” könyvtárban keresünk. és az esetleges alkönyvtárak:
grep -r -i memfree .
A kimenet tartalmazza az egyes egyező sorok könyvtárát és fájlnevét.
A grep szimbolikus hivatkozásokat követhet a -R (rekurzív dereferencia) opció használatával. Ebben a könyvtárban van egy szimbolikus hivatkozásunk, az úgynevezett logs-folder. A /home/dave/logs könyvtárra mutat.
ls -l logs-folder
Ismételjük meg a legutóbbi keresésünket a -R (rekurzív dereferencia) opcióval:
grep -R -i memfree .
A szimbolikus hivatkozást követi, és azt a könyvtárat, amelyre mutat, a grep is megkeresi.
Egész szavak keresése
Alapértelmezés szerint a grep megfelel egy sornak, 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. Az „ingyenes” szóra fogunk keresni.
grep -i free geek-1.log
Az eredmények olyan sorok, amelyekben a „szabad” karakterlánc szerepel, de ezek nem külön szavak. A „MemFree” karakterlánc részei.
Ha arra szeretné kényszeríteni a grep-et, hogy csak különálló „szavak” feleljen meg, használja a -w (word regexp) opciót.
grep -w -i free geek-1.log
echo $?
Ezúttal nincs találat, mert az „ingyenes” keresőkifejezés nem külön szóként jelenik meg a fájlban.
Több keresési kifejezés használata
Az -E (kiterjesztett reguláris kifejezés) opció lehetővé teszi több szó keresését. (A -E opció helyettesíti az elavult a grep egrep verziója.)
Ez a parancs két keresési kifejezést keres: „átlagos” és „memfree”.
grep -E -w -i "average|memfree" geek-1.log
Minden keresési kifejezéshez az összes egyező sor megjelenik.
Több olyan kifejezésre is kereshet, amelyek nem feltétlenül teljes szavak, de lehetnek egész szavak is.
A -e (patterns) opció lehetővé teszi több keresési kifejezés használatát a parancssorban. A reguláris kifejezés zárójel funkcióját használjuk keresési minta létrehozásához. Megmondja, hogy a grep megfeleljen a zárójelben lévő karakterek bármelyikének.[].” Ez azt jelenti, hogy a grep keresés közben a „kB” vagy a „KB” kifejezéssel fog egyezni.
Mindkét karakterlánc illeszkedik, sőt, egyes sorok mindkét karakterláncot tartalmazzák.
Pontosan illeszkedő vonalak
Az -x (soros reguláris kifejezés) csak azokat a sorokat fogja egyezni, ahol a teljes sor megegyezik a keresett kifejezéssel. Keressünk olyan dátum- és időbélyeget, amelyről tudjuk, hogy csak egyszer jelenik meg a naplófájlban:
grep -x "20-Jan--06 15:24:35" geek-1.log
Megkeresi és megjeleníti az egyező sort.
Ennek az ellenkezője, hogy csak azokat a vonalakat jeleníti meg, amelyek nem egyeznek. Ez akkor lehet hasznos, 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 az összes között. Itt van az /etc/sudoers fájl:
Hatékonyan kiszűrhetjük a megjegyzéssorokat így:
sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers
Így sokkal könnyebb elemezni.
Csak egyező szöveg megjelenítése
Előfordulhat, hogy nem szeretné látni a teljes egyező sort, csak a megfelelő szöveget. Az -o (csak megfelelő) opció éppen ezt teszi.
grep -o MemFree geek-1.log
A kijelzőn a teljes egyező sor helyett csak a keresett kifejezésnek megfelelő szöveg jelenik meg.
Számlálás grep segítségével
A grep nem csak szövegről szól, hanem számszerű információkat is szolgáltathat. A grep-et többféleképpen is beszámíthatjuk. Ha tudni akarjuk, hogy egy keresett kifejezés hányszor jelenik meg egy fájlban, használhatjuk a -c (count) kapcsolót.
grep -c average geek-1.log
grep jelentése szerint a keresett kifejezés 240-szer szerepel ebben a fájlban.
Beállíthatja, hogy a grep megjelenítse az egyes egyező sorok sorszámát az -n (sorszám) kapcsolóval.
grep -n Jan geek-1.log
Minden egyező sor sorszáma megjelenik a sor elején.
A megjelenített eredmények számának csökkentéséhez használja a -m (maximális szám) kapcsolót. A kimenetet öt egyező sorra korlátozzuk:
grep -m5 -n Jan geek-1.log
Kontextus hozzáadása
Gyakran hasznos, ha az egyes egyező sorokhoz további sorokat – esetleg nem egyező sorokat – láthatunk. segíthet megkülönböztetni, hogy az egyező sorok közül melyik érdekli Önt.
Ha a megfelelő sor után néhány sort szeretne megjeleníteni, használja az -A (kontextus után) opciót. Ebben a példában három sort kérünk:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
Ha az egyező sor előtti sorokat szeretné látni, használja a -B (kontextus előtt) opciót.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
A megfelelő sor előtti és utáni sorok beillesztéséhez használja a -C (kontextus) opciót.
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
Megfelelő fájlok megjelenítése
A keresett kifejezést tartalmazó fájlok nevének megtekintéséhez használja a -l (egyezéssel rendelkező fájlok) kapcsolót. Ha meg szeretné tudni, hogy mely C forráskód fájlok tartalmaznak hivatkozásokat az sl.h fejlécfájlra, használja ezt a parancsot:
grep -l "sl.h" *.c
A fájlnevek vannak felsorolva, nem a megfelelő sorok.
És természetesen kereshetünk olyan fájlokat is, amelyek nem tartalmazzák a keresett kifejezést. Az -L (egyezés nélküli fájlok) opció pontosan ezt teszi.
grep -L "sl.h" *.c
Sorok eleje és vége
Kényszeríthetjük a grep-et, hogy csak azokat a találatokat jelenítse meg, amelyek egy sor elején vagy végén vannak. A „^” reguláris kifejezés operátora megegyezik a sor elejével. A naplófájlban gyakorlatilag minden sor szóközt tartalmaz, de olyan sorokat fogunk keresni, amelyeknek első karaktere szóköz:
grep "^ " geek-1.log
Megjelennek azok a sorok, amelyeknek első karaktere szóköz – a sor elején.
A sor végének megfeleltetéséhez használja a „$” reguláris kifejezés operátorát. Olyan sorokat fogunk keresni, amelyek „00”-ra végződnek.
grep "00$" geek-1.log
A kijelzőn megjelennek azok a sorok, amelyek utolsó karaktere „00”.
Pipes használata grep-pel
Természetesen a bemenetet a grepbe, a grep kimenetét egy másik programba továbbíthatja, és a grep egy csőlánc közepén fészkelődik.
Tegyük fel, hogy látni szeretnénk az „ExtractParameters” karakterlánc összes előfordulását a C forráskód fájljainkban. Tudjuk, hogy elég sok lesz, ezért a kimenetet kevesebbre tesszük:
grep "ExtractParameters" *.c | less
A kimenet kevesebbben jelenik meg.
Ezzel lapozhat a fájllistában, és használhatja a less keresési funkcióját.
Ha a grep kimenetét a wc-be vezetjük, és a -l (vonalak) opciót használjuk, akkor mi meg tudja számolni a sorok számát az „ExtractParameters”-t tartalmazó forráskódfájlokban. (Ezt a grep -c (count) kapcsolóval is elérhetjük, de ez egy ügyes módja annak, hogy demonstráljuk a grepből való kivezetést.)
grep "ExtractParameters" *.c | wc -l
A következő paranccsal az ls kimenetét a grep-be, a grep kimenetét pedig a sort-ba csövekbe helyezzük. Felsoroljuk a fájlokat az aktuális könyvtárban, kiválasztva azokat, amelyekben az „Aug” karakterlánc található, és fájlméret szerint rendezi őket:
ls -l | grep "Aug" | sort +4n
Bontsuk szét:
ls -l: Végezze el a fájlok hosszú formátumú listáját az ls használatával.
grep „Aug”: Válassza ki azokat a sorokat az ls listából, amelyekben az „Aug” szerepel. Vegye figyelembe, hogy ez azokat a fájlokat is megtalálja, amelyek nevében az „Aug” szerepel.
rendezés +4n: A grep kimenetének rendezése a negyedik oszlopban (fájlméret).
Rendezett listát kapunk az összes augusztusban módosított fájlról (évtől függetlenül), fájlméret szerint növekvő sorrendben.
grep: Kevesebb parancs, több szövetséges
A grep egy nagyszerű eszköz, amely az Ön 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.
A grep és néhány reguláris kifejezés összekapcsolása – a fu valóban a következő szintre emeli.