Grepin (ja egrepin) käyttäminen säännöllisten lausekkeiden kanssa

Using Grep With Regular Expressions



Tässä opetusohjelmassa kuvataan molempien käyttö pito (ja egrep) t o löytää tekstiä tiedostoista, yksinkertaisessa muodossaan ja yhdistettynä säännöllisiin lausekkeisiin. Se sisältää useita esimerkkejä ja harjoitukset , lisää ratkaisuja , katsojan loppuun.

Nimi pito tulee ed (ja vim) -komennosta g/re/p, mikä tarkoittaa tietyn säännöllisen lausekkeen maailmanlaajuista etsimistä ja tulostuksen tulostamista (näyttämistä).







Säännöllinen Lausekkeet

Apuohjelmien avulla käyttäjä voi etsiä tekstitiedostoista rivejä, jotka vastaavat säännöllistä lauseketta ( säännöllinen lauseke ). Säännöllinen lauseke on hakumerkkijono, joka koostuu tekstistä ja yhdestä tai useammasta 11 erikoismerkistä. Yksinkertainen esimerkki on rivin alun vastaaminen.



Esimerkkitiedosto

Perusmuoto pito voidaan käyttää yksinkertaisen tekstin etsimiseen tietystä tiedostosta tai tiedostoista. Voit kokeilla esimerkkejä luomalla ensin mallitiedoston.



Kopioi alla oleva teksti tiedostoon nimeltä editori, kuten nano tai vim minun tiedostoni .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Vaikka voit kopioida ja liittää esimerkkejä tekstiin (huomaa, että lainausmerkit eivät välttämättä kopioi oikein), komennot on kirjoitettava, jotta ne oppivat oikein.

Ennen kuin yrität esimerkkejä, katso mallitiedosto:



$kissaminun tiedostoni

Yksinkertainen haku

Etsi tiedosto 'xyz' tiedostosta seuraavasti:

$pitoxyz -tiedosto

Värien käyttäminen

Jos haluat näyttää värit, käytä –väriä (kaksoisviiva) tai luo alias. Esimerkiksi:

$pito --värixyz -tiedosto

tai

$alias pito= 'pito--väri'
$pitoxyz -tiedosto

Asetukset

Yleisiä vaihtoehtoja, joita käytetään pito komento sisältää:

  • -Löydän kaikki rivit riippumatta tapauksesta
  • -c Kreivi kuinka monta riviä teksti sisältää
  • -näyttörivi numeroita vastaavista linjoista
  • -vain näyttö tiedosto nimet tuo ottelu
  • -r rekursiivinen alihakemistojen haku
  • -v löytää kaikki rivit EI sisältää tekstin

Esimerkiksi:

$pito -ixyz -tiedosto# Etsi teksti tapauksesta riippumatta

$pito -icxyz -tiedosto# laske rivejä tekstin kanssa

$pito -sisäänxyz -tiedosto# näyttää rivinumerot

Luo useita tiedostoja

Ennen kuin yrität etsiä useita tiedostoja, luo ensin useita uusia tiedostoja:

$heitti poisxyz>oma tiedosto 1
$heitti pois -Jaxyz nxzz nXYZ>oma tiedosto 2
$heitti pois -Jaxxx nyy>oma tiedosto 3
$kissaoma tiedosto 1
$kissaoma tiedosto 2
$kissaoma tiedosto 3

Hae useista tiedostoista

Jos haluat etsiä useita tiedostoja käyttämällä tiedostonimiä tai yleismerkkiä, kirjoita:

$pito -icxyz myfile myfile1 myfile2 myfile3
$pito -sisäänxyz minun*
# vastaavat tiedostonimet, jotka alkavat 'minun'

Harjoitus I

  1. Laske ensin kuinka monta riviä tiedostossa /etc /passwd on.
Vinkki: käytäWC -he /jne/passwd
  1. Etsi nyt kaikki tekstin esiintymät missä tiedostossa /etc /passwd .
  2. Selvitä, kuinka monta tiedoston riviä teksti sisältää
  3. Selvitä, kuinka monta riviä EI sisällä tekstiä missä .
  4. Etsi kirjautumistietosi kohdasta /etc/passwd

Harjoitusratkaisut löytyvät tämän artikkelin lopusta.

Säännöllisten lausekkeiden käyttäminen

Käsky pito voidaan käyttää myös säännöllisten lausekkeiden kanssa käyttämällä yhtä tai useampaa yksitoista erikoismerkkiä tai symbolia haun tarkentamiseen. Säännöllinen lauseke on merkkijono, joka sisältää erikoismerkkejä, jotka mahdollistavat kuvioiden vastaavuuden apuohjelmissa, kuten pito , tulin ja sed . Huomaa, että merkkijonot on ehkä liitettävä lainausmerkkeihin.

Käytettävissä olevia erikoismerkkejä ovat:

^ Rivin alku
$ Rivin loppu
. Mikä tahansa merkki (paitsi n uusi rivi)
* 0 tai enemmän edellistä lauseketta
Edellä oleva symboli tekee siitä kirjaimellisen merkin

Huomaa, että *, jota voidaan käyttää komentorivillä vastaamaan mitä tahansa määrää merkkejä, ei yhtään, on ei käytetään täällä samalla tavalla.

Huomaa myös lainausmerkkien käyttö seuraavissa esimerkeissä.

Esimerkkejä

Löydät kaikki tekstillä alkavat rivit käyttämällä ^ -merkkiä:

$pito'^Xyz' -kansio

Jos haluat löytää kaikki tekstillä päättyvät rivit käyttämällä $ -merkkiä:

$pito'Xyz $' -kansio

Jos haluat löytää rivit, jotka sisältävät merkkijonon, joka käyttää sekä ^ - että $ -merkkejä:

$pito'^Xyz $' omatiedostot

Voit etsiä rivejä käyttämällä . vastaamaan mitä tahansa hahmoa:

$pito'^X.z' omatiedostoni

Jos haluat löytää rivit *: n avulla, jotka vastaavat 0 tai enemmän edellistä lauseketta:

$pito’^Xy*z 'myfile

Rivien etsiminen käyttämällä.* Vastaamaan 0 tai enemmän mitä tahansa merkkiä:

$pito’^ X.*z 'myfile

Voit etsiä rivejä käyttämällä paeta * -merkistä:

$pito'^ X *z 'myfile

Löydät merkin seuraavasti:

$pito'\' oma tiedosto

Lauseke grep - egrep

The pito komento tukee vain osaa käytettävissä olevista säännöllisistä lausekkeista. Kuitenkin komento egrep:

  • mahdollistaa kaikkien säännöllisten lausekkeiden täyden käytön
  • voi samanaikaisesti etsiä useampaa lauseketta

Huomaa, että lausekkeet on liitettävä lainauspariin.

Jos haluat käyttää värejä, käytä –väriä tai luo alias uudelleen:

$alias egrep='egrep -väri'

Jos haluat etsiä useamman kuin yhden regex the egrep komento voidaan kirjoittaa usealle riville. Tämä voidaan kuitenkin tehdä myös käyttämällä näitä erikoismerkkejä:

| Vaihtoehto, joko yksi tai toinen
(…) Lausekkeen osan looginen ryhmittely
$egrep '(^root |^uucp |^mail)' /jne/passwd

Tämä poimii tiedostosta rivit, jotka alkavat juurilla, uucpilla tai postilla, | symboli, joka tarkoittaa jompaa kumpaa vaihtoehtoa.

Seuraava komento tekee ei toimi, vaikka viestiä ei näytetä, koska perus pito komento ei tue kaikkia säännöllisiä lausekkeita:

$pito '(^root |^uucp |^mail)' /jne/passwd

Kuitenkin useimmissa Linux -järjestelmissä komento grep -E on sama kuin käyttää egrep :

$pito -JA '(^root |^uucp |^mail)' /jne/passwd

Suodattimien käyttäminen

Putkisto on prosessi, jolla yhden komennon tulos lähetetään syötteeksi toiseen komentoon, ja se on yksi tehokkaimmista käytettävissä olevista Linux -työkaluista.

Putkistoon ilmestyviä komentoja kutsutaan usein suodattimiksi, koska monissa tapauksissa ne selaavat tai muokkaavat heille syötettyä tuloa ennen kuin ne lähettävät muokatun virran vakiolähtöön.

Seuraavassa esimerkissä vakiolähtö ls -l välitetään vakiotulona pito komento. Lähtö pito komento välitetään syötteeksi lisää komento.

Tämä näyttää vain hakemistot /jne :

$ls -he /jne|pito'^D'|lisää

Seuraavat komennot ovat esimerkkejä suodattimien käytöstä:

$ps -ef|pitocron

$WHO|pitokdm

Esimerkkitiedosto

Voit kokeilla tarkistusharjoitusta luomalla ensin seuraavan esimerkkitiedoston.

Kopioi alla oleva teksti tiedostoon nimeltä editori, kuten nano tai vim ihmiset:

Henkilökohtainen J.Smith 25000
Henkilökohtainen E.Smith 25400
Koulutus A.Brown 27500
Koulutus C.Browen 23400
(Järjestelmänvalvoja) R.Bron 30500
Goodsout T.Smyth 30000
Henkilökohtainen F.Jones 25000
koulutus* C.Evans 25500
Goodsout W.Pope 30400
Pohjakerros T.Smythe 30500
Henkilökohtainen J.Maler 33000

Harjoitus II

  1. Näytä tiedosto ihmiset ja tutkia sen sisältöä.
  2. Etsi kaikki rivit, jotka sisältävät merkkijonon Smith Vinkki: käytä komentoa grep, mutta muista, että oletusarvoisesti se erottaa isot ja pienet kirjaimet.
  3. Luo uusi tiedosto, npeople, joka sisältää kaikki merkkijonolla alkavat rivit Henkilökohtainen Vihje: käytä komentoa grep ja>.
  4. Vahvista tiedoston sisältö ihmisille luetteloimalla tiedosto.
  5. Liitä nyt kaikki rivit, joissa teksti päättyy merkkijonoon 500 Vinkki: käytä komentoa grep >> kanssa.
  6. Vahvista uudelleen tiedoston sisältö ihmisille luetteloimalla tiedosto.
  7. Etsi tiedostoon tallennetun palvelimen IP -osoite /etc/hosts .Vihje: käytä komentoa grep komennolla $ (isäntänimi)
  8. Käyttää egrep poimia /etc/passwd tiedostotilin rivit, jotka sisältävät lp tai omaasi käyttäjätunnus .

Harjoitusratkaisut löytyvät tämän artikkelin lopusta.

Lisää säännöllisiä lausekkeita

Säännöllistä lauseketta voidaan ajatella steroidien yleismerkeinä.

Siinä on yksitoista merkkiä, joilla on erityinen merkitys: avaavat ja sulkevat hakasulkeet [], käänteisviiva , caret ^, dollarimerkki $, piste tai piste., Pystysuora palkki tai putken symboli | tähti tai tähti *, plusmerkki + sekä avaus- ja sulkukierros {}. Näitä erikoismerkkejä kutsutaan usein myös metamerkkeiksi.

Tässä on koko joukko erikoismerkkejä:

^ Rivin alku
$ Rivin loppu
. Mikä tahansa merkki (paitsi n uusi rivi)
* 0 tai enemmän edellistä lauseketta
| Vaihtoehto, joko yksi tai toinen
[…] Selkeä merkkijoukko vastaamaan
+ 1 tai useampi edellinen lauseke
? 0 tai 1 edellisestä lausekkeesta
Edellä oleva symboli tekee siitä kirjaimellisen merkin
{…} Selkeä määrällinen merkintä
(…) Lausekkeen osan looginen ryhmittely

Oletusversio pito on vain rajoitettu säännöllisen lausekkeen tuki. Jotta kaikki seuraavat esimerkit toimisivat, käytä egrep sen sijaan tai grep -E .

Voit etsiä rivejä käyttämällä | vastaamaan jompaakumpaa lauseketta:

$egrep'Xxz|xzz -tiedosto

Rivien etsiminen käyttämällä | vastaamaan jompaakumpaa lauseketta merkkijonossa, käytä myös ():

$egrep’^ X(Yz|yz)’Tiedostoni

Rivien etsiminen käyttämällä [] -merkkiä vastaamaan mitä tahansa merkkiä:

$egrep’^ X[Yy]z 'myfile

Jos haluat löytää rivit, joilla [] EI vastaa mitään merkkiä:

$egrep’^ X[^ Joo]z 'myfile

Jos haluat löytää rivit *: n avulla, jotka vastaavat 0 tai enemmän edellistä lauseketta:

$egrep’^Xy*z 'myfile

Jos haluat löytää rivit + -painikkeella, joka vastaa yhtä tai useampaa edellistä lauseketta:

$egrep'^Xy+z' tiedosto

Etsi rivit käyttämällä? vastaa 0 tai 1 edellisestä lausekkeesta:

$egrep'^Xy? Z' omatiedostot

Harjoitus III

  1. Etsi kaikki rivit, jotka sisältävät nimet Evans tai taidemaalari arkistossa ihmiset.
  2. Etsi kaikki rivit, jotka sisältävät nimet Smith, Smyth tai Smythe arkistossa ihmiset.
  3. Etsi kaikki rivit, jotka sisältävät nimet Ruskea, Browen tai Lähde Jos sinulla on aikaa:
  4. Etsi merkkijonon sisältävä rivi (ylläpitäjä), mukaan lukien hakasulkeet, tiedostoon ihmiset.
  5. Etsi rivi, joka sisältää merkin * tiedostoista people.
  6. Yhdistä yllä ja 5 löytääksesi molemmat lausekkeet.

Lisää esimerkkejä

Voit etsiä rivejä käyttämällä . ja * vastaamaan mitä tahansa merkistöä:

$egrep’^Xy.*z 'myfile

Jos haluat löytää rivit, jotka käyttävät {} -merkkiä vastaamaan N -merkkimäärää:

$egrep’^Xy{3}z 'myfile
$egrep’^Xy{4}z 'myfile

Jos haluat löytää rivit, jotka käyttävät {} yhtä monta kertaa tai useammin:

$egrep’^Xy{3,}z 'myfile

Jos haluat löytää rivit {} -toiminnolla, jotka vastaavat N kertaa, mutta enintään M kertaa:

$egrep’^Xy{2,3}z 'myfile

Johtopäätös

Tässä opetusohjelmassa tarkastelimme ensin käyttöä pito yksinkertaisessa muodossa löytää tekstiä tiedostosta tai useista tiedostoista. Yhdistimme sitten etsittävän tekstin yksinkertaisiin säännöllisiin lausekkeisiin ja sitten monimutkaisempiin lausekkeisiin egrep .

Seuraavat vaiheet

Toivon, että käytät täällä saatuja tietoja hyväksi. Kokeilla pito komentoja omiin tietoihisi ja muista, että tässä kuvattuja säännöllisiä lausekkeita voidaan käyttää samassa muodossa me , sed ja awk !

Harjoitusratkaisut

Harjoitus I

Laske ensin kuinka monta riviä tiedostossa on /etc/passwd .
$ wc -l /etc/passwd
Etsi nyt kaikki tekstin esiintymät missä tiedostossa /etc /passwd.
$ grep var /etc/passwd
Selvitä, kuinka monta tiedoston riviä teksti sisältää missä

pito -cmissä/jne/passwd

Selvitä, kuinka monta riviä EI sisällä tekstiä missä .

pito -CVmissä/jne/passwd

Etsi kirjautumistietosi kohdasta /etc/passwd tiedosto
grep kdm /etc/passwd

Harjoitus II

Näytä tiedosto ihmiset ja tutkia sen sisältöä.
$ cat people
Etsi kaikki rivit, jotka sisältävät merkkijonon Smith tiedostossa ihmiset .
$ grep 'Smith' people
Luo uusi tiedosto, npeople , joka sisältää kaikki merkkijonolla alkavat rivit Henkilökohtainen kohdassa ihmiset tiedosto
$ grep '^Personal' people> npeople
Vahvista tiedoston sisältö npeople luetteloimalla tiedosto.
$ cat npeople
Liitä nyt kaikki rivit, joissa teksti päättyy merkkijonoon 500 tiedostossa ihmiset tiedostoon npeople .
$ grep '500$' people>>npeople
Vahvista vielä kerran tiedoston sisältö npeople luetteloimalla tiedosto.
$ cat npeople
Etsi tiedostoon tallennetun palvelimen IP -osoite /etc/hosts .
$ grep $(hostname) /etc/hosts
Käyttää egrep poimia /etc/passwd tiedostotilin rivit, jotka sisältävät lp tai oma käyttäjätunnuksesi.
$ egrep '(lp|kdm:)' /etc/passwd

Harjoitus III

Etsi kaikki rivit, jotka sisältävät nimet Evans tai taidemaalari tiedostossa ihmiset .
$ egrep 'Evans|Maler' people
Etsi kaikki rivit, jotka sisältävät nimet Smith , Smyth tai Smythe tiedostossa ihmiset .
$ egrep 'Sm(i|y)the?' people
Etsi kaikki rivit, jotka sisältävät nimet Ruskea , Browen tai Lähde arkistossa ihmiset.
$ egrep 'Brow?e?n' people
Etsi merkkijonon sisältävä rivi (ylläpitäjä), hakasulkeet mukaan lukien ihmiset .

$egrep ' (Järjestelmänvalvoja )'ihmiset

Etsi rivi, joka sisältää merkin * arkistossa ihmiset.
$ egrep '*' people
Yhdistä yllä ja 5 löytääksesi molemmat lausekkeet.

$egrep ' (Järjestelmänvalvoja ) | *'ihmiset