Android

Grep-komento linuxissa (etsi tiedosto tiedostoista)

SED Tutorial Basic Substitution Linux Shell BASH

SED Tutorial Basic Substitution Linux Shell BASH

Sisällysluettelo:

Anonim

grep komento, joka tarkoittaa ”globaalia säännöllisen lausekkeen tulostusta”, on yksi tehokkaimmista ja yleisimmin käytetyistä komennoista Linuxissa.

Grep etsii yhtä tai useampaa syöttötiedostoa riviltä, ​​jotka vastaavat annettua mallia, ja kirjoittaa jokaisen vastaavan rivin vakiotulosteeseen. Jos tiedostoja ei määritetä, grep lukee normaalitulosta, joka on yleensä toisen komennon lähtö.

Tässä opetusohjelmassa me näytämme kuinka grep komentoa käytetään käytännön esimerkkien avulla ja yksityiskohtaiset selitykset yleisimmistä GNU grep vaihtoehdoista.

Grep-komennon syntaksi

Ennen kuin aloitamme grep komennon käytön, aloitamme tarkistamalla perussintaksi.

grep ovat seuraavassa muodossa:

grep PATTERN

Hakasulkeissa olevat tuotteet ovat valinnaisia.

  • OPTIONS - nolla tai enemmän vaihtoehtoja. Grep tarjoaa useita vaihtoehtoja, joilla hallitaan sen käyttäytymistä. PATTERN - Hakukuvio. FILE - nolla tai enemmän sisääntulotiedostonimiä.

Jotta tiedostoa voidaan hakea, komentoa ajavalla käyttäjällä on oltava lukuoikeus tiedostoon.

Kuinka käyttää grep hakemaan merkkijonoa tiedostoista

grep komennon perusteellisin käyttö on merkkijonon (tekstin) etsiminen tiedostosta.

Esimerkiksi, jos haluat näyttää rivit /etc/passwd tiedostosta, joka sisältää merkkijono bash voit käyttää seuraavaa komentoa:

grep bash /etc/passwd

Lähdön tulisi näyttää noin:

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

Jos merkkijono sisältää välilyöntejä, sinun on liitettävä se yksittäisiin tai kaksinkertaisiin lainausmerkkeihin:

grep "Gnome Display Manager" /etc/passwd

Käännä ottelu (sulje pois)

Jos haluat näyttää rivit, jotka eivät vastaa kuviota, käytä -v (tai --invert-match ) -vaihtoehtoa.

Esimerkiksi näyttääksesi /etc/passwd tiedoston rivit, jotka eivät sisällä merkkijonoa nologin voit käyttää seuraavaa komentoa:

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

Kuinka käyttää Grepiä merkkijonon etsimiseen komentoulostulossa

Syöttötiedostojen määrittämisen sijasta voit liittää toisen komennon tulosteen grep ja näyttää sitten vain tietyn mallin mukaiset rivit.

Esimerkiksi selvittääksesi, mitkä prosessit ovat käynnissä järjestelmässäsi käyttäjän www-data voit käyttää seuraavaa ps komentoa:

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

Voit ketjuttaa useita putkia myös komennossa. Kuten yllä olevasta tuotosta voidaan nähdä, siellä on myös rivi, joka sisältää grep prosessin. Jos et halua, että rivi näkyy, siirrä lähtö toiseen grep esiintymään, kuten alla on osoitettu.

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

Rekursiivinen haku

Voit hakea kuvion rekursiivisesti käyttämällä -r vaihtoehtoa (tai - --recursive ). Tämä etsii kaikkia määritetyn hakemiston tiedostoja ohittaen rekursiivisesti kohdatut linkit. Seuraa kaikkia symbolisia linkkejä käyttämällä -R vaihtoehtoa (tai - --dereference-recursive ).

Seuraavassa esimerkissä etsimme merkkijonoa linuxize.com kaikista tiedostoista /etc hakemistossa:

grep -r linuxize.com /etc

Komento tulostaa vastaavat rivit, jotka on koottu täyteen polkuun tiedostoon.

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

Jos sen sijaan -r käytät -R vaihtoehtoa, grep seuraa kaikkia symbolisia linkkejä:

grep -R linuxize.com /etc

Huomaa tulosteen viimeinen rivi. Tätä riviä ei tulosteta yllä olevassa esimerkissä, koska Nginxin sites-enabled hakemiston sisällä olevat tiedostot ovat linkkejä konfigurointitiedostoille sites-available hakemiston sisällä.

/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;

Näytä vain tiedostonimi

Voit estää grep ja tulostaa vain vastaavien kuvioiden sisältävien tiedostojen nimet käyttämällä -l (tai --files-with-matches ) -vaihtoehtoa.

Voit esimerkiksi etsiä kaikista tiedostoista, jotka päättyvät .conf tiedostoon nykyisessä työhakemistossa, ja tulostaa vain tiedostojen nimet, jotka sisältävät merkkijono linuxize.com tyypin:

grep -l linuxize.com *.conf

Tulos näyttää tältä:

tmux.conf haproxy.conf

-l vaihtoehtoa käytetään yleensä yhdessä rekursiivisen vaihtoehdon -R :

grep -Rl linuxize.com /tmp

Kirjainkoolla merkityksetön haku

Oletusarvon mukaan grep komento on kirjainkoko. Tämä tarkoittaa, että isoja ja pieniä merkkejä käsitellään erillisinä.

Voit ohittaa tapauksen etsiessäsi -i vaihtoehdolla (tai --ignore-case ).

Esimerkiksi, kun etsit Zebra ilman vaihtoehtoa, seuraava komento ei näytä mitään tulosta, ts. On vastaavia rivejä:

grep Zebra /usr/share/words

Mutta jos suoritat kirjaimiin epäherkän haun käyttämällä -i vaihtoehtoa, se vastaa sekä isoja että pieniä kirjaimia:

grep -i Zebra /usr/share/words

Jos määrität ”Zebra”, se vastaa “zebra”, “ZEbrA” tai mikä tahansa muu kyseisen merkkijonon isojen ja pienten kirjainten yhdistelmä.

zebra zebra's zebras

Hae kokonaisia ​​sanoja

Kun etsit ”gnu”, grep tulostaa myös rivit, joihin “gnu” on upotettu suuremmilla sanoilla, kuten “cygnus” tai “magnum”.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Jos haluat palauttaa vain ne rivit, joissa määritetty merkkijono on koko sana (ei-sanamerkit suljettu), käytä -w (tai --word-regexp ) -vaihtoehtoa.

Sanamerkkeihin sisältyvät aakkosnumeeriset merkit ( az , AZ ja 0-9 ) ja alaviivat ( _ ). Kaikkia muita merkkejä pidetään ei-sanallisina merkkeinä.

grep -w gnu /usr/share/words

gnu

Näytä rivinumero

Jos haluat näyttää rivien määrän, jotka sisältävät kuviota vastaavan merkkijonon, käytä -n (tai - --line-number ) -vaihtoehtoa. Kun tätä vaihtoehtoa käytetään, grep tulostaa ottelut vakioulostuloon, jonka etulinjassa on rivinumero, josta se löytyi.

Esimerkiksi näyttääksesi rivit /etc/services tiedostosta, joka sisältää vastaavalla rivinumeroilla varustetun merkkijono bash voit käyttää seuraavaa komentoa:

grep -n 10000 /etc/services

Alla oleva tulos osoittaa meille, että ottelut löytyvät riveiltä 10423 ja 10424.

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

Count ottelut

Voit tulostaa sopivien rivien määrän vakiotulosteeseen käyttämällä -c (tai --count ) -vaihtoehtoa.

Seuraavassa esimerkissä lasketaan tilien lukumäärä, joissa /usr/bin/zsh on kuori.

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

4

Etsi useita merkkijonoja (kuvioita)

Kaksi tai useampia hakumalleja voidaan yhdistää TAI-operaattorilla | .

Oletuksena grep tulkitsee kuvion säännölliseksi peruslausekkeeksi, jossa metamerkit, kuten | menettävät erityisen merkityksensä, ja niiden alaviivaisia ​​versioita on käytettävä.

Alla olevassa esimerkissä etsimme Nginx-lokitiedostojen kaikista sanoista fatal , error ja critical sanoja:

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

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

Hiljainen tila

-q (tai --quiet ) käskee grep tä olemaan kirjoittamatta mitään päätelaitteelle (vakiolähtö). Jos vastaavuus löytyy, komento poistuu tilassa 0 . Tämä on hyödyllistä, kun käytetään grep komentosarjoja komentosarjoissa, joissa haluat tarkistaa, sisältääkö tiedosto merkkijonoa, ja suorittaa tietty toiminto tuloksesta riippuen.

Tässä on esimerkki grep käytöstä hiljaisessa tilassa grep if lauseessa:

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

Perussäännöllinen lauseke

GNU Grepillä on kaksi säännöllisen lausekkeen ominaisuusjoukkoa, Basic ja Extended. Oletuksena grep tulkitsee kuvion säännölliseksi peruslausekkeeksi.

Säännöllisessä peruslausekkeessa käytettynä kaikki muut merkit paitsi metamerkit ovat itse säännöllisiä lausekkeita, jotka vastaavat itseään. Alla on luettelo yleisimmin käytetyistä metamerkeistä:

  • Vastaa lauseketta rivin alussa ^ (caret) -symbolilla. Seuraavassa esimerkissä merkkijono ^kangaroo vastaa vain jos se esiintyy rivin alussa.

    grep "^kangaroo" file.txt

    Käytä symbolia $ (dollari) sovittaaksesi lauseen rivin loppuun. Seuraavassa esimerkissä kangaroo$ vastaa vain, jos se esiintyy rivin lopussa.

    grep "kangaroo$" file.txt

    Käytä . (ajanjakso) -symboli, joka vastaa yhtä merkkiä. Esimerkiksi, jos haluat vastata jotain, joka alkaa kan sitten kaksi merkkiä ja päättyy merkkijonoon roo , voit käyttää seuraavaa mallia:

    grep "kan..roo" file.txt

    Käyttää (suluissa), jotta hakasulkeissa oleva merkki vastaa yhtä merkkiä. Löydä esimerkiksi rivit, jotka sisältävät accept tai ” accent , voit käyttää seuraavaa mallia:

    grep "accet" file.txt

    Käyttää (suluissa), jotta hakasulkeissa oleva merkki vastaa yhtä merkkiä. Seuraava kuvio vastaa mitä tahansa merkkijonojen yhdistelmää, joka sisältää co(any_letter_except_l)a , kuten co(any_letter_except_l)a , cobalt ja niin edelleen, mutta ei vastaa linjoja, jotka sisältävät cola , grep "coa" file.txt

Voit välttyä seuraavan merkin erityisestä merkityksestä käyttämällä \ (backslash) -merkkiä.

Laajennetut säännölliset lausekkeet

Voit tulkita kuvion laajennettuna säännöllisellä lausekkeella käyttämällä -E (tai --extended-regexp ) -vaihtoehtoa. Laajennetut säännölliset lausekkeet sisältävät kaikki perusmetamerkit yhdessä ylimääräisten metamerkkien kanssa monimutkaisempien ja tehokkaampien hakumallien luomiseksi. Alla on esimerkkejä:

  • Sovita ja purkaa kaikki sähköpostiosoitteet annetusta tiedostosta:

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

    Sovita ja purkaa kaikki kelvolliset IP-osoitteet annetusta tiedostosta:

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

-o asetusta käytetään vain vastaavan merkkijonon tulostamiseen.

Tulosta linjat ennen ottelua

Jos haluat tulostaa tietyn määrän rivejä ennen rivien sovittamista, käytä -B (tai - --before-context ) -vaihtoehtoa.

Esimerkiksi, jos haluat näyttää viisi johtavaa kontekstiriviä ennen rivien sovittamista, käytä seuraavaa komentoa:

grep -B 5 root /etc/passwd

Tulosta rivit ottelun jälkeen

Jos haluat tulostaa tietyn määrän rivejä rivien sovittamisen jälkeen, käytä -A (tai --after-context ) -vaihtoehtoa.

Esimerkiksi, jos haluat näyttää viisi jälkikontekstin riviä vastaavien rivien jälkeen, käyttäisit seuraavaa komentoa:

grep -A 5 root /etc/passwd

johtopäätös

grep komennon avulla voit etsiä mallia tiedostoista. Jos vastaavuus löytyy, grep tulostaa määritetyn kuvion sisältävät rivit.

Grepistä voi oppia paljon lisää Grepin käyttöoppaan sivulta.

grep-pääte