Enkonduko
La Linukso grep-komando estas uzata kiel metodo por filtrila enigo.
GREP staras pri Tutmonda Regula Esprimo Presilo kaj sekve por uzi ĝin efike, vi devus havi iun scion pri regulaj esprimoj.
En ĉi tiu artikolo mi montros al vi kelkajn ekzemplojn, kiuj helpos vin kompreni la grep-komandon.
01 de 09
Kiel Serĉi Ŝnuron En Arkivo Uzanta GREP
Imagu, ke vi havas tekston-dosieron nomitan librojn kun la jenaj libroj de la infanoj:
- Robin Hood
- Ruĝkufulineto
- Peter Pano
- Goldilocks Kaj La Tri Ursoj
- Blanka Neĝo Kaj La Sep Enanos
- Pinnochio
- La Kato En La Ĉapelo
- La Tri Malgrandaj Porkoj
- La Gruffalo
- Charlie And The Chocolate Factory
Por trovi ĉiujn librojn kun la vorto "La" en la titolo, vi uzus la jenan sintakson:
grep La libroj
La jenaj rezultoj estos redonitaj:
- Goldilocks Kaj La Tri Ursoj
- Blanka Neĝo Kaj La Sep Enanos
- La Kato En La Ĉapelo
- La Tri Malgrandaj Porkoj
- La Gruffalo
- Charlie And The Chocolate Factory
En ĉiu kazo, la vorto "La" estos reliefigita.
Rimarku, ke la serĉo estas kazema sentema, do se unu el la titoloj havis "la" anstataŭ "La", tiam ĝi ne estus redonita.
Por ignori la kazon vi povas aldoni la sekvan ŝaltilon:
kolektu la librojn --ignore-case
Vi ankaŭ povas uzi la -i ŝaltilon kiel sekvas:
grep -i la libroj
02 de 09
Serĉu Stringon en dosiero per kartoj
La grep-komando estas tre potenca. Vi povas uzi amason da ŝablonaj kongruaj teknikoj por filtri rezultojn.
En ĉi tiu ekzemplo, mi montros al vi kiel serĉi ĉenon en dosiero per kartoj .
Imagu, ke vi havas dosieron nomitan lokojn kun la jenaj skotaj loknomoj:
aberdeen
aberystwyth
aberlour
inverso
inverso
Newburgh
nova cervo
nova galloway
glasgow
Edimburgo
Se vi volas trovi ĉiujn lokojn per inverso en la nomo, uzu la jenan sintakson:
grep inver * lokoj
La asterisko (*) bildkarto staras por 0 aŭ multaj. Sekve, se vi havas lokon nomatan inverso aŭ loko nomata inverso tiam ambaŭ estus revenitaj.
Alia karton vi povas uzi estas la periodo (.). Vi povas uzi ĉi tion por egali unu literon.
grep inver.r lokoj
La supre komando trovus lokojn nomitan inverŝe kaj inveraj sed ne trovus invadojn ĉar nur povas esti unu sindikato inter la du r kiel signifita de la sola periodo.
La periodkarto estas utila sed ĝi povas kaŭzi problemojn, se vi havas unu el la tekstoj, kiujn vi serĉas.
Ekzemple rigardu ĉi tiun liston de domajnaj nomoj
- linux.about.com
- pcsupport.about.com
- mp3.about.com
- minecraft.about.com
- androidgames.about.com
- netforbeginners.about.com
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
Por trovi ĉiujn informojn, vi nur povas serĉi uzante la jenan sintakson:
grep * pri * domainnames
La supre komando falus se la listo enhavis la sekvan nomon en ĝi:
- everydaylinuxuser.com/about.html
Vi povus do provi la sekvan sintakson:
grep * pri.Com Domainnames
Ĉi tio funkcios bone, se ne estus regado kun la sekva nomo:
priycom.com
Por vere serĉi la terminon pri.Com vi devus eskapi la punkton kiel sekvas:
grep * pri \ .com domainnames
La fina bildkarto por montri al vi estas la demando marko, kiu staras por nulo aŭ unu karaktero.
Ekzemple:
gepatraj nomoj
La supre komando redonus aberdeen, aberystwyth aŭ eĉ berwick.
03an de 09
Serĉu Strings At The Beginning And End Of Line Uzanta grep
La kara (^) kaj la dolaro ($) simbolo permesas al vi serĉi ŝablonojn ĉe la komenco kaj fino de linioj.
Imagu, ke vi havas dosieron nomitan futbalon kun la jenaj teamnomoj:
- Blackpool
- Liverpool
- Manchester City
- Leicester-urbo
- Manchester United
- Newcastle United
- FC Kunigita De Manchester
Se vi volus trovi ĉiujn teamojn, kiuj komencis kun Manchester vi uzus la jenan sintakson:
grep ^ Manchester teamoj
La supre komando redonus Manchester City kaj Manchester United sed ne FC United Of Manchester.
Alternative vi povas trovi ĉiujn teamojn finantajn kun Kunigita uzanta la jenan sintakson:
grep United $ teamoj
La supre komando redonus Manchester United kaj Newcastle United sed ne FC United Of Manchester.
04 de 09
Kalkulanta La Nombro De Matĉoj Uzanta grep
Se vi ne volas redoni la realan linion, kiu kunigas ŝablonon per grep sed vi nur volas scii kiom vi povas uzi la sekvan sintakson:
grep -c ŝablono inputfile
Se la ŝablono estis egalita dufoje tiam la numero 2 estus redonita.
05 de 09
Trovanta ĉiujn la terminojn, kiuj ne kongruas uzante grep
Imagu, ke vi havas liston de loknomoj kun la landoj listigitaj kiel sekvas:
- aberdeen scotland
- glasgow scotlando
- liverpool enlandujo
- golfeto
- Londono
Vi eble rimarkis, ke kolonio-golfeto havas neniun landon asociitan kun ĝi.
Por serĉi ĉiujn lokojn kun lando, vi povus uzi la jenan sintakson:
grep tero $ lokoj
La rezultoj redonas estus ĉiuj lokoj krom golfeto.
Ĉi tio evidente nur funkcias por lokoj, kiuj finiĝas en tero (apenaŭ sciencaj).
Vi povas renversi la elektitan uzadon de la sekva sintakso:
grep -v lando $ lokoj
Ĉi tio trovus ĉiujn lokojn, kiuj ne finiĝis kun tero.
06 de 09
Kiel Trovi Malplenajn Liniojn En Dosieroj Uzanta Grep
Imagu, ke vi havas eniga dosiero, kiu estas uzata de tria aplikaĵo, kiu ĉesas legi la dosieron kiam ĝi trovas malplenan linion kiel sekvas:
- aberdeen scotland
- inversa scotlando
- liverpool enlandujo
- golwyn-golfoj
Kiam la apliko atingas la linion post liverpool, ĝi ĉesos legi la signifon de kolonio-golfeto tute maltrafita.
Vi povas uzi grep por serĉi malplenajn liniojn kun la sekva sintakso:
grep ^ $ lokoj
Bedaŭrinde ĉi tio ne estas speciale utila ĉar ĝi simple redonas la malplenajn liniojn.
Vi povus kompreneble akiri kalkulon de la nombro da malplenaj linioj kiel kontrolo por vidi ĉu la dosiero estas valida kiel sekvas:
grep -c ^ $ lokoj
Tamen estus pli utila scii la liniojn de la linio, kiuj havas malplenan linion por ke vi povu anstataŭigi ilin. Vi povas fari tion per la sekva komando:
grep -n ^ $ lokoj
07 de 09
Kiel Serĉi Ŝnurojn De Kontraŭa Aŭ Malsupra Karakteroj Uzanta grep
Uzante grep vi povas determini kiun linioj en dosiero havas plej grandajn karakterojn uzante la jenan sintakson:
grep '[AZ]' dosiernomo
La kvadrataj krampoj [] permesas determini la gamon de signoj. En la supra ekzemplo ĝi kongruas kun iu karaktero inter A kaj Z.
Sekve, por kongrui minusklajn signojn, vi povas uzi la jenan sintakson:
grep '[az]' dosiernomo
Se vi volas egali nur leterojn kaj ne nombrojn aŭ aliajn simbolojn, vi povas uzi la jenan sintakson:
grep '[a-zA-Z]' dosiernomo
Vi povas fari la saman kun nombroj kiel sekvas:
grep '[0-9]' dosiernomo
08 de 09
Serĉante Ripeti Ŝablonojn Uzante grep
Vi povas uzi buklajn krampojn {} por serĉi ripetantan ŝablonon.
Imagu, ke vi havas dosieron per telefonaj nombroj kiel sekvas:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x 44-1234
Vi scias, ke la unua parto de la nombro devas esti tri ciferoj kaj vi volas trovi la liniojn, kiuj ne kongruas ĉi tiun mastron.
De la antaŭa ekzemplo vi scias, ke [0-9] redonas ĉiujn nombrojn en dosiero.
En ĉi tiu petskribo ni deziras la liniojn, kiuj komenciĝas per tri nombroj sekvitaj per fendo (-). Vi povas fari tion kun la sekva sintakso:
grep "^ [0-9] [0-9] [0-9] -" nombroj
Kiel ni scias de antaŭaj ekzemploj, la karo (^) signifas, ke la linio devas komenci per la sekva ŝablono.
La [0-9] serĉos iun ajn numeron inter 0 kaj 9. Kiel ĉi tio estas inkluzivita tri fojojn ĝi kongruas kun 3 nombroj. Finfine estas fendo por indiki, ke krapo devas sukcesi la tri nombrojn.
Uzante la buklajn krampojn vi povas fari la serĉon pli malgranda kiel sekvas:
grep "^ [0-9] \ {3 \} -" nombroj
La ŝelo eskapas de la krampo por ke ĝi funkciu kiel parto de la regula esprimo sed en esenco, kion ĉi tio diras, estas [0-9] {3} kiu signifas iujn numerojn inter 0 kaj 9 tri fojojn.
La buklaj krampoj povas ankaŭ esti uzataj kiel sekvas:
{5,10}
{5,}
La {5,10} signifas, ke la karaktero serĉata devas esti ripetita almenaŭ 5 fojojn sed ne pli ol 10, sed la {5} signifas, ke la karaktero devas esti ripetita almenaŭ 5 fojojn, sed ĝi povas esti pli ol tio.
09 de 09
Uzado de Eligo de aliaj komandoj Uzante grep
Ĝis nun ni rigardis ŝablonon-kongruon ene de individuaj dosieroj, sed grep povas uzi la eligo de aliaj komandoj kiel la enigo por ŝablonoj.
Granda ekzemplo de tio uzas la pskomandon, kiu listigas aktivajn procezojn.
Ekzemple kuru la sekvantan komandon:
ps -ef
Ĉiuj elkuraj procezoj de via sistemo montriĝos.
Vi povas uzi grep serĉi apartan kuran procezon kiel sekvas:
ps -ef | grep firefox