Paggamit ng grep (at egrep) sa Mga Regular na Pagpapahayag

Using Grep With Regular Expressions



Inilalarawan ng tutorial na ito kung paano gamitin ang pareho mahigpit na pagkakahawak (at egrep) t o makahanap ng teksto sa mga file, sa kanilang simpleng form at kapag isinama sa mga regular na expression. Naglalaman ito ng maraming mga halimbawa at ehersisyo , higit pa mga solusyon , para makumpleto ang manonood.

Ang pangalan mahigpit na pagkakahawak nagmula sa ed (at vim) utos g / re / p, na nangangahulugang pandaigdigang paghahanap para sa isang naibigay na regular na expression at i-print (ipakita) ang output.







Regular Pagpapahayag

Pinapayagan ng mga utility ang gumagamit na maghanap ng mga file ng teksto para sa mga linya na tumutugma sa isang regular na expression ( regexp ). Ang isang regular na expression ay isang string ng paghahanap na binubuo ng teksto at isa o higit pa sa 11 mga espesyal na character. Ang isang simpleng halimbawa ay tumutugma sa simula ng isang linya.



Sample na File

Ang pangunahing anyo ng mahigpit na pagkakahawak maaaring magamit upang makahanap ng simpleng teksto sa loob ng isang partikular na file o mga file. Upang subukan ang mga halimbawa, lumikha muna ng sample na file.



Gumamit ng isang editor tulad ng nano o vim upang kopyahin ang teksto sa ibaba sa isang file na tinawag myfile .





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

Bagaman maaari mong kopyahin at i-paste ang mga halimbawa sa teksto (tandaan na ang dobleng mga quote ay maaaring hindi kumopya nang maayos), kailangang mai-type ang mga utos upang malaman ang mga ito nang maayos.

Bago subukan ang mga halimbawa, tingnan ang sample file:



$pusamyfile

Simpleng Paghahanap

Upang hanapin ang teksto na 'xyz' sa loob ng file patakbuhin ang sumusunod:

$mahigpit na pagkakahawakxyz myfile

Paggamit ng Mga Kulay

Upang maipakita ang mga kulay, gumamit ng –kulay (isang dobleng gitling) o simpleng lumikha ng isang alias. Halimbawa:

$mahigpit na pagkakahawak --kulayxyz myfile

o

$alyas mahigpit na pagkakahawak= ’mahigpit na pagkakahawak--kulay'
$mahigpit na pagkakahawakxyz myfile

Mga pagpipilian

Karaniwang mga pagpipilian na ginamit sa mahigpit na pagkakahawak kasama ang utos:

  • -Hahanap ko ang lahat ng mga linya hindi alintana kaso
  • -c bilangin ilang linya ang naglalaman ng teksto
  • -n linya ng pagpapakita numero ng pagtutugma ng mga linya
  • -l ipakita lamang file mga pangalan laban na yan
  • -r recursive paghahanap ng mga sub-direktoryo
  • -v hanapin ang lahat ng mga linya HINDI naglalaman ng teksto

Halimbawa:

$mahigpit na pagkakahawak -akoxyz myfile# hanapin ang teksto na hindi alintana ng kaso

$mahigpit na pagkakahawak -icxyz myfile# bilangin ang mga linya na may teksto

$mahigpit na pagkakahawak -saxyz myfile# ipakita ang mga numero ng linya

Lumikha ng Maramihang mga File

Bago subukang maghanap ng maraming mga file, lumikha muna ng maraming mga bagong file:

$itinaponxyz>myfile1
$itinapon -Atxyz nxzz nXYZ>myfile2
$itinapon -Atxxx nyyy>myfile3
$pusamyfile1
$pusamyfile2
$pusamyfile3

Maghanap ng Maramihang mga File

Upang maghanap ng maraming mga file gamit ang mga filename o isang wildcard ipasok:

$mahigpit na pagkakahawak -icxyz myfile myfile1 myfile2 myfile3
$mahigpit na pagkakahawak -saxyz my*
# match filenames na nagsisimula sa ‘my’

Ehersisyo ko

  1. Bilangin muna kung gaano karaming mga linya ang nasa file / etc / passwd.
Pahiwatig: gamitinwc -ang /atbp/passwd
  1. Hanapin ngayon ang lahat ng mga paglitaw ng teksto kung saan sa file / etc / passwd .
  2. Hanapin kung gaano karaming mga linya sa file ang naglalaman ng teksto
  3. Hanapin kung gaano karaming mga linya ang HINDI naglalaman ng teksto kung saan .
  4. Hanapin ang entry para sa iyong pag-login sa / atbp / passwd

Ang mga solusyon sa ehersisyo ay matatagpuan sa pagtatapos ng artikulong ito.

Paggamit ng Mga Regular na Pagpapahayag

Ang utos mahigpit na pagkakahawak maaari ring magamit sa mga regular na expression sa pamamagitan ng paggamit ng isa o higit pa sa labing-isang espesyal na mga character o simbolo upang pinuhin ang paghahanap. Ang isang regular na expression ay isang string ng character na nagsasama ng mga espesyal na character upang payagan ang pagtutugma ng pattern sa loob ng mga utility tulad ng mahigpit na pagkakahawak , dumating ako at sed . Tandaan na ang mga string ay maaaring kailanganin na nakapaloob sa mga quote.

Ang mga espesyal na character na magagamit ay kinabibilangan ng:

^ Simula ng isang linya
$ Pagtatapos ng isang linya
. Anumang character (maliban sa n newline)
* 0 o higit pa sa nakaraang pagpapahayag
Ang nauna sa isang simbolo ay ginagawang isang literal na character

Tandaan na ang *, na maaaring magamit sa linya ng utos upang tumugma sa anumang bilang ng mga character kabilang ang wala, ay hindi ginamit sa parehong paraan dito.

Tandaan din ang paggamit ng mga quote sa mga sumusunod na halimbawa.

Mga halimbawa

Upang makita ang lahat ng mga linya na nagsisimula sa teksto gamit ang ^ character:

$mahigpit na pagkakahawak‘^ Xyz’ myfile

Upang makita ang lahat ng mga linya na nagtatapos sa teksto gamit ang $ character:

$mahigpit na pagkakahawak'Xyz $' myfile

Upang makahanap ng mga linya na naglalaman ng isang string gamit ang parehong ^ at $ character:

$mahigpit na pagkakahawak‘^ Xyz $’ myfile

Upang makahanap ng mga linya gamit ang . upang tumugma sa anumang character:

$mahigpit na pagkakahawak‘^ X.z’ myfile

Upang makahanap ng mga linya gamit ang * upang tumugma sa 0 o higit pa sa nakaraang pagpapahayag:

$mahigpit na pagkakahawak‘^ Xy*z ’myfile

Upang makahanap ng mga linya gamit. * Upang tumugma sa 0 o higit pa sa anumang character:

$mahigpit na pagkakahawak‘^ X.*z ’myfile

Upang makahanap ng mga linya gamit ang upang makatakas sa * character:

$mahigpit na pagkakahawak‘^ X *z ’myfile

Upang hanapin ang character use:

$mahigpit na pagkakahawak‘\’ myfile

Expression grep - egrep

Ang mahigpit na pagkakahawak Sinusuportahan lamang ng utos ang isang subset ng mga regular na expression na magagamit. Gayunpaman, ang utos egrep:

  • Pinapayagan ang buong paggamit ng lahat ng mga regular na expression
  • maaaring sabay na maghanap ng higit sa isang pagpapahayag

Tandaan na ang mga expression ay dapat na nakapaloob sa loob ng isang pares ng mga quote.

Upang magamit ang mga kulay, gumamit ng –kulay o muling lumikha ng isang alias:

$alyas egrep='egrep --color'

Upang maghanap ng higit sa isa regex ang egrep Ang utos ay maaaring nakasulat sa maraming mga linya. Gayunpaman, magagawa rin ito gamit ang mga espesyal na character na ito:

| Kahalili, alinman sa isa o iba pa
(…) Lohikal na pagpapangkat ng bahagi ng isang expression
$egrep '(^ root | ^ uucp | ^ mail)' /atbp/passwd

Kinukuha nito ang mga linya na nagsisimula sa root, uucp o mail mula sa file, ang | simbolo nangangahulugang alinman sa mga pagpipilian.

Ang sumusunod na utos ay hindi trabaho, kahit na walang mensahe ay ipinapakita, dahil ang pangunahing mahigpit na pagkakahawak Hindi sinusuportahan ng utos ang lahat ng mga regular na expression:

$mahigpit na pagkakahawak '(^ root | ^ uucp | ^ mail)' /atbp/passwd

Gayunpaman, sa karamihan ng mga system ng Linux ang utos grep -E ay katulad ng paggamit egrep :

$mahigpit na pagkakahawak -AND '(^ root | ^ uucp | ^ mail)' /atbp/passwd

Paggamit ng Mga Filter

Piping ay ang proseso ng pagpapadala ng output ng isang utos bilang pag-input sa ibang utos at isa sa pinakamakapangyarihang kasangkapan sa Linux na magagamit.

Ang mga utos na lilitaw sa isang pipeline ay madalas na tinutukoy bilang mga filter dahil sa maraming mga kaso ay sinala nila o binago ang input na naipasa sa kanila bago ipadala ang binagong stream sa karaniwang output.

Sa sumusunod na halimbawa, karaniwang output mula sa ls -l ay naipasa bilang karaniwang input sa mahigpit na pagkakahawak utos Output mula sa mahigpit na pagkakahawak ang utos ay naipasa bilang input sa higit pa utos

Ipapakita lamang nito ang mga direktoryo sa / atbp :

$ls -ang /atbp|mahigpit na pagkakahawak‘^ D’|higit pa

Ang mga sumusunod na utos ay mga halimbawa ng paggamit ng mga filter:

$ps -ef|mahigpit na pagkakahawakcron

$sino|mahigpit na pagkakahawakkdm

Sample na File

Upang subukan ang ehersisyo ng pagsusuri, lumikha muna ng sumusunod na sample na file.

Gumamit ng isang editor tulad ng nano o vim upang kopyahin ang teksto sa ibaba sa isang file na tinawag mga tao:

Personal na J.Smith 25000
Personal na E.Smith 25400
Pagsasanay A.Brown 27500
Pagsasanay C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Personal na F.Jones 25000
pagsasanay * C.Evans 25500
Goodsout W.Pope 30400
Groundfloor T.Smythe 30500
Staff J.Maler 33000

Pagsasanay II

  1. Ipakita ang file mga tao at suriin ang mga nilalaman nito.
  2. Hanapin ang lahat ng mga linya na naglalaman ng string Smith sa mga file na tao. Pahiwatig: gamitin ang utos grep ngunit tandaan na bilang default, ito ay sensitibo sa kaso.
  3. Lumikha ng isang bagong file, ang mga taong bayan, na naglalaman ng lahat ng mga linya na nagsisimula sa string Pansarili sa file ng mga tao. Pahiwatig: gamitin ang utos grep sa>.
  4. Kumpirmahin ang mga nilalaman ng file na bayan sa pamamagitan ng paglista ng file.
  5. Ngayon idagdag ang lahat ng mga linya kung saan nagtatapos ang teksto sa string 500 sa mga file na tao sa file na nabanggit. Pahiwatig: gamitin ang command grep na may >>.
  6. Muli, kumpirmahing ang nilalaman ng file na bayan sa pamamagitan ng paglista ng file.
  7. Hanapin ang IP Address ng server na nakaimbak sa file / etc / host .Pahiwatig: gamitin ang command grep na may $ (hostname)
  8. Gamitin egrep upang makuha mula sa / atbp / passwd naglalaman ng mga linya ng file account lp o iyong sarili id ng gumagamit .

Ang mga solusyon sa ehersisyo ay matatagpuan sa pagtatapos ng artikulong ito.

Mas Regular na Mga Ekspresyon

Ang isang regular na expression ay maaaring isipin bilang mga wildcard sa mga steroid.

Mayroong labing-isang mga character na may mga espesyal na kahulugan: ang pagbubukas at pagsasara ng mga square bracket [], ang backslash , ang caret ^, ang dolyar na sign $, ang panahon o tuldok., Ang patayong bar o tubo na simbolo |, ang tandang pananong?, Ang asterisk o star *, ang plus sign + at ang pagbubukas at pagsasara ng bilog na bracket {}. Ang mga espesyal na tauhang ito ay madalas ding tinatawag na metachar character.

Narito ang buong hanay ng mga espesyal na character:

^ Simula ng isang linya
$ Pagtatapos ng isang linya
. Anumang character (maliban sa n newline)
* 0 o higit pa sa nakaraang pagpapahayag
| Kahalili, alinman sa isa o iba pa
[…] Malinaw na hanay ng mga character upang tumugma
+ 1 o higit pa sa nakaraang pagpapahayag
? 0 o 1 ng nakaraang pagpapahayag
Ang nauna sa isang simbolo ay ginagawang isang literal na character
{…} Maliwanag na notipikasyon ng dami
(…) Lohikal na pagpapangkat ng bahagi ng isang expression

Ang default na bersyon ng mahigpit na pagkakahawak limitado lamang ang regular na suporta sa pagpapahayag. Upang gumana ang lahat ng mga sumusunod na halimbawa, gamitin egrep sa halip o grep -E .

Upang makahanap ng mga linya gamit ang | upang itugma ang alinman sa expression:

$egrep‘Xxz|xzz ’myfile

Upang makahanap ng mga linya gamit ang | upang itugma ang alinman sa expression sa loob ng isang string na gumagamit din ng ():

$egrep‘^ X(Yz|yz)’Myfile

Upang makahanap ng mga linya gamit ang [] upang tumugma sa anumang character:

$egrep‘^ X[Yy]z ’myfile

Upang makahanap ng mga linya gamit ang [] upang HINDI tumutugma sa anumang character:

$egrep‘^ X[^ Yy]z ’myfile

Upang makahanap ng mga linya gamit ang * upang tumugma sa 0 o higit pa sa nakaraang pagpapahayag:

$egrep‘^ Xy*z ’myfile

Upang makahanap ng mga linya gamit ang + upang tumugma sa 1 o higit pa sa nakaraang pagpapahayag:

$egrep‘^ Xy + z’ myfile

Upang makahanap ng mga linya gamit ang? upang tumugma sa 0 o 1 ng nakaraang expression:

$egrep‘^ Xy? Z’ myfile

Pagsasanay III

  1. Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Evans o pintor sa mga file na tao.
  2. Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Smith, Smyth o Smythe sa mga file na tao.
  3. Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Kayumanggi, Browen o Pinagmulan sa mga file na tao. Kung mayroon kang oras:
  4. Hanapin ang linya na naglalaman ng string (admin), kabilang ang mga braket, sa mga file na tao.
  5. Hanapin ang linya na naglalaman ng character * sa mga file na tao.
  6. Pagsamahin ang 5 at 6 sa itaas upang makahanap ng parehong mga expression.

Marami pang Mga Halimbawa

Upang makahanap ng mga linya gamit . at * upang tumugma sa anumang hanay ng mga character:

$egrep‘^ Xy.*z ’myfile

Upang makahanap ng mga linya gamit ang {} upang tumugma sa bilang ng mga character:

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

Upang makahanap ng mga linya gamit ang {} upang tumugma sa N o higit pang mga beses:

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

Upang makahanap ng mga linya gamit ang {} upang tumugma sa mga N na oras ngunit hindi hihigit sa M beses:

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

Konklusyon

Sa tutorial na ito una naming tiningnan ang paggamit mahigpit na pagkakahawak sa simpleng form na ito upang maghanap ng teksto sa isang file o sa maraming mga file. Pinagsama namin ang teksto na hahanapin sa simpleng mga regular na expression at pagkatapos ay ang mga mas kumplikadong gamit egrep .

Mga Susunod na Hakbang

Inaasahan kong mailalapat mo rito ang kaalamang nakuha. Subukan mo mahigpit na pagkakahawak utos sa iyong sariling data at tandaan, ang mga regular na expression tulad ng inilarawan dito ay maaaring magamit sa parehong form sa kami naman , sed at ang awkward !

Mga Solusyon sa Ehersisyo

Ehersisyo ko

Bilangin muna kung gaano karaming mga linya ang nasa file / atbp / passwd .
$ wc -l /etc/passwd
Hanapin ngayon ang lahat ng mga paglitaw ng teksto kung saan sa file / etc / passwd.
$ grep var /etc/passwd
Hanapin kung gaano karaming mga linya sa file ang naglalaman ng teksto kung saan

mahigpit na pagkakahawak -ckung saan/atbp/passwd

Hanapin kung gaano karaming mga linya ang HINDI naglalaman ng teksto kung saan .

mahigpit na pagkakahawak -cvkung saan/atbp/passwd

Hanapin ang entry para sa iyong pag-login sa / atbp / passwd file
grep kdm /etc/passwd

Pagsasanay II

Ipakita ang file mga tao at suriin ang mga nilalaman nito.
$ cat people
Hanapin ang lahat ng mga linya na naglalaman ng string Smith sa file mga tao .
$ grep 'Smith' people
Lumikha ng isang bagong file, baryo , na naglalaman ng lahat ng mga linya na nagsisimula sa string Pansarili nasa mga tao file
$ grep '^Personal' people> npeople
Kumpirmahin ang mga nilalaman ng file baryo sa pamamagitan ng paglista ng file.
$ cat npeople
Ngayon idagdag ang lahat ng mga linya kung saan nagtatapos ang teksto sa string 500 sa file mga tao sa file baryo .
$ grep '500$' people>>npeople
Muli, kumpirmahin ang mga nilalaman ng file baryo sa pamamagitan ng paglista ng file.
$ cat npeople
Hanapin ang IP Address ng server na nakaimbak sa file / etc / host .
$ grep $(hostname) /etc/hosts
Gamitin egrep upang makuha mula sa / atbp / passwd naglalaman ng mga linya ng file account lp o ang iyong sariling user id.
$ egrep '(lp|kdm:)' /etc/passwd

Pagsasanay III

Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Evans o pintor sa file mga tao .
$ egrep 'Evans|Maler' people
Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Smith , Smyth o Smythe sa file mga tao .
$ egrep 'Sm(i|y)the?' people
Hanapin ang lahat ng mga linya na naglalaman ng mga pangalan Kayumanggi , Browen o Pinagmulan sa mga file na tao.
$ egrep 'Brow?e?n' people
Hanapin ang linya na naglalaman ng string (admin), kasama ang mga braket, sa file mga tao .

$egrep ' (Admin )'mga tao

Hanapin ang linya na naglalaman ng character * sa mga file na tao.
$ egrep '*' people
Pagsamahin ang 5 at 6 sa itaas upang makahanap ng parehong mga expression.

$egrep ' (Admin ) | *'mga tao