Beetaversioon: sisu on enamasti terviklik ja avalikuks katsetamiseks valmis, kuid vajab veel tehnilist, keelelist ja kasutatavuse kontrolli.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Teksti otsimine: grep ja sugulased, mis kuulub osasse Osa IV: Tekst, otsing ja automatiseerimine.

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.

ValikTähendusKatse
-ieira tähesuurustgrep -i 'kass' loomad.txt leiab ka Kass
-nlisa reanumbergrep -n 'koer' loomad.txt annab 2:koer
-xmuster katab terve reagrep -x 'kass' loomad.txt jätab kassipoeg välja
-vvali mittesobivad readgrep -iv 'kass' loomad.txt jätab ainult koer
-cloenda vastega ridugrep -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.

MusterTä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-gavä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

  1. Lisa loomad.txt lõppu rida kass kass. Kuidas muutub grep -c tulemus?
  2. Leia nii kass kui Kass, kuid mitte kassipoeg, ühe käsuga.
  3. Miks erinevad grep '.json' ja grep -F '.json'?
  4. Muuda sõnamõistatuse mustrit ning ennusta tulemus enne käivitamist.
  5. 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 rea
  • grep -in 'kass' loomad.txteira tähesuurust, lisa reanumbrid
  • grep -x 'kass' loomad.txtainult tervenisti sobiv rida
  • grep -v '^#' seadistus.confjäta välja # märgiga algavad read
  • grep -F '.json' nimed.txtpunkt tähendab päris punkti, mitte suvalist märki
  • grep -rn 'TODO' .otsi failipuust koos failinimede ja reanumbritega
  • grep -c 'kass' loomad.txtloenda vastega ridu, mitte kõiki esinemisi

grep-i tulemuskoodid

  • 0vähemalt üks vaste
  • 1vasteid pole, mitte tingimata viga
  • 2tavaliselt viga; loe veateadet