Kuinka käyttää grep-komentoa Linuxissa

Linux- grepkomento on merkkijonojen ja kuvioiden sovitusapuohjelma, joka näyttää yhteensopivat rivit useista tiedostoista. Se toimii myös muiden komentojen putkilähdön kanssa. Näytämme sinulle miten.

Grepin tarina

grepKomento on tunnettu Linux ja Unix piireissä kolmesta syystä. Ensinnäkin se on erittäin hyödyllinen. Toiseksi, runsaasti vaihtoehtoja voi olla ylivoimainen. Kolmanneksi se kirjoitettiin yön yli tietyn tarpeen tyydyttämiseksi. Kaksi ensimmäistä ovat lyöneet; kolmas on hieman pois päältä.

Ken Thompson oli poiminut säännöllisen lausekkeen hakuominaisuudet ededitorista (lausutaan ee-dee) ja luonut pienen ohjelman - omaan käyttöön - tekstitiedostojen etsimiseen. Hänen osastopäällikkönsä Bell Labsissa Doug Mcilroy lähestyi Thompsonia ja kuvasi ongelmaa, jota hänen kollegansa Lee McMahon kohtasi.

McMahon yritti tunnistaa federalististen asiakirjojen kirjoittajat tekstianalyysin avulla. Hän tarvitsi työkalun, joka voisi etsiä lauseita ja merkkijonoja tekstitiedostoista. Thompson käytti noin tunnin sinä iltana tekemällä työkalustaan ​​yleisen apuohjelman, jota muut voisivat käyttää, ja nimeksi sen uudelleen grep. Hän otti nimen edkomentosarjasta g/re/p, joka tarkoittaa "yleisen säännöllisen lausekkeen hakua".

Voit katsoa Thompsonin puhuvan Brian Kernighanille syntymästä grep.

Yksinkertaiset haut grepillä

Jos haluat etsiä merkkijonoa tiedostosta, välitä hakutermi ja tiedostonimi komentoriviltä:

Vastaavat rivit näytetään. Tässä tapauksessa se on yksi rivi. Vastaava teksti on korostettu. Tämä johtuu siitä, että useimmissa jakeluissa grepon alias:

alias grep = "grep - väri = auto"

Katsotaanpa tuloksia, joissa on useita rivejä, jotka vastaavat toisiaan. Etsimme sanaa "keskiarvo" sovelluksen lokitiedostosta. Koska emme muista, onko sana lokitiedostossa pientä, käytämme -i vaihtoehtoa (ohita kirjainkoko):

grep -i Keskimääräinen geek-1.log

Jokainen vastaava rivi näytetään, ja vastaava teksti on korostettu jokaisessa.

Voimme näyttää ei-yhteensopivat rivit käyttämällä -v (invert match) -vaihtoehtoa.

grep -v Mem geek-1.log

Korostusta ei ole, koska nämä eivät ole yhteensopivia viivoja.

Voimme grepolla täysin hiljaa. Tulos välitetään kuorelle paluuarvona kohteesta grep. Tuloksena nolla välineet merkkijono on löytynyt, ja tuloksena yksi keino se ei löytynyt. Voimme tarkistaa palautuskoodin  $?erityisparametreilla:

grep -q keskimääräinen geek-1.log
kaiku $?
grep -q howtogeek geek-1.log
kaiku $?

Rekursiiviset haut grepillä

Voit etsiä sisäkkäisiä hakemistoja ja alihakemistoja käyttämällä -r (rekursiivinen) -vaihtoehtoa. Huomaa, että et anna tiedostonimeä komentoriville, sinun on annettava polku. Täältä haemme nykyisestä hakemistosta “.” ja mahdolliset alihakemistot:

grep -r -i memfree.

Tulos sisältää kunkin vastaavan rivin hakemiston ja tiedostonimen.

Voimme  grep  seurata symbolisia linkkejä käyttämällä -R(rekursiivinen poikkeama) -vaihtoehtoa. Meillä on symbolinen linkki tässä hakemistossa, nimeltään logs-folder. Se osoittaa /home/dave/logs.

ls -l lokit-kansio

Toistetaan viimeinen haku  -R(rekursiivinen poikkeama) -vaihtoehdolla:

grep -R -i memfree.

Symbolista linkkiä seurataan ja myös hakemistoon, johon se osoittaa grep.

Etsitään kokonaisia ​​sanoja

Oletusarvoisesti grepvastaa riviä, jos hakukohde näkyy missä tahansa rivillä, myös toisen merkkijonon sisällä. Katso tätä esimerkkiä. Aiomme etsiä sanaa "ilmainen".

grep -i ilmainen geek-1.log

Tulokset ovat rivejä, joissa on merkkijono "vapaa", mutta ne eivät ole erillisiä sanoja. Ne ovat osa merkkijonoa "MemFree".

Jos haluat pakottaa grep vastaamaan vain erillisiä sanoja, käytä -w(sana regexp) -vaihtoehtoa.

grep -w -i ilmainen geek-1.log
kaiku $?

Tällä kertaa tuloksia ei ole, koska hakutermi "vapaa" ei näy tiedostossa erillisenä sanana.

Useiden hakutermien käyttö

-E(Laajennettu regexp) vaihtoehdon avulla voit hakea useita sanoja. ( -EVaihtoehto korvaa vanhentuneen egrepversion grep.)

Tämä komento etsii kahta hakutermiä, keskimääräinen ja memfree.

grep -E -w -i "keskimääräinen | memfree" geek-1.log

Kaikki vastaavat rivit näytetään jokaiselle hakutermille.

Voit myös etsiä useita termejä, jotka eivät välttämättä ole kokonaisia ​​sanoja, mutta ne voivat olla myös kokonaisia ​​sanoja.

-e(Kuviot) vaihtoehdon avulla voit käyttää useita hakusanoja komentorivillä. Käytämme säännöllisen lausekkeen haarukointiominaisuutta hakukuvion luomiseen. Se kertoo grepvastaavansa jotain suluissa ”[]” olevista merkeistä. Tämä tarkoittaa, että grepse vastaa joko ”kB” tai “KB”, kun se hakee.

Molemmat merkkijonot ovat yhteensopivia, ja itse asiassa jotkut rivit sisältävät molemmat merkkijonot.

Vastaavat linjat täsmälleen

-x(Linja regexp) vastaa vain radoilla, joilla koko rivi vastaa hakutermiä. Etsitään päivämäärä- ja aikaleimaa, jonka tiedämme esiintyvän vain kerran lokitiedostossa:

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

Löydetään ja näytetään yksi vastaava rivi.

Sen päinvastainen on vain linjojen näyttäminen, jotka eivät täsmää. Tästä voi olla hyötyä, kun tarkastelet määritystiedostoja. Kommentit ovat hienoja, mutta joskus on vaikea havaita todellisia asetuksia kaikkien kesken. Tässä on /etc/sudoerstiedosto:

Voimme suodattaa tehokkaasti kommenttirivit näin:

sudo grep -v "#" / etc / sudoers

Se on paljon helpompaa jäsentää.

Näytetään vain vastaava teksti

Saattaa olla tilanne, jolloin et halua nähdä koko vastaavaa riviä, vain vastaavaa tekstiä. -o(Vain matching) vaihtoehto juuri sellainen.

grep -o MemFree geek-1.log

Näyttö on rajoitettu näyttämään vain hakutermiä vastaava teksti koko vastaavan rivin sijaan.

Laskeminen grepillä

grepei ole vain tekstiä, se voi myös antaa numeerista tietoa. Voimme greplaskea meille eri tavoin. Jos haluamme tietää, kuinka monta kertaa hakutermi esiintyy tiedostossa, voimme käyttää -c(laskea) -vaihtoehtoa.

grep -c keskimääräinen geek-1.log

grep ilmoittaa, että hakutermi esiintyy tässä tiedostossa 240 kertaa.

Voit asettaa grepjokaisen vastaavan rivin rivinumeron näyttämään -n(rivin numero) -vaihtoehdolla.

grep -n Jan geek-1.log

Jokaisen vastaavan rivin rivinumero näkyy rivin alussa.

Voit vähentää näytettävien tulosten määrää käyttämällä -m(max count) -vaihtoehtoa. Rajoitamme tuotoksen viiteen vastaavaan riviin:

grep -m5 -n Jan geek-1.log

Kontekstin lisääminen

Useiden lisärivien - mahdollisesti ei-yhteensopivien rivien - näkeminen jokaiselle vastaavalle riville on usein hyödyllistä. se voi auttaa erottamaan mitkä vastaavista viivoista ovat sinua kiinnostavia.

Jos haluat näyttää joitain rivejä vastaavan rivin jälkeen, käytä -A (kontekstin jälkeen) -vaihtoehtoa. Tässä esimerkissä pyydämme kolmea riviä:

grep -A 3 -x "20. tammikuuta-06 15:24:35" geek-1.log

Jos haluat nähdä joitain rivejä vastaavan rivin edestä, käytä -B(konteksti ennen) -vaihtoehtoa.

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

Jos haluat lisätä riviä vastaavan rivin edestä ja jälkeen, käytä -C(konteksti) -vaihtoehtoa.

grep -C 3 -x "20. tammikuuta-06 15:24:35" geek-1.log

Näytetään vastaavat tiedostot

Jos haluat nähdä hakutermin sisältävien tiedostojen nimet, käytä -l (tiedostot haulla ) -vaihtoehtoa. sl.hKäytä tätä komentoa saadaksesi selville, mitkä C-lähdekooditiedostot sisältävät viitteitä otsikkotiedostoon:

grep -l "sl.h" * .c

Luettelossa on tiedostojen nimet, ei vastaavia rivejä.

Ja tietysti voimme etsiä tiedostoja, jotka eivät sisällä hakutermiä. -L(Tiedostoja ilman ottelu) vaihtoehto juuri sellainen.

grep -L "sl.h" * .c

Linjojen alku ja loppu

Voimme pakottaa grepnäyttämään vain ottelut, jotka ovat joko rivin alussa tai lopussa. Säännöllisen lausekkeen operaattori ”^” vastaa rivin alkua. Lähes kaikki lokitiedoston rivit sisältävät välilyöntejä, mutta aiomme etsiä rivejä, joissa on ensimmäinen välilyönti:

grep "^" geek-1.log

Rivit, joiden ensimmäisessä merkissä on välilyönti - rivin alussa -, näytetään.

Käytä rivin loppua vastaamaan säännöllisen lausekkeen operaattoria "$". Etsimme rivejä, jotka päättyvät numeroon "00".

grep "00 $" geek-1.log

Näytössä näkyvät rivit, joiden viimeisissä merkeissä on "00".

Putkien käyttö grepillä

Voit tietysti syöttää syötteen grep, putken ulostulon greptoiseen ohjelmaan ja grepsijoittua putkiketjun keskelle.

Oletetaan, että haluamme nähdä kaikki merkkijonon "ExtractParameters" esiintymät C-lähdekooditiedostoissamme. Tiedämme, että niitä tulee olemaan melko vähän, joten syötämme tuotoksen less:

grep "ExtractParameters" * .c | Vähemmän

Tuotos on esitetty less.

Tämän avulla voit selata tiedostoluetteloa ja käyttää less'shakutoimintoa.

Jos me putki tuloste greptulee wcja käyttää -l(riviä) vaihtoehto, voimme laskea, kuinka monta riviä lähdekoodia tiedostoja, jotka sisältävät ”ExtractParameters”. (Voisimme saavuttaa tämän käyttämällä grep-c(count) -vaihtoehtoa, mutta tämä on siisti tapa osoittaa putkistojen poistaminen grep.)

grep "ExtractParameters" * .c | wc -l

Seuraavan komennon avulla putkistamme lähdön lssisään grepja putken lähdön grepsisään sort. Luetteloimme tiedostot nykyiseen hakemistoon, valitsemme ne, joissa on merkkijono "Aug", ja lajitellaan ne tiedostokoon mukaan:

ls -l | grep "elokuu" | lajittelu + 4n

Hajotetaan se:

  • ls -l : Suorita tiedostojen pitkä muotoinen luettelo käyttämällä ls.
  • grep "Aug" : Valitse luettelosta rivit, lsjoissa on "Aug". Huomaa, että tämä löytää myös tiedostoja, joiden nimissä on "Aug".
  • sort + 4n : Lajittele ulostulo grepistä neljännessä sarakkeessa (tiedostokoko).

Saamme lajiteltu luettelo kaikista elokuussa muokatuista tiedostoista (vuodesta riippumatta) tiedostojen koon nousevassa järjestyksessä.

RELATED: Kuinka käyttää putkia Linuxissa

grep: Vähemmän komentoa, enemmän liittolaista

grepon loistava työkalu käytettävissänne. Se on vuodelta 1974 ja on edelleen vahva, koska tarvitsemme sitä, mitä se tekee, eikä mikään tee sitä paremmin.

Yhdistäminen grepjoihinkin säännöllisiin lausekkeisiin-fu todella vie sen seuraavalle tasolle.

RELATED: Kuinka käyttää säännöllisiä säännöllisiä lausekkeita etsimään paremmin ja säästämään aikaa