Grep Regex Ամբողջական ուղեցույց
Ներածություն
Երբ խոսքը վերաբերում է տվյալների մշակմանը և վերլուծությանը, Grep Regex-ը հզոր գործիք է տեքստում օրինաչափություններ գտնելու համար: Այն սովորաբար օգտագործվում է մշակողների, համակարգի ադմինիստրատորների և տվյալների վերլուծաբանների շրջանում, ովքեր պետք է որոնեն որոշակի տողեր կամ հանեն համապատասխան տեղեկատվություն մեծ ծավալի տվյալներից:
Grep-ը նշանակում է «Global Regular Expression Print» և վերաբերում է հրամանի տող ծրագրին, որը փնտրում է նախշեր ֆայլերում կամ ելքային հոսքերում: Կանոնավոր արտահայտությունները (Regex) նիշերի հաջորդականություն են, որոնք սահմանում են օրինաչափություն, որը կարող է օգտագործվել տեքստի որոնման կամ մանիպուլյացիայի համար:
Ինչպես սկսել Grep Regex-ով
Grep-ի տեղադրում տարբեր հարթակներում
Նախքան Grep Regex-ի աշխարհը սուզվելը, կարևոր է նախ տեղադրել Grep-ը ձեր մեքենայի վրա: Տեղադրման գործընթացը կարող է տարբեր լինել՝ կախված ձեր օգտագործած հարթակից:
Unix-ի և Linux-ի օգտատերերի համար Grep-ը սովորաբար արդեն տեղադրված է: Այնուամենայնիվ, Windows-ի օգտատերերի համար դուք պետք է ներբեռնեք և տեղադրեք Grep-ի համապատասխան տարբերակը ձեր օպերացիոն համակարգի համար:
Mac օգտատերերի համար այն կարող եք տեղադրել Homebrew-ի միջոցով կամ փաթեթը ներբեռնելով նրա պաշտոնական կայքից: Երբ դուք հաջողությամբ տեղադրեք Grep-ը ձեր համակարգչում, պատրաստ եք սկսել այն օգտագործել:
Հիմնական շարահյուսություն և հրամաններ
Grep-ը հրամանի տող գործիք է, որը թույլ է տալիս տեքստային ֆայլերում նախշեր որոնել: Դրա հիմնական շարահյուսությունը − է
grep [options] pattern [file...]
Այստեղ «pattern»-ը ներկայացնում է սովորական արտահայտությունների օրինաչափությունը, որը դուք ցանկանում եք որոնել «[file...]»-ում նշված մեկ կամ մի քանի ֆայլերում: Հարկ է նշել, որ եթե որևէ ֆայլ նշված չէ, ապա մուտքագրումը կվերցվի «stdin»-ից:
Կան մի քանի տարբերակներ, որոնք հասանելի են grep-ի հետ, որոնք կարող են փոփոխել նրա վարքագիծը՝ հիմնվելով ձեր կոնկրետ կարիքների վրա: Օրինակ,
* `-i`-ը նշում է մեծատառերի անզգույշ որոնում:
* «-r»-ը ռեկուրսիվ կերպով որոնում է բոլոր ֆայլերը գրացուցակի մեջ:
* «-l»-ը տպում է միայն օրինաչափությանը համապատասխանող ֆայլերի անունները:
* «-n»-ը տպում է տողերի համարները՝ գտնված համընկնումների հետ միասին:
Հասկանալով կանոնավոր արտահայտություններ
Կանոնավոր արտահայտությունները (Regex) կազմում են grep-ի էական մասը, քանի որ դրանք նշում են տեքստային ֆայլերում փնտրվող օրինաչափությունները: Կան ռեգեքսի օրինաչափությունների մի քանի տարրեր, որոնք կարող են ներառել −
* Մետանիշեր – նիշեր, որոնք հատուկ նշանակություն ունեն ռեգեքս շարահյուսության մեջ (օրինակ՝ '^', '<span>$'):
* Նիշերի դասեր - քառակուսի փակագծերում փակցված նիշերի հավաքածուներ (օրինակ՝ [a-z]), որոնք օգտագործվում են որոշակի նիշերի տեսակների կամ տիրույթների համապատասխանության համար:
-
* Քանակականիչներ – նշեք, թե քանի անգամ պետք է տեղի ունենա որոշակի օրինաչափություն (օրինակ՝ «*», «+», «?»):
* Խմբավորում և գրավում – թույլ է տալիս խմբավորել նախշերը միասին, ինչպես նաև դրանք գրավել հետագա օգտագործման համար:
* Lookarounds – օգտագործվում է տեքստում առաջ կամ հետևից նայելու համար՝ իրականում չներառելով այն համընկնման մեջ:
Այս տարրերը հասկանալը կարևոր է grep regex-ի հետ աշխատելիս, քանի որ դրանք կարող են օգնել ձեզ ստեղծել ավելի հզոր և ճշգրիտ որոնման օրինաչափություններ:
Կանոնավոր արտահայտություններ խորությամբ
Նիշերի դասեր և տիրույթներ. Regex-ի շինարարական բլոկները
Կանոնավոր արտահայտություններում նիշերի դասերը օգտագործվում են նիշերի շարքին համապատասխանելու համար: Նիշերի դասերը փակցված են քառակուսի փակագծերում- [ ] և կարող են ներառել մեկ նիշ կամ նիշերի շարք: Օրինակ, [aeiou] կանոնավոր արտահայտությունը կհամապատասխանի տեքստի ցանկացած ձայնավորին, մինչդեռ [a-z]-ը կհամապատասխանի ցանկացած փոքրատառի:
Բացի այդ, նիշերի դասերը կարող են ժխտվել՝ դրա առաջ ավելացնելով կարետ (^): Օրինակ, [^0-9]-ը համապատասխանում է ամեն ինչին, բացառությամբ թվանշանների:
Օրինակներ
Համապատասխանեցրեք ցանկացած թվանշան −
grep "[0-9]" file.txt
Համապատասխանեցրեք ցանկացած փոքրատառ −
grep "[a-z]" file.txt
Համապատասխանեցրեք ցանկացած մեծատառ −
grep "[A-Z]" file.txt
Համապատասխանեցրեք ցանկացած տառ (փոքր կամ մեծատառ) −
grep "[a-zA-Z]" file.txt
Համապատասխանեցրեք ցանկացած այբբենական թվային նիշ −
grep "[a-zA-Z0-9]" file.txt
Քանակականիչներ և այլընտրանքներ. Regex-ը դարձնել ավելի ճկուն
Քանակիչները նշում են, թե քանի անգամ պետք է հայտնվի նախորդ նիշը տեքստում: Օրինակ, «a{2,3}» նշանակում է, որ տեքստում պետք է լինի 2-ից 3 հարակից «a» նիշ:
Այլընտրանքը ևս մեկ կարևոր հասկացություն է, որը թույլ է տալիս նշել ուղղահայաց գծով (|) բաժանված բազմաթիվ նախշեր: Այս կերպ դուք կարող եք համապատասխանեցնել դրանցից որևէ մեկին:
Օրինակներ
Համապատասխանեցրեք «a» տառի մեկ կամ մի քանի դեպքեր
grep 'a+' file.txt
Համապատասխանեցրեք «խնձոր» բառի զրոյական կամ ավելի դեպքերը −
grep 'apple*' file.txt
Համապատասխանեցրե՛ք «0» թվանշանի երեք դեպք
grep '0{3}' file.txt
Համեմատեք կամ «կատու» կամ «շուն» -
grep 'cat|dog' file.txt
Համեմատեք կամ «խնձոր», «բանան» կամ «նարնջագույն» −
grep 'apple|banana|orange' file.txt
Խմբավորում և գրավում. բարդ համընկնումների համար ենթաօրինաչափությունների ստեղծում
Խմբավորումը վերաբերում է ձեր օրինակի մասերը «()» փակագծերով փակելուն: Խմբավորումը կարևոր է, երբ դուք ցանկանում եք չափորոշիչներ կամ փոփոխականներ կիրառել ձեր օրինակի որոշակի մասերի վրա: Ավելին, այն օգնում է նաև ընթերցանության և կազմակերպման հարցում:
Capturing-ը վերաբերում է ձեր համապատասխան տողի որոշակի մաս(ներ)ի դուրսբերմանը` օգտագործելով փակագծեր, որոնք նշում են հավաքող խմբերը: Հետագայում գրավված խմբերին մուտք գործելու համար կամ դրանք ուղղորդելու հենց օրինաչափության մեջ. մենք օգտագործում ենք հետադարձ հղումներ:
Օրինակներ
Կրկնվող նիշերի համապատասխանեցում.
$ echo "Helloooo" | grep -oE '(o+)\1'
Արդյունք
oooo
Էլփոստի հասցեների արդյունահանում −
$ echo "Contact us at email@example.com or support@example.com" | grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
Արդյունք
email@example.com
support@example.com
Հեռախոսահամարների արդյունահանում −
$ echo "Contact us at +1-555-123-4567 or 123-456-7890" | grep -oE '(\+?[0-9]+-)?[0-9]{3}-[0-9]{3}-[0-9]{4}'
Արդյունք
+1-555-123-4567
123-456-7890
HTML պիտակների համապատասխանեցում և բովանդակության գրավում −
$ echo "<h1>Title</h1><p>Paragraph</p>" | grep -oE '<(\w+)>.*<\/\1>'
Արդյունք
<h1>Title</h1>
<p>Paragraph</p>
Ամսաթվերի արդյունահանում հատուկ ձևաչափով −
$ echo "Today's date is 2023-06-15" | grep -oE '([0-9]{4})-([0-9]{2})-([0-9]{2})'
Արդյունք
2023-06-15
Lookarounds. Տեքստի համատեքստում համապատասխանեցնելու առաջադեմ տեխնիկա
Lookarounds-ը առաջադեմ տեխնիկա է, որը թույլ է տալիս ռեգեքս շարժիչին նայել առաջ կամ հետևից որոշակի դիրքերում՝ առանց այդ դիրքերը համապատասխանելու: Գոյություն ունեն երկու տեսակի հայացքներ
Positive Lookahead - համապատասխանում է նախորդ օրինակին միայն այն դեպքում, եթե դրան հաջորդում է կոնկրետ տեքստ:
Բացասական հայացք - համընկնում է նախորդ օրինակին միայն այն դեպքում, եթե այն չի հետևում կոնկրետ տեքստին: Lookarounds-ը կարող է օգտագործվել այն իրավիճակներում, երբ դուք պետք է համապատասխանեցնեք տողը, բայց միայն այն դեպքում, եթե այն բավարարում է որոշ պայմանների (օրինակ՝ տեղի է ունենում որոշակի բառից հետո կամ դրանից առաջ):
Ընդլայնված տեխնիկա Grep Regex-ի հետ
Դրոշների օգտագործումը վարքագիծը փոփոխելու համար
Դրոշները օգտագործվում են Grep Regex-ում կանոնավոր արտահայտությունների վարքը փոփոխելու համար: Օրինակ, դուք կարող եք օգտագործել այնպիսի դրոշներ, ինչպիսիք են -i-ն՝ մեծատառերի անզգույշ որոնում կամ -w միայն բառերի որոնման համար:
Բացի այդ, դուք կարող եք օգտագործել այնպիսի դրոշներ, ինչպիսիք են -v-ը, որոնումը շրջելու և ցուցադրելու միայն գծերը, որոնք չեն համապատասխանում օրինաչափությանը: Դուք կարող եք համատեղել բազմաթիվ դրոշներ միասին և հարմարեցնել ձեր որոնումը ձեր պահանջներին համապատասխան:
Օրինակներ
-i կամ --ignore-case. Համապատասխանելիս անտեսում է դեպքերի տարբերությունները: Օրինակ −
grep -i "apple" file.txt
-v կամ --invert-match. շրջում է համընկնում, այսինքն՝ տպում է միայն այն տողերը, որոնք չեն համապատասխանում օրինաչափությանը: Օրինակ −
grep -v "apple" file.txt
-w կամ --word-regexp. Համընկնում է միայն ամբողջական բառերի հետ: Օրինակ −
grep -w "apple" file.txt
-x կամ --line-regexp. Համապատասխանում է միայն ամբողջ տողերին: Օրինակ −
grep -x "apple" file.txt
-m N կամ --max-count=N: Դադարում է N համընկնում գտնելուց հետո: Օրինակ՝ գտնել օրինաչափության առաջին 5 դեպքերը
grep -m 5 "apple" file.txt
-r կամ --recursive. որոնում է ռեկուրսիվ դիրեկտորիաների միջոցով: Օրինակ −
grep -r "apple" /path/to/directory
Մի քանի նախշերի համադրում
Դուք կարող եք միավորել բազմաթիվ օրինաչափություններ մեկ Grep հրամանի մեջ՝ օգտագործելով տրամաբանական օպերատորներ, ինչպիսիք են | (OR) և & (AND): Սա թույլ է տալիս կատարել ավելի բարդ որոնումներ, որտեղ ցանկանում եք համապատասխանեցնել տողերը, որոնք պարունակում են երկու նախշեր կամ երկու նախշեր միաժամանակ: Բացի այդ, դուք կարող եք փակագծերով խմբավորել ձեր օրինաչափության տարբեր մասերը և ստեղծել ենթաօրինաչափություններ, որոնք համակցված են միասին:
Օրինակներ
Որոնել տողեր, որոնք պարունակում են «խնձոր», բայց ոչ «բանան» −
grep -E 'apple' filename.txt | grep -v 'banana'
«խնձոր» կամ «բանան» պարունակող տողերի որոնում, բայց ոչ «նարնջագույն» −
grep -E 'apple|banana' filename.txt | grep -v 'orange'
Տվյալների արդյունահանում Capture Groups-ով
Նկարահանման խմբերը թույլ են տալիս հատուկ տվյալներ հանել համապատասխան օրինաչափությունից՝ այն փակելով փակագծերում: Օրինակ, եթե ցանկանում եք ֆայլից հանել բոլոր էլփոստի հասցեները, կարող եք օգտագործել հավաքագրման խումբ էլփոստի հասցեի ձևանմուշի շուրջ և այնուհետև տպել միայն այդ գրավված խմբերը: Այս տեխնիկան օգտակար է տվյալների մեծ հավաքածուների հետ գործ ունենալիս, որտեղ անհրաժեշտ է հատուկ տեղեկատվության արդյունահանումը:
Օրինակներ
Էլփոստի հասցեների դուրսբերում ֆայլից −
grep -Eo '([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+)\.([A-Za-z]{2,})' file.txt
Հեռախոսահամարների արդյունահանում հատուկ ձևաչափով −
grep -Eo '(\+\d{1,2})?(\d{3}-\d{3}-\d{4})' file.txt
URL-ների արդյունահանում վեբ էջից −
grep -Eo 'href="([^"]+)"' file.html
IP հասցեների արդյունահանում մատյան ֆայլից -
grep -Eo '(\d{1,3}\.){3}\d{1,3}' file.log
Եզրակացություն
Grep Regex-ը հզոր գործիք է, որը տվյալների վերլուծաբաններին հնարավորություն է տալիս արագ որոնել, զտել և տվյալների հանել մեծ տվյալների հավաքածուներից: Սովորական արտահայտություններին տիրապետելով՝ դուք կարող եք հեշտությամբ զտել հազարավոր կամ նույնիսկ միլիոնավոր գրառումները վայրկյանների ընթացքում՝ խնայելով ձեզ արժեքավոր ժամանակ և ջանք: Օպերատորների և նիշերի ճիշտ համադրությամբ բարդ նախշեր գրելու ունակությունը կարող է զգալիորեն բարելավել ձեր արտադրողականությունը՝ թույլ տալով կենտրոնանալ ավելի կարևոր խնդիրների վրա: