Բացատրություն. Ի՞նչ է Grep Command-ը Linux-ում:


Grep-ը, թերեւս, Linux-ում ամենաշատ օգտագործվող հրամաններից մեկն է: Իմացեք, թե ինչու է այն ստեղծվել և ինչպես է այն օգտագործվում այս բացատրական հոդվածում:

Եթե դուք օգտագործում եք Linux կանոնավոր աշխատանքի կամ ծրագրակազմ մշակելու և տեղադրելու համար, դուք պետք է հանդիպած լինեք grep հրամանին:

Այս բացատրական հոդվածում ես ձեզ կասեմ, թե ինչ է grep հրամանը և ինչպես է այն աշխատում:

Ի՞նչ է grep-ը:

Grep-ը հրամանի տող է Unix և Linux համակարգերում: Այն օգտագործվում է տվյալ ֆայլի բովանդակության մեջ որոնման նախշեր գտնելու համար:

Իր անսովոր անունով, դուք կարող եք կռահել, որ grep-ը հապավում է: Սա գոնե մասամբ ճիշտ է, բայց կախված է նրանից, թե ում եք հարցնում:

Հեղինակավոր աղբյուրների համաձայն, անունը իրականում ստացվել է UNIX տեքստային խմբագրիչի հրամանից, որը կոչվում է ed. Որում մուտքագրված g/re/p կատարեց գլոբալ (g) որոնում կանոնավոր արտահայտության համար (re), և այնուհետև տպեց (p) ցանկացած համապատասխան տող:

grep հրամանն անում է այն, ինչ g/re/p հրամաններն արեցին խմբագրում: Այն կատարում է գլոբալ հետազոտություն կանոնավոր արտահայտության համար և տպում այն: Այն շատ ավելի արագ է մեծ ֆայլեր որոնելիս:

Սա պաշտոնական պատմությունն է, բայց դուք կարող եք նաև տեսնել այն նկարագրված որպես Global Regular Expression (P rocessor | Parser | Printer): Ճիշտն ասած, դա անում է այդ ամենը:

Հետաքրքիր պատմությունը grep-ի ստեղծման հետևում

Քեն Թոմփսոնը մի քանի անհավանական ներդրում է ունեցել համակարգչային գիտության մեջ: Նա օգնեց ստեղծել Unix-ը, հանրահռչակեց նրա մոդուլային մոտեցումը և գրեց շատ ծրագրեր, ներառյալ grep-ը:

Թոմփսոնը ստեղծել է grep՝ օգնելու Bell Labs-ի իր գործընկերներից մեկին: Այս գիտնականի նպատակն էր ուսումնասիրել լեզվական օրինաչափությունները՝ բացահայտելու Ֆեդերալիստական փաստաթղթերի հեղինակներին (այդ թվում՝ Ալեքսանդր Համիլթոնին): Աշխատանքների այս ծավալուն հավաքածուն 85 անանուն հոդվածների և էսսեների ժողովածու էր, որոնք մշակվել են ի պաշտպանություն Միացյալ Նահանգների Սահմանադրության: Բայց քանի որ այս հոդվածները անանուն էին, գիտնականը փորձում էր բացահայտել հեղինակներին՝ հիմնվելով լեզվական օրինաչափության վրա:

Բնօրինակ Unix տեքստային խմբագրիչը, ed, (նաև ստեղծվել է Թոմփսոնի կողմից) ի վիճակի չէր որոնել տեքստի այդքան մեծ ծավալ՝ հաշվի առնելով այն ժամանակվա ապարատային սահմանափակումները: Այսպիսով, Թոմփսոնը որոնման գործառույթը վերածեց ինքնուրույն գործիքի, անկախ խմբագրիչից:

Եթե մտածեք դրա մասին, դա նշանակում է, որ Ալեքսանդր Համիլթոնը տեխնիկապես օգնեց ստեղծել grep: Ազատորեն կիսվեք այս զվարճալի փաստով ձեր ընկերների հետ ձեր Hamilton ժամացույցի երեկույթի ժամանակ: 🤓

Նորից ի՞նչ է կանոնավոր արտահայտությունը:

Կանոնավոր արտահայտությունը (կամ regex) կարելի է դիտարկել որպես որոնման հարցում: Կանոնավոր արտահայտություններն օգտագործվում են տեքստը նույնականացնելու, համապատասխանեցնելու կամ այլ կերպ կառավարելու համար:

Regex-ն ի վիճակի է շատ ավելին, քան հիմնաբառերի որոնումները, սակայն: Այն կարող է օգտագործվել ցանկացած երևակայելի օրինակ գտնելու համար: Նախշերը կարելի է ավելի հեշտ գտնել՝ օգտագործելով մետա-նիշերը: Այս հատուկ նիշերը, որոնք այս որոնման գործիքը շատ ավելի հզոր են դարձնում:

Պետք է նշել, որ grep-ն ընդամենը մեկ գործիք է, որն օգտագործում է regex: Նմանատիպ հնարավորություններ կան գործիքների շարքում, սակայն մետա նիշերը և շարահյուսությունը կարող են տարբեր լինել: Սա նշանակում է, որ կարևոր է իմանալ ձեր կոնկրետ regex պրոցեսորի կանոնները:

Գրեպի գործնական օրինակ. Համապատասխան հեռախոսահամարներ

Այս գործիքը կարող է վախեցնել ինչպես նորեկներին, այնպես էլ փորձառու Linux օգտագործողներին: Ցավոք, նույնիսկ համեմատաբար պարզ օրինակը, ինչպիսին է հեռախոսահամարը, կարող է հանգեցնել «վախկոտ» տեսքի ռեգեքսի տողի:

Ես ուզում եմ ձեզ հանգստացնել, որ նման արտահայտություններ տեսնելիս խուճապի մատնվելու կարիք չկա. Երբ դուք ծանոթանաք ռեգեքսի հիմունքներին, այն կարող է բացել ձեր հաշվողական հնարավորությունների նոր աշխարհ:

Մշակութային նշում. այս օրինակը օգտագործում է ԱՄՆ (NANP) կոնվենցիաները հեռախոսահամարների համար: Սրանք 10 նիշանոց ID-ներ են, որոնք բաժանված են տարածքային ծածկագրի (3 նիշ) և եզակի 7 նիշանոց համակցություն, որտեղ առաջին 3 նիշերը համապատասխանում են կենտրոնական հեռահաղորդակցության գրասենյակին (հայտնի է որպես նախածանց), իսկ վերջին 4-ը կոչվում է գիծ: թիվ. Այսպիսով, օրինակը AAA-PPP-LLLL է:

Ես ստեղծել եմ phone.txt անունով ֆայլ և գրի եմ առել նույն հեռախոսահամարի 4 սովորական տարբերակ: Ես պատրաստվում եմ օգտագործել grep-ը՝ անկախ ձևաչափից, թվերի օրինակը ճանաչելու համար:

Ես նաև ավելացրել եմ մեկ տող, որը չի համապատասխանի որպես հսկիչ օգտագործելու արտահայտությունը: Վերջին տողը 555!123!1234 ստանդարտ հեռախոսահամար չէ և չի վերադարձվի grep արտահայտությամբ:

phone.txt ֆայլերի բովանդակությունն է.

christopher@linux-handbook:~$ cat phone.txt 
5551231234
555 123 1234
555-123-1234
(555)-123-1234
555!123!1234

Հեռախոսահամարները «գրելու» համար ես պատրաստվում եմ գրել իմ ռեգեքսը՝ օգտագործելով մետա-նիշերը՝ համապատասխան տվյալները մեկուսացնելու և անտեսելու այն, ինչ ինձ պետք չէ:

Ամբողջական հրամանը կունենա հետևյալ տեսքը.

christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Մի փոքր ինտենսիվ տեսք ունի, չէ՞: Եկեք այն բաժանենք մասերի, որպեսզի ավելի լավ պատկերացնենք, թե ինչ է կատարվում:

Հասկանալով ռեգեքսը, մեկ հատվածը

Նախ, եկեք առանձնացնենք RegEx-ի այն բաժինը, որը փնտրում է հեռախոսահամարի «տարածքի կոդը»:

Նմանատիպ օրինակը մասամբ կրկնվում է մնացած թվանշանները նույնպես ստանալու համար: Կարևոր է նշել, որ տարածքի կոդը երբեմն փակագծերում է, այնպես որ դուք պետք է հաշվի առնեք դա այստեղ արտահայտությամբ:

Տարածքային ծածկագրի ամբողջ հատվածի տրամաբանությունը պարփակված է կլոր ամրագոտիների մի շարքի մեջ: Դուք կարող եք տեսնել, որ իմ կոդը սկսվում է \(-ով և ավարտվում \)-ով:

Երբ օգտագործում եք [0-9] քառակուսի փակագծերը, դուք grep-ին հայտնում եք, որ փնտրում եք 0-ից 9-ի միջև ընկած թիվ: Նմանապես, կարող եք օգտագործել [a-z] այբուբենի տառերին համապատասխանելու համար:

Գանգուր փակագծերի թիվը {3\} նշանակում է, որ քառակուսի փակագծերի տարրը համընկնում է ուղիղ երեք անգամ:

Դեռ շփոթված. Մի սթրեսի ենթարկվեք: Դուք պատրաստվում եք այս օրինակին նայել մի քանի առումներով, որպեսզի վստահ զգաք առաջ գնալու համար:

Փորձենք դիտարկել տարածքային ծածկագրի բաժնի տրամաբանությունը կեղծ կոդով: Ես առանձնացրել եմ արտահայտության յուրաքանչյուր հատված:

Տարածքային օրենսգրքի RegEx կեղծ կոդը

  • \(

  • (3 նիշանոց համար)

  • |

  • 3-նիշ թիվ

  • \)

Հուսանք, որ այսպես տեսնելը ռեգեքսն ավելի պարզ է դարձնում: Պարզ լեզվով դուք փնտրում եք եռանիշ թվեր: Յուրաքանչյուր թվանշան կարող է լինել 0-9, և տարածքային կոդի շուրջ կարող է կամ փակագծեր չլինեն:

Այնուհետև, մեր առաջին բաժնի վերջում կա այս տարօրինակ բանը:

  • [-]\?

Ինչ է դա նշանակում? \? նշանը նշանակում է «համընկնել զրոյին կամ նախորդ նիշերից մեկին»: Այստեղ դա վերաբերում է մեր քառակուսի փակագծերում [ -]-ին:

Այսինքն՝ թվանշաններին հաջորդող գծիկ կարող է լինել կամ չլինել։

Տարածքի կոդ

Այժմ, եկեք վերակառուցենք նույն բլոկը իրական կոդով: Այնուհետև կավելացնեմ արտահայտության մյուս մասերը։

  • \(

  • ([0-9]\{3\})

  • |

  • [0-9]\{3\}

  • \)

  • [-]\?

Նախածանց

Հեռախոսահամարի ձևանմուշը լրացնելու համար կարող եք պարզապես նորից օգտագործել ձեր գոյություն ունեցող կոդից մի քանիսը:

[0-9]\{3\}[ -]\?

Դուք չպետք է մտահոգվեք նախածանցը շրջապատող փակագծերով, բայց դուք դեռ կարող եք ունենալ կամ չունենալ - նախածանցի և հեռախոսահամարի տողի թվանշանների միջև:

Տողերի համարներ

Հեռախոսահամարի վերջին բաժինը մեզանից չի պահանջում որևէ այլ նիշ փնտրել, բայց դուք պետք է թարմացնեք արտահայտությունը՝ լրացուցիչ թվանշանն արտացոլելու համար:

[0-9]\{4\}

վերջ։ Հիմա եկեք համոզվենք, որ արտահայտությունը պարունակվում է չակերտներում՝ նվազագույնի հասցնելու անսպասելի վարքագիծը:

Ահա նորից ամբողջական արտահայտությունը

christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Դուք կարող եք տեսնել, որ արդյունքները ընդգծված են գունավոր: Սա կարող է լինել ձեր Linux բաշխման լռելյայն վարքագիծը:

Բոնուսային հուշում

Եթե ցանկանում եք, որ ձեր արդյունքները ընդգծվեն, կարող եք ձեր հրամանին ավելացնել --color=auto: Դուք կարող եք նաև սա ավելացնել ձեր shell պրոֆիլին որպես այլանուն, որպեսզի ամեն անգամ, երբ մուտքագրեք grep, այն գործարկվի որպես grep --color=auto:

Հուսով եմ, որ դուք հիմա ավելի լավ եք հասկանում grep հրամանը: Ես ցույց տվեցի ընդամենը մեկ օրինակ՝ իրերը բացատրելու համար։ Եթե հետաքրքրված եք, կարող եք ստուգել այս հոդվածը grep հրամանի ավելի գործնական օրինակների համար:

Տվեք ձեր առաջարկությունը հոդվածի վերաբերյալ՝ թողնելով մեկնաբանություն: