Teksti otsimine: grep ja sugulased
grep valib sisendist mustriga sobivad read. Ta ei muuda faili ega kuva vaikimisi ainult leitud sõna: välja tuleb terve rida. Sobimatu tähesuurus või mustri erimärk võib tulemust oluliselt muuta.
Esimene võrdlus
Valmista enda harjutuskataloogis väike fail. > kirjutab sama nimega faili üle.
printf 'kass\nkoer\nKass\nkassipoeg\n' > loomad.txt
grep 'kass' loomad.txt
Näed kass ja kassipoeg, mitte Kass. Otsing võib leida vaste ka pikema sõna seest.
| Valik | Tähendus | Katse |
|---|---|---|
-i | eira tähesuurust | grep -i 'kass' loomad.txt leiab ka Kass |
-n | lisa reanumber | grep -n 'koer' loomad.txt annab 2:koer |
-x | muster katab terve rea | grep -x 'kass' loomad.txt jätab kassipoeg välja |
-v | vali mittesobivad read | grep -iv 'kass' loomad.txt jätab ainult koer |
-c | loenda vastega ridu | grep -c 'kass' loomad.txt annab 2 |
Lipud võivad koos töötada. -c ei loenda kõiki sõna esinemisi: kui ühel real on kolm vastet, on see ikkagi üks vastega rida.
Vasteta otsing annab tavaliselt tühja väljundi ja lõpetuskoodi 1; leitud vaste annab 0, viga tavaliselt 2. Seega ei tähenda iga nullist erinev kood siin riket.
Täpne tekst või regulaaravaldis
Vaikimisi on muster regulaaravaldis: näiteks punkt . tähendab üht suvalist märki. -F lülitab mustrikeele välja ja otsib täpset teksti. See ei nõua veel tervet rida; selleks lisa -x.
printf 'fail.json\nfailXjson\n' > nimed.txt
grep '.json' nimed.txt
grep -F '.json' nimed.txt
Esimene leiab mõlemad read, teine ainult fail.json. Shelli jutumärgid hoiavad mustri ühe argumendina, kuid ei lülita grep-i mustrikeelt välja.
| Muster | Tähendus |
|---|---|
^# | rea alguses on # |
json$ | rida lõpeb tekstiga json |
. | üks suvaline märk |
[0-9] | üks number |
.* | null või rohkem suvalisi märke |
[0-9]+ koos -E-ga | vähemalt üks number |
-E valib laiendatud regulaaravaldised. Vanade käsunimede egrep ja fgrep asemel kasuta grep -E ja grep -F.
Otsi kataloogipuust
-r otsib rekursiivselt. Anna nii muster kui ka alguskataloog; suurtes puudes võib otsing aega võtta.
grep -rn 'TODO' .
Tulemuse ees on failinimi ja reanumber. GNU grep-i -R järgib lisaks otsingu käigus leitud sümbollinke; -r ja -R ei ole lihtsalt kaks kirjapilti samale lipule. Ära otsi alguseks kogu juurkataloogist ega peida ligipääsuveateateid.
Sõnamõistatus, mille tulemust saab kontrollida
-x 'a.t.l' nõuab viiemärgilist rida: esimene märk a, kolmas t ja viies l. Tee väike kontrollitav sõnaloend:
printf '%s\n' antal aptal artal artel astel attal axtel kass > words.txt
grep -x 'a.t.l' words.txt
Vasteks on esimesed seitse rida, mitte kass. Suuremaks otsinguks sobib õpiku genereeritud näidisloend; see ei ole kontrollitud loomuliku keele sõnastik ning vastete arv sõltub andmetest.
Jätk pärast sortimise peatükki
See katse kasutab ka sortimist ja koondamist. grep -o . väljastab iga leitud märgi eraldi; sort toob võrdsed märgid kokku, uniq -c loendab need ja sort -nr järjestab arvuliselt kahanevalt:
grep -x 'a.t.l' words.txt | grep -o . | sort | uniq -c | sort -nr
Tähe a loendus on 11, t loendus 8 ja l loendus 7. Katse ühendab otsingu ja lihtsa statistika. Tähesuuruse ühtlustamist õpetab teksti teisendamine.
Edasijõudnule: korduva tüki leidmine
GNU grep -E toetab tagasiviiteid, kuid nende tugi laiendatud regulaaravaldistes pole kõigi tööriistade vahel ühesugune. (..) jätab kahe märgi paari meelde, \1 viitab samale paarile ja + nõuab vähemalt üht kordust.
printf '%s\n' aaaaaa a.a.a. ratatat kass | grep -E '(..)\1\1+'
Esimesed kolm rida sobivad: aa, a. või at kordub vähemalt kolm korda. ratatat sees sobib osa atatat; valikuga -x see terve rida enam ei sobiks. Tagasiviited võivad olla aeglased: kasuta neid põhjusega, mitte tavalise tekstihaku asemel.
Minitest
- Lisa
loomad.txtlõppu ridakass kass. Kuidas muutubgrep -ctulemus? - Leia nii
kasskuiKass, kuid mittekassipoeg, ühe käsuga. - Miks erinevad
grep '.json'jagrep -F '.json'? - Muuda sõnamõistatuse mustrit ning ennusta tulemus enne käivitamist.
- Kuidas eristad „vastet ei leitud“ ja „faili ei saanud lugeda“?
Lisalugemine
Ametlik GNU grep-i juhend ning tekstitöötluse viited.
Peatüki täisspikker
Töövood
Eesmärk
Vali tekstist sobivad read; erista täpset teksti regulaaravaldisest.
Otsingukuju ja tulemus
grep 'kass' loomad.txtka pikema sõna sees; väljastab terve reagrep -in 'kass' loomad.txteira tähesuurust, lisa reanumbridgrep -x 'kass' loomad.txtainult tervenisti sobiv ridagrep -v '^#' seadistus.confjäta välja # märgiga algavad readgrep -F '.json' nimed.txtpunkt tähendab päris punkti, mitte suvalist märkigrep -rn 'TODO' .otsi failipuust koos failinimede ja reanumbritegagrep -c 'kass' loomad.txtloenda vastega ridu, mitte kõiki esinemisi
grep-i tulemuskoodid
0vähemalt üks vaste1vasteid pole, mitte tingimata viga2tavaliselt viga; loe veateadet