Linux-da müntəzəm ifadələrdən (regex) istifadə. grep Egrep müntəzəm ifadələrindən istifadənin beş nümunəsi

Adi ifadələr Bash əmr qabıqları istifadəçi və əməliyyat sistemi arasında qarşılıqlı əlaqəyə imkan verən əsas vasitələrdən biri olmaq üçün nəzərdə tutulmuşdur. Qabıq vasitəsilə istifadəçi maşının fayl sistemində mövcud olan faylları və qovluqları manipulyasiya edə, onların məzmununu emal edə və giriş vahidi kimi öz terminalının klaviaturasından və çıxış cihazı kimi terminalın alfasayısal ekranından istifadə edərək digər proqramları icra edə bilər.

Bash müntəzəm ifadələri Bourne qabığının alternativ proqram təminatı kimi GNU Layihəsi üçün Brian Fox tərəfindən hazırlanmışdır. Komanda dili 1989-cu ildə nəşr olundu və Apple (əvvəllər OS X) vasitəsilə Linux və MacOS paylamaları üçün standart giriş qabığı kimi geniş yayıldı. Windows 10 üçün versiya da mövcuddur və Solaris 11-də standart istifadəçi qabığıdır.

Bash təlimat prosessorudur və ənənəvi olaraq tərtibatçının hərəkətlərə səbəb olan əmrləri işlətdiyi mətn terminalında işləyir. Bash müntəzəm ifadələri shell skripti adlanan fayldan oxunur və icra olunur. Unix ilə birlikdə o, fayl adlarını (wildcard müqayisəsi), protokolları, sənədləri, direktivlərin dəyişdirilməsini və sınaq meyarları üçün nəzarət strukturlarını tanıyır. Əsas sözlə desək, dilin sintaksisi və digər əsas xüsusiyyətləri csh və ksh-dən təkrarlanır. Bash POSIX-ə uyğun qabıqdır, lakin bəzi uzantılara malikdir. Qabığın adı qısaldılmışdır

Brian Fox, 10 yanvar 1988-ci ildə Richard Stallman, mövcud skriptləri işlədə bilən pulsuz qabığın hazırlanmasında irəliləyişin olmamasından narazı olduqdan sonra Bash kodlamağa başladı. Fox, 8 iyun 1989-cu ildə Bash-ı beta versiyası olaraq buraxdı və 1992-ci ilin ortalarından 1994-cü ilin ortalarına qədər layihənin əsas tərtibatçısı olaraq qaldı, bundan sonra o, FSF-dən qovuldu və Çet Rami ilə əvəz olundu.

Bu dövrdə Bash ən populyar proqram idi Linux istifadəçiləri, bu əməliyyat sisteminin müxtəlif paylamalarında, eləcə də Apple-ın MacOS-da standart interaktiv qabığa çevrilir. Bash həmçinin Cygwin ilə Microsoft Win-ə, DJGPP layihəsi ilə DOS-a və müxtəlif terminal emulyasiya proqramları ilə Android-ə daxil edilmişdir.

2014-cü ilin sentyabr ayının əvvəlində, 1989-cu ilin avqustunda buraxılmış Bash 1.03 versiyasında Shellshock adlı əhəmiyyətli bir təhlükəsizlik qüsuru aşkar edildi və bu, İnternet üzərindən bir sıra hücumlara səbəb oldu. Səhv ciddi hesab edildi, çünki Bash ixtiyari kodun istismarına icazə vermək üçün istismar edilmişdir. Səhvləri düzəltmək üçün yamaqlar aşkar edilən kimi əlçatan oldu, lakin bütün kompüterlər yenilənmədi.

Shell sintaksis xüsusiyyətləri

Bash, Bourne qabığı əmrlərinin üst dəstidir və digər xüsusiyyətlər arasında mötərizənin genişləndirilməsi, komanda xəttinin tamamlanması, əsas sazlama və tələ istisnalarının idarə edilməsindən istifadə edir. Fərqli şəkildə şərh edilən və ya sistem əmrini işə salmağa cəhd edən skriptlər istisna olmaqla, Bourne qabığı skriptlərinin böyük əksəriyyətini dəyişmədən icra edir. Bash grep müntəzəm ifadələri, eləcə də GNU alətləri proqram xətalarını skan etmək və mövzuların ənənəvi istiqamətlərə getməsinə imkan verən çıxış statusunu təyin etmək üçün qısa yoldan istifadə edir.

Tərtibatçı əmr qabığında tab düyməsini basarsa, Bash avtomatik olaraq yazılmış proqram, fayl və dəyişən adlarına uyğunlaşdırmaq üçün əmr satırının sonlarını tətbiq edir. Komanda xəttinin dayandırılması sistemi sonsuz dərəcədə çevik və idarə edilə biləndir və çox vaxt xüsusi proqramlar və işlər üçün arqumentlər və fayl adlarını saxlayan funksiyalardan ibarətdir. Bash sintaksisində Bourne qabığında olmayan kifayət qədər genişlənmə var.

Bash müntəzəm ifadələri: I/O yönləndirməsini sadələşdirmək üçün ((...)) əmrindən və $ ((...)) sintaksis arqumentindən istifadə edərək arifmetik qiymətləndirmənin tam hesablamalarını həyata keçirin. Məsələn, o &> operatorunun dəstəyi ilə çıxışı (stdout) və uğursuzluğu (stderr) sinxron yönləndirmək qabiliyyətinə malikdir. Həqiqi olanı yazmaq Bourne shell ekvivalentindən daha asandır "command > file 2>&1".

Bash, Linux müntəzəm ifadə sintaksisi dəstəyi ilə prosesin dəyişdirilməsindən istifadə edir və ənənəvi olaraq fayl adından istifadə edən əmr çıxışını (giriş) əvəz edir. "Funksiya" açar sözündən istifadə edərkən, Bash bəyannamələri Bourne və Korn skriptləri ilə uyğun gəlmir, çünki Korn qabığı "funksiya"dan istifadə edərkən eyni problemlə üzləşir, lakin POSIX-ə uyğun olaraq yuxarıdakı qabıqlarla eyni funksiya bəyannamə sintaksisini qəbul edir.

Bu və digər fərqlərə görə, skriptlər nadir hallarda Bourne və Korn tərcüməçiləri altında işləyirlər, əgər onlar bu uyğunluq nəzərə alınmaqla xüsusi olaraq yazılmayıblar, bu da Bash müntəzəm ifadələri ilə işləməyi planlaşdırarkən nəzərə alınmalıdır. Assosiativ massivlər AWK-ya bənzər indekslənmiş massivlər üçün saxta dəstəyə imkan verir. Bash 4.x yenisinə inteqrasiya olunmayıb MacOS versiyası lisenziya məhdudiyyətlərinə görə. Assosiativ massiv nümunəsi.

Qabığın iki əmr yerinə yetirmə rejimi var: toplu və paralel. Toplu rejimdə əmrlər ";" ilə ayrılır. Bash müntəzəm ifadələri nümunəsi:

  • əmr1;
  • əmr 2.

Bu misalda, 1-ci əmr tamamlandıqda, 2-ci əmr yerinə yetirilir və icranın sonunda (simvolundan) istifadə edərək, 1-ci əmri də yerinə yetirə bilərsiniz. fon, nəzarəti dərhal qabığa qaytarır və istifadəçiyə müraciət etməyə imkan verir icra edilə bilən əmrlər.

1 və 2-ci əmrləri eyni vaxtda yerinə yetirmək üçün onlar qabıqda aşağıdakı kimi yerinə yetirilməlidir:

  • komanda1 və əmr2.

Bu halda, 1-ci əmr arxa planda və simvolda yerinə yetirilir, idarəetmə dərhal ön planda 2-ci əmri yerinə yetirən qabığa qaytarılır. Bash grep müntəzəm ifadələri proses ön planda işləyərkən Ctrl + z yazmaqla dayandırıla və nəzarəti qaytara bilərsiniz. Həm arxa planda olan, həm də dayandırılmış bütün proseslərin siyahısına işləri yerinə yetirməklə nail olmaq olar.

Prosesin vəziyyəti müxtəlif əmrlərdən istifadə etməklə dəyişdirilə bilər. "fg" əmri bir prosesi ön plana çıxarır və "bg" əmri arxa planda işləyən prosesi dayandırır. Bg" və "fg" hansı prosesin üzərində işləyəcəyini göstərmək üçün ilk arqument kimi iş identifikatorunu götürə bilər. Bunsuz onlar "jobs" çıxışında artı işarəsi ilə göstərilən standart prosesdən istifadə edirlər. "Öldür" əmri siqnal göndərməklə prosesi vaxtından əvvəl dayandırmaq üçün istifadə edilə bilər İş identifikatoru faiz işarəsindən sonra göstərilməlidir:

  • kill -s SIGKILL% 1 və ya öldür -9%.

Bash, istifadə vəziyyəti əmri ilə təyin edilmiş çıxış kodunda "şərti" əmrləri yerinə yetirən komanda ayırıcılarına "şərti icra" verir. "Bashbug" adlı xarici komanda qabıq xətalarını bildirir. Komanda çağırıldıqda, doldurulmuş forma ilə istifadəçi üçün standart redaktoru işə salır. Forma Baş partiyalara və ya başqa ünvanlara göndərilir E-poçt, Bash müntəzəm ifadələri üçün qlobal bir əvəz təmin edir.

Bash işə başlayanda müxtəlif nöqtə fayllarını icra edir. Hətta tərcüməçi tərəfindən icra olunmaq və sifariş vermək icazəsi olan oxşar skript əmrləri üçün, məsələn:

  • #!/bin/bash.

Bash tərəfindən təyin ifadələri ilə istifadə edilən başlanğıc faylları bunu tələb etmir. Faylın icrası qaydası:

  1. Qabıq işə salındıqda, əgər varsa, /etc/profile oxuyur və icra edir.
  2. Bu fayl /etc/bash.bashrc faylını işə salır.
  3. Müəyyən etdikdən sonra bu fayldan~/.bash_profile-ə baxır, mövcud və oxuna bilən 1-cini oxuyur və icra edir.
  4. Əgər qabıq -dən gəlirsə, o, ~/.bash_logout-u müəyyən edir və icra edir.
  5. Qabıq kimi işlədildikdə, o, /etc/bash.bashrc, sonra isə ~/.bashrc təyin edir və icra edir.
  6. Bu, "--norc" seçimi ilə əlil olmaq imkanına malikdir.
  7. "--rcfile" fayl seçimi Bash-ı onu oxumağa və icra etməyə məcbur edir.
  8. Bourne shell və csh başlanğıcına xəritəçəkmə, Bourne shell və csh-dən çıxır. Onlar daraltmağa imkan verir ümumi istifadə Bourne faylları və csh istifadəçilərinə məlum olan fərdi başlanğıc funksiyalarını aktivləşdirin.

Bash-a -posix seçimi ilə zəng etmək və ya skriptdə -o posix dəstini təyin etmək Bash-ın qaçan müntəzəm ifadəsinin POSIX 1003.2 standartına çox uyğun olmasına səbəb olur. Portativlik üçün nəzərdə tutulmuş Shell skriptləri ən azı əvəz etmək niyyətində olduğu Bourne qabığını nəzərə almalıdır. Bash ənənəvi Bourne qabığında olmayan bəzi xüsusiyyətlərə malikdir. Bunlara daxildir:

  1. Bəzi inkişaf etmiş zəng seçimləri.
  2. $() qeydindən istifadə edərək əmr əvəzi. Bu xüsusiyyət POSIX 1003.2 standartının bir hissəsidir.
  3. Mötərizələrin genişləndirilməsi.
  4. Massivlər və assosiativ massivlərlə bəzi əməliyyatlar.
  5. Test konstruksiyasının ikiqat mötərizə ilə genişləndirilməsi.
  6. “if”də Baş nizami ifadələrin arifmetik-qiymətləndirmə qurulması.
  7. Bəzi simli manipulyasiya əməliyyatları.
  8. Əvəzetmə prosesi.
  9. Adi ifadə uyğunluğu operatoru.
  10. "Bash"-xüsusi daxili Koproseslər.

Bash hesab ifadələri standart düymə bağlamalarından (Emacs) istifadə edərək klaviatura qısa yollarını və əmr satırını redaktə etmək üçün "readline" istifadə edir. Vi bağlamaları "set -o vi" işlətməklə aktivləşdirilə bilər.

Mötərizənin dəyişdirilməsi, həmçinin interleaving adlanır, C qabığından kopyalanan bir funksiyadır. Bir sıra alternativ birləşmələr yaradır. Yaradılmış nəticələrin fayl kimi mövcud olmasına ehtiyac yoxdur. Hər bir genişləndirilmiş cərgənin nəticələri çeşidlənmir və düzgün qaydada saxlanılır. İstifadəçilər portativ qabıq skriptlərində mötərizə genişləndirmələrindən istifadə etməməlidirlər, çünki Bourne qabığı eyni çıxışı vermir.

Mötərizənin genişləndirilməsi joker işarələrlə birləşdirildikdə, mötərizələr əvvəlcə genişləndirilir və sonra yaranan joker simvollar dəyişdirilir. Mötərizənin genişləndirilməsindən əlavə, iki tam ədəd və ya cüt nöqtə ilə ayrılmış simvollar arasında ardıcıl diapazonlar üçün istifadə edilə bilər. Bash-ın müntəzəm ifadə istifadəsinin daha yeni versiyaları üçüncü tam ədədə artımı təyin etməyə imkan verir.

Mötərizənin genişləndirilməsi dəyişən genişlənmə ilə birləşdirildikdə, mötərizə genişlənməsindən sonra həyata keçirilir ki, bu da bəzi hallarda "qiymətləndirmə" qurğusunun istifadəsini tələb edə bilər, beləliklə:

  • $start = 1 ;
  • end = 10 $ echo ( $ start .. $ end ) # qiymətləndirmə sırasına görə genişləndirilə bilməz (1..10);
  • $eval echo ( $start .. $end ) # dəyişən genişlənməsi baş verir, sonra nəticədə sətir qiymətləndirilir: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Baş dilinin sintaktik aspektləri

Shell skriptləri mətni formatlaşdırmaq üçün əlavə simvollar və ya ardıcıllıqlar təqdim etməyən "redaktor" proqramından istifadə etməklə yaradılmış ASCII mətn faylında saxlanmalıdır. Məsələn, qabıq skriptləri yaratmaq üçün uyğun olan redaktorlar UNIX/Linux-da mövcud olan vi və ya Emacs proqramları və ya Microsoft Windows-da Notepad, TextEdit və UltraEdit kimi proqramlardır.

Hər Bash skriptinin ilk sətirinə "#!" ardıcıllığını daxil etmək yaxşı təcrübədir. /bin/bash”, skripti işlətmək istədiyiniz maşının fayl sistemində proqramın mütləq yolunu göstərir. Beləliklə, siz fayl adını "bash" əmrinə arqument kimi göstərmədən birbaşa əmr satırında işlədə bilərsiniz.

Skript təlimatlarını tərcümə etmək və yerinə yetirmək üçün əməliyyat sistemi tərəfindən istifadə ediləcək tərcüməçi proqramının göstəricisi skriptin özünün birinci sətirində “#!” simvollarının ardıcıllığından dərhal sonra verilir. Tərcüməçinin icrası /bin kataloqunda yerləşdiyi hesab edilir, lakin müxtəlif sistemlərdə o, digər kataloqlarda quraşdırıla bilər, məsələn:

  • "/usr/bin", "/usr/local/bin".

IN ümumi hal"#" simvolu skript mənbəyinə şərh daxil etməyə imkan verir. "#" simvolundan sonra skript xəttindəki hər hansı simvol komanda tərcüməçisi tərəfindən nəzərə alınmır. Əslində, necə işlədiyini təsvir etmək və ya xüsusi əmrlərin təsirini izah etmək üçün skript mənbəyinə şərhlər daxil etmək üçün tez-tez istifadə olunur. Əmrlərin interaktiv şəkildə daxil edilməsində olduğu kimi, hətta skripti kodlayarkən belə, hər bir proqram təlimatı ayrıca bir sətirdə yazıla və ya bir neçə sətirə bölünə və sonuncudan başqa hər sətri "\" simvolu ilə bitirə bilər. Əlavə təlimatlar ";" istifadə edərək eyni sətirdə bildirilə bilər.

Proqram təlimatları etmək üçün "girintili" ola bilər mənbə daha oxunaqlı, lakin boşluqların istifadəsinə diqqət yetirin. Bash tərcüməçisi digər tərcüməçilərə və ya tərtibçilərə nisbətən daha seçicidir və bəzi hallarda ifadələri təşkil edən üzvlər arasında ixtiyari boşluqların daxil edilməsinə icazə vermir, digər hallarda boşluq istifadəsidir; vacibdir təlimatların düzgün təfsiri üçün.

İdarəetmə strukturuna daxil edilmiş təlimat bloklarını ayırmaq üçün simvollar yoxdur, məsələn, iterativ idarəetmə strukturunda təkrarlanmalı olan. Digər tərəfdən, müvafiq dilçilik var açar sözlər, blokun başlanğıcını və sonunu düzgün müəyyən etməyə imkan verir. Bu açar sözlər proqram axınına nəzarət etmək üçün istifadə olunan təlimatdan asılı olaraq dəyişir. Bash müntəzəm ifadəsi olan "match" misal sintaksisində müəyyən simvollar xüsusi məna kəsb edir, yəni simvollar sətirində və ya əmr arqumenti kimi mövcuddursa, onlar çox dəqiq funksiya yerinə yetirirlər.

Minimal sadələşdirmə ilə deyə bilərik ki, qabıq interaktiv olaraq həmişə eyni əməliyyatı yerinə yetirən proqramdır. O, giriş kimi bir əmr gözləyir, əmrin sintaktik cəhətdən düzgün olduğundan əmin olmaq üçün onu qiymətləndirir və onu yerinə yetirir, sonra növbəti əmri gözləmək üçün qayıdır. Bu proses qabıq girişin tamamlandığını və ona başqa əmrlərin göndərilməyəcəyini bildirən bir siqnal aldıqda başa çatır. Bu anda, əməliyyat sistemi üçün ayrılmış yaddaşı və digər maşın resurslarını azad edərək, qabıq proqramı çıxır.

Skript, istifadəçi sistemin özünə daxil olduqda, əməliyyat sistemi tərəfindən avtomatik olaraq işə salınır, yəni istifadəçi artıq açıq qabıqda göstərilən əmrdən istifadə edərək və ya bir sistemlə işləyirsə xüsusi qrafik yardım proqramlarından istifadə edərək icra edə bilər. ilə qrafik interfeys istifadəçi. Məsələn, on Apple kompüteri Mac OS X ilə işləyən Macintosh kompüterləri üçün siz Tətbiq qovluğunda Utility qovluğunda yerləşən Terminal yardım proqramını işə salmaqla əmr qabığından istifadə edə bilərsiniz.

GNOME və ya KDE kimi qrafik iş masası meneceri olan Linux iş stansiyasında Proqramlar → Aksesuarlar menyusundan Terminal proqramını seçməklə əmr qabığını aça bilərsiniz. Komanda qabığını aktivləşdirdikdən sonra aşağıdakı əmrləri yerinə yetirməklə istifadə etdiyimiz qabığın adına baxa bilərik:

  • $echo;
  • $SHELL /bin/bash.

Defolt qabıq Bash deyilsə, siz "hansı" əmrindən istifadə edərək PATH mühit dəyişəninin siyahısında qeyd olunan qovluqlardan birində onun sistemdə olub-olmadığını yoxlaya və "bash" əmri ilə icra edə bilərsiniz:

  • $ echo $SHELL /bin/tcsh $ hansı bash /bin/bash $ bash bash-2.03$.

Beləliklə, qabıq interaktiv şəkildə işləyir, hər bir fərdi əmrə daxil olan məlumatları və komanda xəttində göstərilən parametrləri qəbul edir və əmrin özünü yerinə yetirir. Çıxış eyni terminal pəncərəsində göstərilir. Qabığa ötürülən hər bir əmr Invio/Enter düyməsini basmaqla başa çatır. Bir sətirdə birdən çox əmr verə bilərsiniz, onları bir-birindən ";" işarəsi ilə ayıra bilərsiniz. Həm də əmr əlavəsini iki və ya daha çox sətirə bölmək, hər bir aralıq sətri "\" simvolu ilə bitirmək mümkündür.

Tipik olaraq, proqramlaşdırma dillərində sətirləri ayırmaq üçün dırnaq və qoşa dırnaq işarələrindən istifadə olunur və bu və ya digər simvolun istifadəsi müəyyən bir dildə qəbul edilmiş sintaksisdən asılıdır. Skript dillərində sitatların və arxa istinadların istifadəsi fərqli məna daşıyır və Bash də bundan istisna deyil.

Simvol sətirlərini məhdudlaşdırmaq üçün tək dırnaq işarələri istifadə olunur. Tərcüməçi sətirin məzmununa daxil olmur və sadəcə olaraq dırnaqlarla ayrılmış simvollar ardıcıllığından istifadə edir. Beləliklə, başqa bir məna daşıyan simvollar da sətirin bir hissəsi ola bilər. Sitatlanmış sətirdə istifadə edilə bilməyən yeganə simvol eyni sitatlardır. Belə bir sətri müəyyən etmək üçün onu dırnaq işarələri ilə ayırmalısınız.

Sətirləri ayırmaq üçün qoşa dırnaq işarələrindən istifadə edilir, lakin sətir bu simvolla ayrılırsa, tərcüməçi "interpolyasiya" adlanan işi yerinə yetirir və sətirdəki Bash müntəzəm ifadələrində istənilən dəyişənlərin qiymətini həll edir. Təcrübədə qoşa dırnaq içərisində olan sətirdə dəyişənə istinad varsa, sətir dəyişənin adını onun dəyəri ilə əvəz edir. Qoşa dırnaq və ya dollar kimi simvolları çap etmək üçün, əks halda fərqli məna kəsb edəcək, siz onların hər birinə əks kəsik işarəsi "\" işarəsi qoymalısınız. Cüt dırnaqlı sətirdə əks kəsik işarəsini çap etmək üçün iki əks kəsik işarəsi qaytarmalısınız.

Geri izləmə skript dillərinə xas olan ən xarakterik davranışa malikdir və əsas yüksək səviyyəli proqramlaşdırma dillərində yoxdur. Dırnaq işarəsi sizə Bash tərəfindən əmr kimi şərh edilən və icra edilməli olan sətri məhdudlaşdırmağa imkan verir, eyni çıxış standart boru məhsuluna çıxış dəyəri kimi qaytarılır.

ASCII mətn faylında göstərilən əmrlər ardıcıllığını emal etməsi üçün qabığı yerinə yetirmək istəyirsinizsə:

  • $pwd;
  • echo $SHELL ;
  • hostame /home/marco /bin/bash aquilante $ echo \ > $SHELL /bin/bash.

Ev kataloqunuzda saxlanılan "script.sh" adlı fayl hazırlamaq istəyirsinizsə, faylın məzmunu aşağıdakı kimi ola bilər:

  • echo -n "Oggi e" il " 2 tarix +%d/%m/%Y.

Qabığın çağırıldığı komanda xəttində fayl adını göstərərək bu çox sadə skripti işə salın:

  • $ bash script.sh Oggi e" il 10/6/2011.

Qabıq həmçinin boru vasitəsilə yerinə yetiriləcək əmrlər ardıcıllığını qəbul edə bilər ki, bu da başqa bir əmrin çıxışını Bash-ın standart girişinə yönləndirir:

  • $ cat script.sh | bash Oggi" il 10/6/2011.

Siz Bash proqramının "#!" işarəsi ilə müntəzəm ifadə sətirini vurğulaya bilərsiniz. Skripti yerinə yetirmək üçün istifadə ediləcək tərcüməçinin mütləq yolu Bash-i işə salmaqla və skripti giriş kimi ötürməklə birbaşa OS olmadan idarə olunur:

  • $ cat script.sh #!/bin/bash echo -n "Oggi e" il " tarix +%d/%m/%Y $ chmod 755 script.sh $ ls -l script.sh -rwxr-xr-x 1 marco istifadəçiləri 49 18 aprel 23:58 script.sh $ ./script.sh Oggi e" il 10/6/2011.

Əvvəlki nümunədəki sonuncu əmr cari kataloqda mövcud olan "script.sh" faylında saxlanılan skriptin icrasına birbaşa səbəb olur. nisbi yol" ./ " fayl adından əvvəl. Siz icra olunan skriptin yerləşdiyi qovluğa gedən yolu göstərməlisiniz, çünki tez-tez təhlükəsizlik səbəbi ilə cari kataloq qabığın xarici icra edilə bilən əmrləri axtarmalı olduğu qovluqlar siyahısında olmur. Belə kataloqların siyahısı Bash müntəzəm ifadə dəyişənlərində saxlanılır.

Bash ilə əməliyyat sisteminin üstünlükləri

Bu, ən səmərəli shell skript dilidir. O, istifadəçiyə qabıqdan interaktiv şəkildə istifadə etməklə tanışdırsa, işi avtomatlaşdırmaq üçün asan yol verir. Əgər tərtibatçı sistemləri proqramlaşdırırsa, o zaman qabığın necə işlədiyini bilməlidir.

Skriptləri "yaml" və ya "json" konfiqurasiya və ya avtomatlaşdırma sisteminin öyrənilməsi ilə müqayisə etsəniz, onlar daha çox yönlüdür. Bash skriptləri daha sadədir, çünki skript standart olaraq işləyir.

Bash daha sadə bir dildir və bu, tərtibatçıları sistemin digər mürəkkəbliklərinə diqqət yetirməyə məcbur edir. Bash qabıq yazmaq üçün əla işləyir. Qalan hər şey, əsasən, ya bir əmr qabığından istifadə edir, ya da ondan yaxşı hissələri kopyalayaraq, öz qabığını həyata keçirir. Bundan əlavə, qabıqla işləməyi asanlaşdıran yaxşı Bash müntəzəm ifadə qurucuları var.

Bash ilə tərtibatçılar komandanın təcrübəsindən istifadə etməklə interaktiv veb təcrübəsi yarada bilərlər. Linux sətirləri zaman və məkan sərhədləri olmadan. Bu imkandan istifadə ciddi qaydalar və ya səy tələb etmir və istifadəçilər hətta Azure mobil proqramları, Azure Portal və Azure Sənədlərindən istifadə edərkən belə, bir kliklə Azure resurslarını və mühitini idarə edərək təsdiqlənmiş iş stansiyasına daxil ola bilərlər.

Ənənəvi komanda xətti mühitindən fərqli olaraq, işə başlamazdan əvvəl alətləri quraşdırmağa və seçməyə ehtiyac yoxdur və siz Bash ilə vaxt və səyə qənaət edə bilərsiniz. Mətn, montajlar, konteynerlər və mənbə kimi bütün CLI alətləri Bash-da mövcuddur və onlardan biri CLI 2.0 istifadə edərək təhlükəsiz və asan alət identifikasiyasından istifadə edə bilər.

Bash müntəzəm ifadələrinin nümunələrinə baxdıq. Öyrənmədə uğurlar!

grep yardım proqramı çox güclü axtarış və filtr alətidir. mətn məlumatı. Bu məqalədə onun imkanlarını qiymətləndirməyə imkan verəcək bir neçə istifadə nümunəsi göstərilir.
Grep-in əsas istifadəsi fayl və çıxış axınlarında söz və ya ifadələri axtarmaqdır. Siz əmr satırında sorğu və axtarış sahəsini (faylını) yazaraq axtarış edə bilərsiniz.
Məsələn, hystack.txt faylında "iynə" sətirini tapmaq üçün aşağıdakı əmrdən istifadə edin:

$ grep iynə haystack.txt

Nəticədə, grep haystack.txt faylının məzmununda rastlaşdığı bütün iynə hadisələrini göstərəcək. Qeyd etmək vacibdir ki, bu halda grep bir söz deyil, simvollar toplusunu axtarır. Məsələn, “lazımsız” sözünü və “iynə” ardıcıllığını ehtiva edən digər sözləri ehtiva edən sətirlər göstəriləcək.


Grep-ə xüsusi bir söz axtardığınızı bildirmək üçün -w keçidindən istifadə edin. Bu düymə axtarışı yalnız müəyyən edilmiş sözlə məhdudlaşdıracaq. Söz hər iki tərəfdən istənilən boşluq, durğu işarələri və ya sətir sonu ilə ayrılmış sorğudur.

$ grep -w iynə haystack.txt

Axtarışı yalnız bir faylla məhdudlaşdırmaq lazım deyil; grep bir qrup faylda axtarış edə bilər və axtarış nəticələri uyğunluğun tapıldığı faylı göstərəcək. -n keçidi eyni zamanda uyğunluğun tapıldığı sətir nömrəsini əlavə edəcək və -r keçidi sizə rekursiv axtarış aparmağa imkan verəcək. Proqram mənbə kodları olan fayllar arasında axtarış apararkən bu çox rahatdır.

$ grep -rnw funksiya_adı /home/www/dev/myprogram/

Fayl adı hər matçdan əvvəl siyahıya alınacaq. Fayl adlarını gizlətmək lazımdırsa, -h keçidindən istifadə edin, əksinə, yalnız fayl adlarına ehtiyacınız varsa, -l keçidini təyin edin.
Aşağıdakı misalda biz IRC log faylında URL-ləri axtaracağıq və son 10 uyğunluğu göstərəcəyik.

$ grep -wo http://.* channel.log | quyruq

-o seçimi grep-ə bütün xətti deyil, yalnız nümunə uyğunluğunu çap etməyi əmr edir. Borudan istifadə edərək, grep-in çıxışını defolt olaraq son 10 sətri çıxaran quyruq əmrinə yönləndiririk.
İndi biz müəyyən istifadəçilər tərəfindən irc kanalına göndərilən mesajların sayını hesablayacağıq. Məsələn, evdən və işdən göndərdiyim bütün mesajlar. Onlar ləqəblə fərqlənirlər, evdə user_at_home, işdə isə user_at_work ləqəbindən istifadə edirəm.

$ grep -c "^user_at_(ev|iş)" channel.log

-c seçimi ilə grep uyğunluqların özlərini deyil, yalnız tapılan uyğunluqların sayını çap edir. Axtarış sətri dırnaq içərisindədir, çünki o, ehtiva edir Xüsusi simvollar, bu qabıq tərəfindən idarəedicilər kimi tanınır. Nəzərə alın ki, dırnaq işarələri axtarış nümunəsinə daxil edilmir. Xüsusi simvollardan qaçmaq üçün "" tərs xətt istifadə olunur.
Gəlin kanalda “qışqırmağı” sevən insanların mesajlarını axtaraq. “Qışqırmaq” dedikdə biz sarışın üslubda, bütün BÖYÜK hərflərlə yazılmış mesajları nəzərdə tuturuq. Axtarışdan abreviaturaların təsadüfi hitlərini istisna etmək üçün beş və ya daha çox simvoldan ibarət sözləri axtaracağıq:

$ grep -w "+(5,)" channel.log

Daha ətraflı təsvir üçün grep man səhifəsinə müraciət edə bilərsiniz.
Daha bir neçə nümunə:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

/etc/passwd faylından sətir kökünü ehtiva edən sətirləri göstərir.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Bundan əlavə, axtarılan xətti ehtiva edən sətir nömrələri göstərilir.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0: sync:/sbin:/bin/sync bağlanması:x:6:0:sbin:/sbin:/sbin/sbin/sbin dayandırılması:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC istifadəçisi:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false adlı:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP İstifadəçi: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Qabıq kimi göstərilən nologin olan istifadəçi hesabları istisna olmaqla, hansı istifadəçilərin bash istifadə etmədiyini yoxlayır.

# grep -c false /etc/passwd 7

Qabıq kimi /bin/false olan hesabların sayını hesablayır.

# grep -i oyunları ~/.bash* | grep -v tarixi

Bu əmr, eyni sətri təyin edə bilən ~/.bash_history-də tapılan uyğunluqları istisna etmək üçün adları sətir tarixçəsini ehtiva edən fayllar istisna olmaqla, cari istifadəçinin ev kataloqunda adları ~/.bash ilə başlayan bütün fayllardan sətirləri göstərir. böyük və ya kiçik hərflərlə. Nəzərə alın ki, “oyunlar” sözü üçün axtarış aparılır;
grep əmri və müntəzəm ifadələr

Əvvəlki nümunədən fərqli olaraq, biz indi yalnız “root” xətti ilə başlayan sətirləri göstərəcəyik:

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Hansı hesabların qabıqdan ümumiyyətlə istifadə etmədiyini görmək istəyiriksə, ":" simvolu ilə bitən sətirləri axtarırıq:

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

~/.bashrc faylınızdakı PATH dəyişəninin ixrac edilib-edilmədiyini yoxlamaq üçün əvvəlcə "eksport" olan sətirləri seçin və sonra "PATH" sətri ilə başlayan sətirləri axtarın; bu halda MANPATH və digər mümkün yollar göstərilməyəcək:

# grep ixrac ~/.bashrc | grep "PATH" ixracı PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Xarakter sinifləri

Kvadrat mötərizədəki ifadə [" və "]"" simvollarının içərisinə alınmış simvolların siyahısıdır. Bu siyahıda göstərilən hər hansı bir simvola uyğun gəlir; əgər siyahının ilk simvolu "^" olarsa, o, siyahıda OLMAYAN hər hansı simvola uyğun gəlir. Məsələn, "" müntəzəm ifadəsi istənilən tək rəqəmə uyğun gəlir.

Kvadrat mötərizədə ifadə daxilində siz defislə ayrılmış iki simvoldan ibarət aralığı təyin edə bilərsiniz. Sonra ifadə, çeşidləmə qaydalarına əsasən, bu iki simvol daxil olmaqla, bu iki simvolun içərisinə düşən istənilən singletona uyğun gəlir; bu, yerli dildə göstərilən harmanlama və simvol dəstini nəzərə alır. Məsələn, standart dil C olduqda, "" ifadəsi "" ifadəsinə ekvivalentdir. Çeşidləmənin lüğət sırası ilə aparıldığı bir çox yerli dillər var və bu dillərdə "" ümumiyyətlə "" ilə ekvivalent deyildir ki, burada, məsələn, "" ifadəsinə ekvivalent ola bilər. Kvadrat mötərizədə göstərilən ifadənin ənənəvi şərhindən istifadə etmək üçün onu təyin edərək C dilini istifadə edə bilərsiniz mühit dəyişəni LC_ALL dəyəri "C".

Nəhayət, kvadrat mötərizədə ifadələr içərisində qeyd olunan xüsusi adlandırılmış simvol sinifləri var. Bu əvvəlcədən təyin edilmiş ifadələr haqqında ətraflı məlumat üçün man səhifələrinə və ya grep əmr sənədlərinə baxın.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: heç kim:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Nümunədə "y" və ya "f" simvolu olan bütün sətirlər göstərilir.
Universal simvollar (metaxarakterlər)

"." istifadə edin. hər hansı bir xarakterə uyğun gəlmək üçün. Tərkibində "c" ilə başlayan və "h" ilə bitən beş simvoldan ibarət lüğətdən götürülmüş bütün ingilis sözlərinin siyahısını istəyirsinizsə (krossvordların həlli üçün faydalıdır):

# grep " " /usr/share/dict/words catch clash cloth coach taxt öskürək crash crush

Əgər siz hərf olaraq nöqtə simvolu olan sətirləri göstərmək istəyirsinizsə, grep komandasında -F seçimini göstərin. Simvollar "< " и «>" qeyd olunan hərflərdən əvvəl və müvafiq olaraq sonra boş sətirin olması deməkdir. Bu o deməkdir ki, sözlər faylındakı sözlər müvafiq olaraq yazılmalıdır. Boş sətirləri nəzərə almadan mətndəki bütün sözləri göstərilən nümunələrə uyğun tapmaq istəyirsinizsə, simvolları buraxın "< " и «>", yalnız sözlərin daha dəqiq axtarışı üçün -w keçidindən istifadə edin.

Eyni şəkildə “c” və “h” arasında istənilən sayda simvol ola bilən sözləri tapmaq üçün ulduzdan (*) istifadə edin. Aşağıdakı nümunə sistem lüğətindən "c" ilə başlayan və "h" ilə bitən bütün sözləri seçir:

# grep " " /usr/share/dict/words xəlifə cash catch cuna çita --çıxış buraxıldı--

Əgər faylda və ya çıxış axınında hərfi ulduz simvolunu tapmaq istəyirsinizsə, onu tapmaq üçün tək dırnaq işarələrindən istifadə edin. Aşağıdakı misaldakı istifadəçi əvvəlcə dırnaq işarələrindən istifadə etmədən /etc/profile faylında "ulduz işarəsi" axtarmağa çalışır, nəticədə heç nə tapılmır. Kotirovkalardan istifadə edildikdə nəticə çıxarılır:

# grep * /etc/profile # grep "*" /etc/profile.d/*.sh daxilində i üçün /etc/profile ; et

Linux terminalında ən faydalı və xüsusiyyətlərlə zəngin əmrlərdən biri “grep” əmridir. Grep "qlobal müntəzəm ifadə çapı" (yəni, "müntəzəm ifadəyə uyğun gələn sətirləri hər yerdə axtarın və onları çap edin") mənasını verən qısaltmadır. Bu o deməkdir ki, grep daxiletmənin müəyyən edilmiş nümunələrə uyğun olub olmadığını görmək üçün istifadə edilə bilər.

Bu sadə görünən proqram düzgün istifadə edildikdə çox güclüdür. Mürəkkəb qaydalara əsaslanan daxiletməni çeşidləmək qabiliyyəti onu bir çox əmr zəncirlərində populyar bir əlaqə halına gətirir.

Bu dərslik grep əmrinin bəzi imkanlarına baxır və sonra müntəzəm ifadələrdən istifadə etməyə keçir. Bütün təsvir edilmişdir bu təlimatüsulları virtual serverin idarə edilməsində tətbiq oluna bilər.

İstifadə əsasları

Ən sadə formada grep mətn faylında hərf nümunələrinin uyğunluqlarını tapmaq üçün istifadə olunur. Bu o deməkdir ki, grep-ə axtarış sözü verilsə, o, həmin sözü ehtiva edən fayldakı hər sətri çap edəcək.

Nümunə olaraq, Ubuntu sistemində GNU Ümumi İctimai Lisenziyasının 3-cü versiyasında "GNU" sözünü ehtiva edən sətirləri tapmaq üçün grep-dən istifadə edə bilərsiniz.

cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU GENERAL İCTİMAİ LİSENZİYASI





13. GNU Affero General Public License ilə istifadə edin.
GNU Affero General Public License-nin 3-cü versiyasına uyğun olaraq vahid
...
...

Birinci arqument olan "GNU" axtarılacaq nümunə, ikinci arqument olan "GPL-3" isə tapılacaq giriş faylıdır.

Nəticədə mətn nümunəsini ehtiva edən bütün sətirlər çıxacaq. Bəzi Linux paylamaları axtardığınız naxış çıxış sətirlərində vurğulanacaq.

Ümumi seçimlər

Varsayılan olaraq, grep əmri sadəcə giriş faylında ciddi şəkildə müəyyən edilmiş nümunələri axtarır və tapdığı sətirləri çap edir. Bununla belə, grep-in davranışı bəzi əlavə bayraqlar əlavə etməklə dəyişdirilə bilər.

Axtarış parametrinin hərfinə məhəl qoymamaq və nümunənin həm böyük, həm də kiçik hərf varyasyonlarını axtarmaq lazımdırsa, "-i" və ya "--ignore-case" yardım proqramlarından istifadə edə bilərsiniz.

Nümunə olaraq, eyni faylda böyük, kiçik və ya qarışıq hərflərlə yazılmış "lisenziya" sözünü axtarmaq üçün grep-dən istifadə edə bilərsiniz.

grep -i "lisenziya" GPL-3
GNU GENERAL İCTİMAİ LİSENZİYASI
bu lisenziya sənədinin dəyişdirilməsinə icazə verilmir.
GNU General Public License pulsuz, copyleft lisenziyasıdır
Əksər proqram təminatı və digər praktik işlər üçün lisenziyalar tərtib edilmişdir
GNU General Public License sizin azadlığınızı təmin etmək üçün nəzərdə tutulub
Proqram təminatımızın əksəriyyəti üçün GNU Ümumi İctimai Lisenziyası; üçün də aiddir


"Bu Lisenziya" GNU Ümumi İctimai Lisenziyasının 3-cü versiyasına istinad edir.
“Proqram” buna əsasən lisenziyalaşdırılmış müəllif hüququ ilə qorunan işə aiddir
...
...

Göründüyü kimi, çıxışda "LİSENZİYA", "lisenziya" və "Lisenziya" var. Faylda "LiCeNsE" nümunəsi olsaydı, o da çıxarılacaqdı.
Göstərilən nümunəni ehtiva etməyən bütün sətirləri tapmaq lazımdırsa, "-v" və ya "--invert-match" bayraqlarından istifadə edə bilərsiniz.

Nümunə olaraq, BSD lisenziyasında "the" sözü olmayan bütün sətirləri axtarmaq üçün aşağıdakı əmrdən istifadə edə bilərsiniz:

grep -v "the" BSD
Bütün hüquqlar qorunur.
Yenidən bölüşdürmə və mənbə və binar formalarda istifadə, ilə və ya olmadan
qarşılanır:
bu proqram təminatından əldə edilən məhsulları təsdiqləmək və ya tanıtmaq üçün istifadə edilə bilər
xüsusi əvvəlcədən yazılı icazə olmadan.
BU PROQRAM TƏMİNATI OLDUĞU KİMİ REGENTLƏR VƏ TƏHRƏFÇİLƏR TƏRƏFİNDƏN TƏMİN EDİLİR"" VƏ
HƏR AÇIQ VƏ YA DOLAYI ZƏMANƏTLƏR, O cümlədən, lakin bununla məhdudlaşmayan,
...
...

Gördüyünüz kimi, son iki sətir "the" sözünü ehtiva etmədiyi üçün çıxarıldı, çünki "iqnor halda" əmri istifadə edilmədi.

Uyğunluqların tapıldığı sətir nömrələrini bilmək həmişə faydalıdır. Onları "-n" və ya "--sətir nömrəsi" bayraqlarından istifadə etməklə tapmaq olar.

Əvvəlki nümunədə bu bayrağı tətbiq etsəniz, aşağıdakı nəticə görünəcək:

grep -vn "the" BSD
2:Bütün hüquqlar qorunur.
3:
4: Yenidən bölüşdürülmə və mənbə və binar formalarda, ilə və ya olmadan istifadə
6: qarşılanır:
13: bu proqram təminatından əldə edilən məhsulları təsdiqləmək və ya təşviq etmək üçün istifadə edilə bilər
14: xüsusi əvvəlcədən yazılı icazə olmadan.
15:
16: BU PROGRAM TƏMİNATI OLDUĞU KİMİ REGENTLƏR VƏ TƏHRƏFÇİLƏR TƏRƏFİNDƏN TƏMİN EDİLİR""VƏ
17: İSTƏNİLƏN AÇIQ VƏ YA ZƏMANƏTLƏR, O cümlədən, lakin bununla məhdudlaşmayan,
...
...

İndi "the" olmayan hər bir sətirdə dəyişiklik etmək lazım olduqda sətir nömrəsinə müraciət edə bilərsiniz.

Adi ifadələr

Girişdə qeyd edildiyi kimi, grep “qlobal müntəzəm ifadə çapı” deməkdir. Normal ifadə xüsusi axtarış modelini təsvir edən mətn sətridir.

Fərqli tətbiqlər və proqramlaşdırma dilləri normal ifadələrdən bir qədər fərqli istifadə edirlər. Bu dərslik Grep üçün nümunələri təsvir etmək yollarının yalnız kiçik bir hissəsini əhatə edir.

Hərf uyğun gəlir

Yuxarıdakı "GNU" və "the" sözlərinin axtarışı nümunələrində "GNU" və "the" simvol sətirinə tam uyğun gələn çox sadə normal ifadələr axtarıldı.

Onları sözlərin uyğunluğu kimi deyil, simvol sətirlərinin uyğunluğu kimi düşünmək daha düzgündür. Daha mürəkkəb nümunələrlə tanış olduqdan sonra bu fərq daha da əhəmiyyətli olacaq.

Verilmiş simvollara tam uyğun gələn naxışlar "hərf" nümunələri adlanır, çünki onlar nümunə ilə hərf hərf, simvol ilə uyğun gəlir.

Bütün əlifba və rəqəmli simvollar (və bəzi digər simvollar) başqa ifadə mexanizmləri tərəfindən dəyişdirilmədiyi halda sözün əsl mənasında uyğun gəlir.

Çapa matçları

Çapalar, istədiyiniz uyğunluğun sətirindəki yeri göstərən xüsusi simvollardır.

Məsələn, siz müəyyən edə bilərsiniz ki, axtarış üçün yalnız başlanğıcda “GNU” sözünü ehtiva edən sətirlər lazımdır. Bunu etmək üçün hərf sətirindən əvvəl “^” lövbərindən istifadə etməlisiniz.

Bu nümunə yalnız əvvəlində "GNU" sözünü ehtiva edən sətirləri çap edir.

grep "^GNU" GPL-3
Proqram təminatımızın əksəriyyəti üçün GNU Ümumi İctimai Lisenziyası; üçün də aiddir
GNU General Public License, siz indiyə qədər dərc edilmiş istənilən versiyanı seçə bilərsiniz

Eyni şəkildə, "$" lövbəri hərfi sətirdən sonra istifadə edilə bilər ki, uyğunluq yalnız axtarılan simvol sətir mətn sətirinin sonunda olarsa etibarlıdır.

Aşağıdakı müntəzəm ifadə yalnız sonunda "və" olan sətirləri çap edir:

grep "və $" GPL-3
ki, bunun üçün heç bir zəmanət yoxdur pulsuz proqram təminatı. Hər iki istifadəçi üçün" və
Kopyalama, paylama və dəqiq şərtlər


alternativ yalnız arabir və qeyri-kommersiya olaraq icazə verilir və
modifikasiya özü maddi və zaman şəbəkə rədd edilə bilər
şəbəkənin işinə mənfi təsir göstərir və ya qaydaları pozur və
Müəllif hüquqlarının sahibi açıq şəkildə və qədər, şərti olaraq
orijinal lisenziya verənlərdən lisenziya alır, işlətmək, dəyişdirmək və
etmək, istifadə etmək, satmaq, satışa çıxarmaq, idxal etmək və başqa şəkildə işlətmək, dəyişdirmək və

İstənilən xarakterə uyğunlaşın

Nöqtə (.) müntəzəm ifadələrdə istənilən simvolun göstərilən yerdə görünə biləcəyini göstərmək üçün istifadə olunur.

Məsələn, iki simvoldan ibarət uyğunluqları və sonra "cept" ardıcıllığını tapmaq istəyirsinizsə, aşağıdakı nümunədən istifadə edərdiniz:

grep "..cept" GPL-3
istifadə, məhz ən qəbuledilməz olduğu yerdədir. Ona görə də biz
qüvvədə olan müəllif hüquqları qanununa əsasən pozuntu, a
istifadəçiyə iş üçün heç bir zəmanət olmadığını bildirir (

ayrıca yazılı və ya istisnalar kimi göstərilən lisenziyanın forması;
Siz açıq-aydın hallar istisna olmaqla, əhatə olunmuş işi təbliğ edə və ya dəyişdirə bilməzsiniz
9. Nüsxələrin olması üçün qəbul tələb olunmur.
...
...

Göründüyü kimi, nəticələrə “qəbul edirəm” və “istisna” sözləri, həmçinin bu sözlərin variasiyaları daxildir. Nümunə mətndə olsaydı, “z2cept” ardıcıllığına da uyğun olardı.

Mötərizədə ifadələr

Bir qrup simvolu kvadrat mötərizə ("") içərisində yerləşdirməklə, mötərizədə olan simvollardan hər hansı birinin həmin mövqedə görünə biləcəyini göstərə bilərsiniz.

Bu o deməkdir ki, "çox" və ya "iki" olan sətirləri tapmaq lazımdırsa, aşağıdakı nümunədən istifadə edərək bu variasiyaları qısaca göstərə bilərsiniz:

grep "to" GPL-3
proqramlarınız da.

GNU GPL-dən istifadə edən tərtibatçılar hüquqlarınızı iki addımla qoruyur:
surətinin ötürülməsi olmayan kompüter şəbəkəsi ötürülmür.

Şəbəkə serverindən pulsuz mənbə.
...
...

Gördüyünüz kimi, faylda hər iki variasiya tapıldı.

Simvolların mötərizədə qoyulması bir neçə faydalı xüsusiyyət də təmin edir. Mötərizədə olan simvolların siyahısını “^” simvolu ilə başlamaqla mötərizədə olan simvollardan başqa hər şeyin nümunəyə uyğun olduğunu göstərə bilərsiniz.

IN bu misalda"kod" ardıcıllığına uyğun gəlməməli olan ".ode" şablonundan istifadə edilir.

grep "[^c]ode" GPL-3
1. Mənbə kodu.
model, obyekt koduna sahib olan hər kəsə ya vermək (1) a
məhsulun yeganə əhəmiyyətli istifadə üsulu.
interaktiv rejimdə başlayanda belə xəbər verin:

Qeyd etmək lazımdır ki, ikinci sətir çıxışında "kod" sözü var. Bu regex və ya grep xətası deyil.

Daha doğrusu, bu sətir “model” sözündə olan “rejim” naxış uyğunluğu ardıcıllığını ehtiva etdiyi üçün çap edilib. Yəni naxışa uyğun gəldiyi üçün sim çap olunub.

Başqa biri faydalı xüsusiyyət mötərizələr - hər bir simvolu ayrıca daxil etmək əvəzinə simvolların diapazonunu təyin etmək imkanı.

Bu o deməkdir ki, böyük hərflə başlayan hər sətri tapmaq lazımdırsa, aşağıdakı nümunədən istifadə edə bilərsiniz:

grep "^" GPL-3
Proqram təminatımızın əksəriyyəti üçün GNU Ümumi İctimai Lisenziyası; üçün də aiddir

Lisenziya. Hər bir lisenziya sahibinə “siz” kimi müraciət edilir. "Lisenziyalar" və


Sistem Kitabxanaları və ya ümumi təyinatlı alətlər və ya ümumiyyətlə pulsuzdur
Mənbə.

...
...

Bəzi xas harmanlama problemlərinə görə, daha dəqiq nəticələr əldə etmək üçün yuxarıdakı nümunədə istifadə olunan simvol diapazonu əvəzinə POSIX simvol siniflərindən istifadə etmək daha yaxşıdır.
Bu təlimatda əhatə olunmayan bir çox xarakter sinifləri var; məsələn, yuxarıdakı nümunədə olduğu kimi eyni proseduru yerinə yetirmək üçün mötərizədə "[:upper:]" simvol sinfindən istifadə edə bilərsiniz.

grep "^[[:yuxarı:]]" GPL-3
Proqram təminatımızın əksəriyyəti üçün GNU Ümumi İctimai Lisenziyası; üçün də aiddir
Dövlətlər patentlərin inkişafı və istifadəsini məhdudlaşdırmağa icazə verməməlidirlər
Lisenziya. Hər bir lisenziya sahibinə “siz” kimi müraciət edilir. "Lisenziyalar" və
Komponent və (b) yalnız bununla işin istifadəsini təmin etməyə xidmət edir
Əsas Komponent və ya Standart İnterfeys həyata keçirmək üçün
Sistem Kitabxanaları və ya ümumi təyinatlı alətlər və ya ümumiyyətlə pulsuzdur
Mənbə.
İstifadəçi Məhsulu alıcıya əbədi və ya bir müddətə ötürülür
...
...

Nümunəni təkrarlayın (0 və ya daha çox dəfə)

Ən çox istifadə edilən meta-simvollardan biri "*" simvoludur ki, bu da "əvvəlki simvolu və ya ifadəni 0 və ya daha çox dəfə təkrarlamaq" mənasını verir.

Məsələn, aralarında yalnız hərflər və tək boşluq olan mötərizələri açılan və ya bağlanan hər sətri tapmaq istəyirsinizsə, aşağıdakı ifadədən istifadə edə bilərsiniz:

grep "(*)" GPL-3

paylanması (dəyişikliklərlə və ya dəyişdirilmədən), istifadəyə verilməsi
bütövlükdə əsərdən daha, (a) normal formada daxil edilir
Komponent və (b) yalnız bununla işin istifadəsini təmin etməyə xidmət edir
(əgər varsa) icra edilə bilən işin işlədiyi və ya istifadə etdiyi tərtibçi
(fiziki paylama mühiti daxil olmaqla) ilə müşayiət olunur
(fiziki paylama mühiti daxil olmaqla), a ilə müşayiət olunur
yer (pulsuz və ya ödənişli) və ekvivalent giriş təklif edin
...
...

Meta simvollardan necə qaçınmaq olar

Bəzən hərfi dövr və ya hərfi açıq mötərizə axtarmaq lazım ola bilər. Bu simvollar müntəzəm ifadələrdə xüsusi məna daşıdığından, bu halda onların xüsusi mənasının lazım olmadığını grep-ə söyləməklə onlardan “qaçmaq” lazımdır.

Bu simvollardan, adətən xüsusi məna daşıyan simvoldan əvvəl tərs xətt (\) istifadə etməklə qaçmaq olar.

Məsələn, böyük hərflə başlayan və nöqtə ilə bitən sətir tapmaq lazımdırsa, aşağıdakı ifadədən istifadə edə bilərsiniz. Son nöqtədən əvvəl tərs kəsik işarəsi əmrə ondan "qaçmaq" əmrini verir, belə ki son nöqtə hərfi nöqtəni təmsil edir və "hər hansı bir simvol" mənasını daşımır:

grep "^.*\.$" GPL-3
Mənbə.
Onun bir və ya bir neçə şərtindən istisnalar etməklə lisenziya.
Lisenziya Proqramı ötürməkdən tamamilə çəkinmək olardı.
BÜTÜN LAZIMLI XİDMƏT, TƏMİR VƏ YA DÜZƏLƏMƏ.
BELƏ ZƏRƏRLƏR.
Həmçinin məlumat əlavə edin elektron və kağız poçt vasitəsilə sizinlə necə əlaqə saxlamağınız barədə.

Təkmil Normal İfadələr

Grep əmri, -E bayrağından istifadə etməklə və ya grep əvəzinə egrep əmrini çağırmaqla genişləndirilmiş müntəzəm ifadə dili ilə də istifadə edilə bilər.

Bu əmrlər "genişlənmiş müntəzəm ifadələr" imkanlarını açır. Genişləndirilmiş müntəzəm ifadələr bütün əsas meta-simvolları, eləcə də daha mürəkkəb uyğunluqları ifadə etmək üçün əlavə meta-simvolları ehtiva edir.

Qruplaşdırma

Ən sadələrdən biri və ən faydalı imkanlar uzadılmış müntəzəm ifadələrə imkan verən , ifadələri qruplaşdırmaq və onları vahid vahid kimi istifadə etmək qabiliyyətidir.

Mötərizələr ifadələri qruplaşdırmaq üçün istifadə olunur. Əgər uzadılmış normal ifadələrdən kənarda mötərizələrdən istifadə etmək lazımdırsa, onlar tərs xətt istifadə edərək "qaçmaq" olar

grep "\(qruplaşdırma\)" faylı.txt
grep -E "(qruplaşdırma)" faylı.txt
egrep "(qruplaşdırma)" faylı.txt

Yuxarıdakı ifadələr ekvivalentdir.

Alternativ

Kvadrat mötərizədə bir simvol üçün müxtəlif mümkün uyğunluqları təyin etdiyi kimi, interleaving də simvol sətirləri və ya ifadələr dəstləri üçün alternativ uyğunluqları təyin etməyə imkan verir.

Dəyişməni göstərmək üçün şaquli bar simvolu "|" istifadə olunur. Alternativ qruplaşmada çox vaxt iki və ya daha çoxdan birinin olduğunu göstərmək üçün istifadə olunur mümkün variantlar təsadüf hesab edilməlidir.

Bu nümunədə siz “GPL” və ya “General Public License” axtarmalısınız:

grep -E "(GPL|General Public License)" GPL-3
GNU General Public License pulsuz, copyleft lisenziyasıdır
GNU General Public License sizin azadlığınızı təmin etmək üçün nəzərdə tutulub
Proqram təminatımızın əksəriyyəti üçün GNU Ümumi İctimai Lisenziyası; üçün də aiddir
qiymət. Ümumi İctimai Lisenziyalarımız sizə əmin olmaq üçün hazırlanmışdır
GNU GPL-dən istifadə edən tərtibatçılar hüquqlarınızı iki addımla qoruyur:
Tərtibatçıların "və müəlliflərin" qorunması üçün GPL aydın şəkildə izah edir
müəlliflərin xatirinə, GPL dəyişdirilmiş versiyaların kimi qeyd olunmasını tələb edir
GPL-in bu versiyasını onlar üçün təcrübəni qadağan etmək üçün tərtib etmişlər
...
...

Alternativ iki və ya daha çox seçim arasında seçim etmək üçün istifadə edilə bilər; Bunu etmək üçün, "|" şaquli çubuq simvolundan istifadə edərək hər birini ayıraraq, qalan seçimləri seçim qrupuna daxil etməlisiniz.

Kəmiyyət göstəriciləri

Genişləndirilmiş müntəzəm ifadələrdə simvolun nə qədər tez-tez təkrarlandığını göstərən metasimvollar var, eynilə "*" metaxarakteri əvvəlki simvolun və ya simvol sətirinin 0 və ya daha çox dəfə uyğunlaşdığını göstərir.

Bir simvolu 0 və ya daha çox dəfə uyğunlaşdırmaq üçün "?" simvolundan istifadə edə bilərsiniz. Bu, əvvəlki xarakter və ya simvol seriyasını mahiyyətcə isteğe bağlı edəcək.

Bu nümunədə “kopya” ardıcıllığını isteğe bağlı qrupa daxil etməklə “müəllif hüququ” və “sağ” uyğunluqları göstərilir:

grep -E "(surəti)?doğru" GPL-3
Müəllif hüququ (C) 2007 Free Software Foundation, Inc.
Hüquqlarınızı qorumaq üçün başqalarının sizi inkar etməsinin qarşısını almalıyıq
bu hüquqlardan və ya sizdən hüquqlardan imtina etməyinizi xahiş edir. Buna görə də var
hüquqlarını bilsinlər.
GNU GPL-dən istifadə edən tərtibatçılar hüquqlarınızı iki addımla qoruyur:
(1) proqram təminatı üzərində müəllif hüquqlarını müdafiə edin və (2) sizə bu Lisenziyanı təklif edin
“Müəlliflik hüququ” həmçinin digər növlərə tətbiq olunan müəllif hüququna bənzər qanunlar deməkdir
...
...

"+" simvolu ifadələrə 1 və ya daha çox dəfə uyğun gəlir. Demək olar ki, "*" simvolu kimi işləyir, lakin "+" istifadə edərkən ifadə ən azı 1 dəfə uyğun olmalıdır.

Aşağıdakı ifadə "pulsuz" sətirinə üstəgəl boşluq olmayan 1 və ya daha çox simvola uyğun gəlir:

grep -E "free[^[:space:]]+" GPL-3
GNU General Public License pulsuz, copyleft lisenziyasıdır
işləri bölüşmək və dəyişdirmək azadlığını əlindən almaq. Əksinə,
GNU General Public License sizin azadlığınızı təmin etmək üçün nəzərdə tutulub
Azad proqram təminatı dedikdə biz azadlığı nəzərdə tuturuq, yox
pulsuz proqram təminatının nüsxələrini yaymaq azadlığına sahib olun (və bunun üçün ödəniş edin

aldığınız azadlıqlar. Onların da qəbul etdiyinə əmin olmalısınız
istifadəçilərin qorunması" proqram təminatını dəyişmək azadlığı. Sistematik
istifadəçilərin azadlığını qorumaq üçün lazım olduqda GPL.
patentlər proqramı pulsuz göstərmək üçün istifadə edilə bilməz.

Matç təkrarlarının sayı

Uyğunluqların neçə dəfə təkrarlanacağını dəqiqləşdirməlisinizsə, əyri mötərizələrdən (“( )”) istifadə edə bilərsiniz. Bu simvollar ifadənin uyğunluqlarının sayının dəqiq sayını, diapazonunu və yuxarı və aşağı hədlərini göstərmək üçün istifadə olunur.

Üç saitdən ibarət olan bütün sətirləri tapmaq lazımdırsa, aşağıdakı ifadədən istifadə edə bilərsiniz:

grep -E "(3)" GPL-3
dəyişdirilmişdir ki, onların problemləri səhvən səbəb olmasın
əvvəlki versiyaların müəllifləri.
onu hər hansı bir vasitədə qəbul edin, bir şərtlə ki, nəzərə çarpan şəkildə və
əvvəlki paraqrafa uyğun olaraq, üstəlik sahiblik hüququ verir
bununla bağlı öhdəliklərinizi eyni vaxtda yerinə yetirmək üçün əhatə olunmuş işi
16-20 simvoldan ibarət bütün sözləri tapmaq lazımdırsa, aşağıdakı ifadədən istifadə edin:
grep -E "[[:alpha:]](16,20)" GPL-3
proqram təminatının nüsxələrini paylasanız və ya əgər müəyyən öhdəliklər
siz onu dəyişdirirsiniz: başqalarının azadlığına hörmət etmək öhdəlikləri.
c) Həmin materialın mənşəyinin təhrif edilməsinin qadağan edilməsi və ya

nəticələr

Bir çox hallarda grep əmri fayllar daxilində və ya iyerarxiyada nümunələri tapmaq üçün faydalıdır fayl sistemi. Bu, çox vaxta qənaət edir, ona görə də onun parametrləri və sintaksisi ilə tanış olmağa dəyər.

Daimi ifadələr daha çox yönlüdür və bir çox məşhur proqramlarda istifadə edilə bilər. Məsələn, çoxlu mətn redaktorları mətni axtarmaq və əvəz etmək üçün müntəzəm ifadələrdən istifadə edin.

Üstəlik, qabaqcıl proqramlaşdırma dilləri müəyyən verilənlər üzərində prosedurları yerinə yetirmək üçün müntəzəm ifadələrdən istifadə edir. Normal ifadələrlə işləməyi bilmək kompüterlə bağlı ümumi problemləri həll edərkən faydalı olur.

Etiketlər: ,

Fon və mənbə: Normal ifadələrdən istifadə etməli olan hər kəs onların necə işlədiyini və ya necə yaradılacağını tam başa düşmür. Mən də bu qrupa aid idim - tapşırıqlarıma uyğun olan daimi ifadələrdən nümunələr axtardım, lazım gəldikdə onları düzəltməyə çalışdım. Kitabı oxuyandan sonra mənim üçün hər şey kökündən dəyişdi. Linux Komanda Xətti (İkinci İnternet Nəşri) müəllif William E. Shotts, Jr. O, nizamlı ifadələrin necə işlədiyinə dair prinsipləri o qədər aydın şəkildə ortaya qoyur ki, oxuduqdan sonra mən onları başa düşməyi, istənilən mürəkkəblikdə müntəzəm ifadələr yaratmağı və indi lazım olduqda istifadə etməyi öyrəndim. Bu material fəslin nizamlı ifadələrə həsr olunmuş hissəsinin tərcüməsidir. Bu material müntəzəm ifadələrin necə işlədiyinə dair heç bir anlayışı olmayan, lakin müntəzəm ifadələrin necə işlədiyinə dair bir qədər anlayışı olan mütləq yeni başlayanlar üçün nəzərdə tutulub. Ümid edirəm ki, bu məqalə mənə kömək edən eyni irəliləyişi etməyə kömək edəcəkdir. Əgər burada təqdim olunan materialda sizin üçün yeni heç nə yoxdursa, “Adi ifadələr və grep əmri” məqaləsinə baxmağa çalışın, burada grep variantları daha ətraflı, eləcə də əlavə nümunələr təsvir olunur.

Normal ifadələr necə istifadə olunur?

Mətn məlumatları Linux kimi bütün Unix sistemlərində mühüm rol oynayır. Digər şeylər arasında mətn konsol proqramlarının, konfiqurasiya fayllarının, hesabatların və s. Adi ifadələr(bəlkə də) mətnlə işləməkdə ən çətin anlayışlardan biridir, çünki onlar yüksək səviyyədə abstraksiyanı əhatə edir. Lakin onları öyrənməyə sərf olunan vaxt öz bəhrəsini verməkdən daha çox olacaq. Normal ifadələrdən necə istifadə edəcəyinizi bilirsinizsə, heyrətamiz şeylər edə bilərsiniz, baxmayaraq ki, onların tam dəyəri dərhal aydın olmaya bilər.

Bu məqalə əmrlə birlikdə müntəzəm ifadələrin istifadəsinə baxacaq grep. Lakin onların istifadəsi bununla məhdudlaşmır: müntəzəm ifadələr başqaları tərəfindən dəstəklənir Linux əmrləri, bir çox proqramlaşdırma dilləri konfiqurasiyada istifadə olunur (məsələn, Apache-də mod_rewrite qayda parametrlərində) və bəzi GUI proqramları müntəzəm ifadələr dəstəyi ilə axtarış/kopyalama/silmə qaydalarını təyin etməyə imkan verir. Hətta məşhur Microsoft Word ofis proqramında mətni tapmaq və əvəz etmək üçün müntəzəm ifadələrdən və joker simvollardan istifadə edə bilərsiniz.

Normal ifadələr hansılardır?

Danışan sadə dildə, nizamlı ifadədir simvolu, mətndə axtarılan nümunənin simvolik qeydi. Daimi ifadələr bir çox əmr satırı alətləri və əksər proqramlaşdırma dilləri tərəfindən dəstəklənir və mətn manipulyasiya problemlərini həll etmək üçün istifadə olunur. Lakin, sanki onların mürəkkəbliyi bizim üçün kifayət deyil, bütün normal ifadələr bərabər yaradılmır. Onlar alətdən alətə və proqramlaşdırma dilindən dilə bir qədər dəyişir. Müzakirəmiz üçün bir qədər daha böyük və zəngin not dəstlərindən istifadə edən bir çox proqramlaşdırma dillərindən (əsasən Perl) fərqli olaraq, POSIX standartında təsvir olunan (əksər komanda xətti alətlərini əhatə edəcək) müntəzəm ifadələrlə məhdudlaşacağıq. .

grep

Normal ifadələr üçün istifadə edəcəyimiz əsas proqram köhnə dostumuzdur. "grep" adı əslində "qlobal müntəzəm ifadə çapı" ifadəsindən gəlir, ona görə də grep-in müntəzəm ifadələrlə əlaqəsi olduğunu görə bilərik. Əslində, grep mətn fayllarında müəyyən edilmiş normal ifadəyə uyğun gələn mətn üçün axtarış aparır və uyğunluğu ehtiva edən istənilən sətir standart çıxışa çap edir.

grep standart girişdə qəbul edilən mətni axtara bilər, məsələn:

ls /usr/bin | grep zip

Bu əmr /usr/bin qovluğunda adlarında "zip" alt sətri olan faylları siyahıya alacaq.

grep proqramı fayllarda mətn axtara bilir.

Ümumi istifadə sintaksisi:

Grep [seçimlər] regex [fayl...]

  • regex müntəzəm ifadədir.
  • [fayl…]- müntəzəm ifadədən istifadə edərək axtarılacaq bir və ya bir neçə fayl.

[seçimlər] və [fayl...] ​​çatışmayan ola bilər.

Ən çox istifadə edilən grep variantlarının siyahısı:

Seçim Təsvir
-i İşə məhəl qoyma. Böyük və kiçik simvollar arasında fərq qoymayın. Siz həmçinin seçimi təyin edə bilərsiniz --görməzlik halına.
-v Uyğunluğu Çevir. Normalda grep uyğunluğu ehtiva edən sətirləri çap edəcək. Bu seçim grep-in uyğunluğu olmayan hər sətri çap etməsinə səbəb olur. Siz də istifadə edə bilərsiniz --invert-match.
-c Uyğunluqların sayını (və ya seçim göstərilibsə, uyğunsuzluqları) çap edin -v) sətirlərin özləri yerinə. Siz həmçinin seçimi təyin edə bilərsiniz --saymaq.
-l Sətirlərin özləri əvəzinə uyğunluğu ehtiva edən hər bir faylın adını çap edin. Seçimlə müəyyən edilə bilər --uyğunluqlu-fayllar.
-L Bir seçim olaraq -l, lakin yalnız uyğunluqları olmayan fayl adlarını çap edir. Başqa bir seçim adı --fayllar-uyğunsuz.
-n Fayl daxilində hər uyğun gələn sətirin əvvəlinə sətir nömrəsinin əlavə edilməsi. Başqa bir seçim adı --sətir nömrəsi.
-h Çox faylları axtarmaq üçün fayl adının çıxışını sıxın. Siz həmçinin seçimi təyin edə bilərsiniz --fayl adı yoxdur.

Grep-i daha tam araşdırmaq üçün bəzilərini yaradaq mətn faylları Axtarış üçün:

Ls /bin > dirlist-bin.txt ls /usr/bin > dirlist-usr-bin.txt ls /sbin > dirlist-sbin.txt ls /usr/sbin > dirlist-usr-sbin.txt ls dirlist*.txt dirlist -bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Bu kimi fayllar siyahımızda sadə bir axtarış edə bilərik:

Grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover

Bu nümunədə grep bzip sətri üçün sadalanan bütün faylları axtarır və hər ikisi dirlist-bin.txt faylında iki uyğunluq tapır. Əgər bizi uyğun sətirlərin özləri deyil, yalnız uyğunluqları ehtiva edən faylların siyahısı maraqlandırırsa, biz seçimi təyin edə bilərik. -l:

Grep -l bzip dirlist*.txt dirlist-bin.txt

Əksinə, yalnız uyğunluqları olmayan faylların siyahısını görmək istəsək, bunu edə bilərik:

Grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Əgər çıxış yoxdursa, bu, şərtlərə cavab verən heç bir fayl tapılmaması deməkdir.

Metasimvollar və hərflər

Aydın görünməsə də, grep axtarışlarımız çox sadə olsa da, həmişə müntəzəm ifadələrdən istifadə edir. "bzip" müntəzəm ifadəsi o deməkdir ki, uyğunluq yalnız fayldakı sətir ən azı dörd simvoldan ibarət olduqda və "b", "z" simvolları sətirdə bir yerdə olduqda baş verəcək (yəni sətir uyğunluq hesab ediləcək) , "i" və "p" bu sıradadır, aralarında başqa simvol yoxdur. "Bzip" sətirindəki simvollar bunlardır hərfi, yəni. hərfi simvollar, çünki onlar özlərinə uyğundur. Hərflərlə yanaşı, müntəzəm ifadələr də daxil ola bilər metaxarakterlər, daha mürəkkəb uyğunluqları müəyyən etmək üçün istifadə olunur. Müntəzəm ifadə meta simvolları aşağıdakılardan ibarətdir:

^ $ . { } - ? * + () | \

Bütün digər simvollar literal hesab olunur. Əks kəsik işarəsi müxtəlif mənalara malik ola bilər. Yaratmaq üçün bir neçə halda istifadə olunur meta-ardıcıllıqlar, və həmçinin meta simvollardan qaçmağa və metasimvol kimi deyil, hərf kimi baxmağa imkan verir.

Qeyd: Gördüyümüz kimi, bir çox müntəzəm ifadə meta-simvolları da qabıq mənalı simvollardır (genişlənməni həyata keçirən). Komanda sətirinin metasimvollarını ehtiva edən müntəzəm ifadəni təyin edərkən, onun dırnaqlar içərisində olması vacibdir, əks halda qabıq onları öz yolu ilə şərh edəcək və əmrinizi pozacaq.

İstənilən xarakter

Tanışlığımıza başlayacağımız ilk metaxarakterdir nöqtə simvolu, yəni "hər hansı bir xarakter" deməkdir. Əgər onu müntəzəm ifadəyə daxil etsək, o zaman həmin simvol mövqeyi üçün istənilən simvola uyğun olacaq. Misal:

Grep -h ".zip" dirlist*.txt bunzip2 bzip2 bzip2recover gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Fayllarımızda ".zip" adi ifadəsinə uyğun gələn hər hansı bir sətir axtardıq. Nəticələrlə bağlı bir neçə maraqlı məqamı qeyd etmək lazımdır. Nəzərə alın ki, zip proqramı tapılmadı. Bunun səbəbi normal ifadəmizə nöqtə metaxarakterinin daxil edilməsi ilə əlaqədardır ki, uyğunluq üçün tələb olunan uzunluğu dörd simvola qədər artırdı və "zip" adı yalnız üç simvoldan ibarət olduğundan, uyğun gəlmir. Həmçinin, siyahılarımızdakı fayllardan hər hansı birində .zip fayl uzantısı varsa, onlar da uyğun hesab ediləcək, çünki fayl uzantısındakı nöqtə simvolu da "hər hansı simvol" şərtinə uyğundur.

Çapalar

işarə işarəsi ( ^ ) və dollar işarəsi ( $ ) nizamlı ifadələrdə nəzərə alınır lövbərlər. Bu o deməkdir ki, onlar yalnız nizamlı ifadə sətirin əvvəlində tapılarsa, uyğunluğa səbəb olurlar ( ^ ) və ya sətrin sonunda ( $ ):

Grep -h "^zip" dirlist*.txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit grep -h "zip$" dirlist*.txt gunzip gzip funzip gpg-zip mzip p7zip preunzip preunzip "-^direnzip preunzip" *.txt zip

Burada sətrin əvvəlində, sətrin sonunda, həmçinin həm əvvəlində, həm də sonunda (yəni bütün sətirdə) olacağı sətirdə yerləşən “zip” sətri üçün faylların siyahılarını axtardıq. yalnız "zip" olacaq). Qeyd edək ki, müntəzəm ifadə " ^$ " (başlanğıc və son arasında heç bir şey yoxdur) boş sətirlərə uyğun olacaq.

Qısa bir təxribat: krossvord köməkçisi

Məhdudiyyətimiz olsa belə Bu an Normal ifadələri bilməklə biz faydalı bir şey edə bilərik.

Əgər siz nə vaxtsa krossvordla məşğul olmusunuzsa, “beş hərfli söz nədir, burada üçüncü hərf “j” və sonuncu hərf “r” deməkdir...” kimi problemləri həll etməli olmusunuz. Bu sual sizi düşündürə bilər. Bunu bilirdinizmi Linux sistemi lüğətin var? Və odur. /usr/share/dict kataloquna baxın, orada bir və ya bir neçə lüğət tapa bilərsiniz. Orada yerləşdirilən lüğətlər sadəcə olaraq hər sətirdən ibarət uzun söz siyahılarıdır Əlifba sırası. Sistemimdə lüğət faylında 99171 söz var. Yuxarıdakı krossvord sualına mümkün cavabları axtarmaq üçün bunu edə bilərik:

Grep -i "^..j.r$" /usr/share/dict/amerikan-ingilis dili Major major

Bu müntəzəm ifadədən istifadə etməklə biz lüğət faylımızda beş hərfdən ibarət olan, üçüncü yerdə “j”, sonuncu mövqedə isə “r” hərfi olan bütün sözləri tapa bilərik.

Nümunədə ingilis dili lüğəti faylından istifadə edilmişdir, çünki o, standart olaraq sistemdə mövcuddur. Əvvəllər müvafiq lüğəti yüklədikdən sonra siz kiril əlifbası ilə yazılmış sözlərdən və ya hər hansı digər simvoldan istifadə edərək oxşar axtarışlar edə bilərsiniz.

Mötərizədə ifadələr və simvol sinifləri

Normal ifadəmizdə verilən mövqedə hər hansı simvolu uyğunlaşdırmaqla yanaşı, biz də istifadə edirik kvadrat mötərizədə ifadələr, biz müəyyən edilmiş simvol dəstindən bir simvola uyğunluq təyin edə bilərik. Mötərizə ifadələri ilə biz uyğunlaşmaq üçün simvollar dəstini təyin edə bilərik (o cümlədən metasimvol kimi şərh ediləcək simvollar da daxil olmaqla). Bu nümunədə iki simvol dəstindən istifadə etməklə:

Grep -h "zip" dirlist*.txt bzip2 bzip2recover gzip

"bzip" və ya "gzip" sətirlərini ehtiva edən hər hansı sətirləri tapacağıq.

Dəstə istənilən sayda simvol ola bilər və metasimvollar kvadrat mötərizədə yerləşdirildikdə xüsusi mənasını itirir. Bununla belə, kvadrat mötərizədə istifadə olunan meta simvolların fərqli mənalara malik olduğu iki hal var. Birincisi vaqondur ( ^ ), inkarı bildirmək üçün istifadə olunan; ikincisi tiredir ( - ), bir sıra simvolları təyin etmək üçün istifadə olunur.

İnkar

Kvadrat mötərizədəki ifadənin birinci simvolu karetdirsə ( ^ ), sonra qalan simvollar verilmiş simvol mövqeyində olmamalı olan simvollar toplusu kimi qəbul edilir. Əvvəlki nümunəmizi dəyişdirərək bunu edək:

Grep -h "[^bg]zip" dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

İnkaretmə aktiv olduqda, biz "b" və ya "g"-dən başqa hər hansı simvoldan əvvəl "zip" sətirindən ibarət faylların siyahısını alırıq. Nəzərə alın ki, zip tapılmadı. İnkar edilmiş simvol dəsti hələ də verilmiş mövqedə simvol tələb edir, lakin simvol rədd edilmiş simvollar dəstinin üzvü olmamalıdır.

Karet simvolu yalnız mötərizədə verilmiş ifadənin içərisindəki ilk simvol olduqda rədd edilir; əks halda, o, xüsusi təyinatını itirir və dəstdən müntəzəm simvola çevrilir.

Ənənəvi xarakter diapazonları

Siyahımızda böyük hərflə başlayan hər bir faylı tapa biləcək müntəzəm ifadə yaratmaq istəsək, aşağıdakıları edə bilərik:

Grep -h "^" dirlist*.txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

Məsələ burasındadır ki, biz 26 böyük hərfin hamısını kvadrat mötərizə daxilində ifadəyə qoyuruq. Ancaq hamısını çap etmək fikri həvəs yaratmır, buna görə də başqa bir yol var:

Grep -h "^" dirlist*.txt

Üç simvollu diapazondan istifadə edərək, 26 hərfli girişi qısalda bilərik. Siz hərflər və rəqəmlərlə başlayan bütün fayl adlarına uyğun gələn bu ifadə kimi birdən çox diapazon da daxil olmaqla istənilən simvol diapazonunu bu şəkildə ifadə edə bilərsiniz:

Grep -h "^" dirlist*.txt

Simvol diapazonlarında tire simvolunun xüsusi şəkildə işləndiyini görürük, buna görə də tire simvolunu kvadrat mötərizə içərisində ifadəyə necə daxil edə bilərik? İfadədə ilk simvol edərək. İki misala baxaq:

Grep -h "" dirlist*.txt

Bu, böyük hərfdən ibarət hər bir fayl adına uyğun olacaq. Burada:

Grep -h "[-AZ]" dirlist*.txt

tire və ya böyük "A" və ya böyük "Z" olan hər bir fayl adına uyğun olacaq.

Bugünkü məqalədə belə böyük bir mövzuya toxunmaq istəyirəm Adi ifadələr. Düşünürəm ki, hamı bilir ki, regexlər (müntəzəm ifadələr jarqonda adlandırılır) bir yazının əhatə dairəsində genişdir.

Başlayaq ki, müntəzəm ifadələrin bir neçə növü var:

1. Ənənəvi müntəzəm ifadələr(onlar da əsas, əsas və əsas müntəzəm ifadələr(BRE))

  • Bu ifadələrin sintaksisi köhnəlmiş kimi müəyyən edilir, lakin buna baxmayaraq, hələ də geniş yayılmışdır və bir çox UNIX utilitləri tərəfindən istifadə olunur.
  • Əsas müntəzəm ifadələrə aşağıdakı meta-simvollar daxildir (aşağıda onların mənaları haqqında daha ətraflı):
    • \( \) - ( ) üçün ilkin versiya (uzatılmış)
    • \(\) - () üçün ilkin versiya (uzatılmış)
    • \n, Harada n- 1-dən 9-a qədər rəqəm
  • Bu metaxarakterlərdən istifadənin xüsusiyyətləri:
    • Ulduz tək simvola uyğun gələn ifadəyə əməl etməlidir. Misal: *.
    • İfadə \( blok\)* səhv hesab edilməlidir. Bəzi hallarda o, sətrin sıfır və ya daha çox təkrarına uyğun gəlir blok. Digərlərində simlə uyğun gəlir blok* .
    • Xarakter sinfində xüsusi simvol mənaları əsasən nəzərə alınmır. Xüsusi hallar:
    • Dəstəyə ^ simvolu əlavə etmək üçün o, əvvəlcə orada yerləşdirilməməlidir.
    • Dəstəyə - simvolu əlavə etmək üçün o, orada birinci və ya sonuncu yerləşdirilməlidir. Misal üçün:
      • Hərflər, rəqəmlər, mənfi və nöqtələrdən ibarət DNS ad şablonu: [-0-9a-zA-Z.] ;
      • mənfi və rəqəmlərdən başqa istənilən simvol: [^-0-9] .
    • Dəstəyə [ və ya ] simvolu əlavə etmək üçün əvvəlcə o, ora yerləşdirilməlidir. Misal üçün:
      • uyğun gəlir ], [, a və ya b.

2. Təkmil Normal İfadələr(onlar uzadılmış müntəzəm ifadələr(ERE))

  • Bu ifadələrin sintaksisi əsas ifadələrin sintaksisinə bənzəyir, istisna olmaqla:
    • ( ) və () metasimvollar üçün tərs kəsişmələrin istifadəsi silindi.
    • Metaxarakterdən əvvəl əks kəsik onun xüsusi mənasını ləğv edir.
    • Nəzəri cəhətdən rədd edildi nizamsız dizayn\ n .
    • Əlavə edilmiş metasimvollar + , ? , | .

3. Perl ilə uyğun gələn müntəzəm ifadələr(onlar Perl uyğun normal ifadələr(PCRE))

  • hətta POSIX ERE-dən daha zəngin və eyni zamanda proqnozlaşdırıla bilən sintaksisə malikdir, buna görə də onlar tez-tez proqramlar tərəfindən istifadə olunur.

Adi ifadələr ibarət olmaqşablonlar, daha doğrusu şablon təyin edin axtarış. Şablon ibarətdir-dən Qaydalar ibarət olan axtarışlar personajlarmetaxarakterlər.

Axtarış qaydaları aşağıdakılarla müəyyən edilir əməliyyatlar:

Sadalama |

Boru (|) etibarlı variantları ayırır, biri deyə bilər - məntiqi OR. Məsələn, "boz|boz" uyğun gəlir Boz və ya Boz.

Qrup və ya birlik()

Dairəvi mötərizələr operatorların əhatə dairəsini və üstünlüyünü müəyyən etmək üçün istifadə olunur. Məsələn, "boz|boz" və "gr(a|e)y" fərqli naxışlardır, lakin onların hər ikisi dəsti təsvir edir. BozBoz.

Quantify()? * +

Kəmiyyət göstəricisi bir xarakter və ya qrupdan sonra neçə dəfə təyin edir qabaqcıl ifadəsi baş verə bilər.

ümumi ifadə, təkrarlar ola bilər m-dən n daxil olmaqla.

ümumi ifadə m və ya daha çox təkrar.

ümumi ifadə n təkrardan çox deyil.

hamarn təkrar.

Sual işarəsi deməkdir 0 və ya 1 dəfələrlə eynidir {0,1} . Məsələn, "colou?r" uyğun gəlir və rəng, Və rəng.

Ulduz deməkdir 0, 1 və ya hər hansı bir rəqəm bir dəfə ( {0,} ). Məsələn, "go*gle" uyğun gəlir gülmək, Google, Google və s.

Üstəlik deməkdir ən azı 1 bir dəfə ( {1,} ). Məsələn, "go+gle" uyğun gəlir Google, Google və s. (lakin yox gülmək).

Bu müntəzəm ifadələrin dəqiq sintaksisi icradan asılıdır. (yəni in əsas müntəzəm ifadələr simvollar ( Və )- əks kəsiklə qaçdı)

Meta personajlar, sadə dillə desək, həqiqi mənasına uyğun gəlməyən simvollar, yəni simvoldur. (nöqtə) nöqtə deyil, hər hansı bir simvol və s. Zəhmət olmasa meta simvollar və onların mənaları ilə tanış olun:

. uyğun gəlir tək hər hansı bir simvol
[bir şey] Uyğun istənilən tək mötərizə içərisində olanlardan xarakter. Bu halda: “-” simvolu yalnız açılışdan dərhal sonra və ya bağlanan mötərizədən əvvəl yerləşərsə, hərfi mənada şərh olunur: və ya [-abc]. Əks halda, o, simvol intervalını ifadə edir, məsələn, "a", "b" və ya "c" ilə uyğun gəlir. Latın əlifbasının kiçik hərflərinə uyğundur. Bu təyinatlar birləşdirilə bilər: a, b, c, q, r, s, t, u, v, w, x, y, z, “[” və ya “]” simvollarını uyğunlaşdırmaq üçün kifayətdir bağlama mötərizəsi açılış simvolundan sonrakı ilk simvol idi: "]", "[", "a" və ya "b" ilə uyğun gəlirsə, kvadrat mötərizədəki dəyər ^ simvolundan əvvəldirsə, ifadənin dəyəri uyğun gəlir tək xarakter bunların arasından mötərizədə olmayan. Məsələn, [^abc] "a", "b" və ya "c"dən başqa istənilən simvola uyğun gəlir. [^a-z] Latın əlifbasında kiçik hərflərdən başqa istənilən simvola uyğun gəlir.
^ Mətnin əvvəlinə (və ya rejim sətir-sətirdirsə, hər hansı sətrin əvvəlinə) uyğun gəlir.
$ Mətnin sonuna (və ya rejim sətir-sətirdirsə, istənilən sətrin sonuna) uyğun gəlir.
\(\) və ya () Daha sonra istifadə edilə bilən "işarələnmiş alt ifadə" (qruplaşdırılmış ifadə) elan edir (aşağıdakı elementə baxın: \ n). "İşarələnmiş alt ifadə" də "blok"dur. Digər operatorlardan fərqli olaraq, bu (ənənəvi sintaksisdə) genişləndirilmiş və Perl-də tərs xətt tələb edir, \ simvoluna ehtiyac yoxdur;
\n Harada n 1-dən 9-a qədər rəqəmdir; uyğun gəlir n işarələnmiş alt ifadə (məsələn (abcd)\0, yəni abcd simvolları sıfırla qeyd olunur). Bu dizayn nəzəri cəhətdəndir nizamsız, genişləndirilmiş müntəzəm ifadə sintaksisində qəbul edilmədi.
*
  • Ulduz bir simvola uyğun gələn ifadədən sonra uyğunlaşır sıfır və ya daha çox nüsxələri bu (əvvəlki) ifadə. Məsələn, "*" boş sətirə uyğun gəlir, "x", "y", "zx", "zyx" və s.
  • \n*, Harada n 1-dən 9-a qədər olan rəqəmdir, uyğun olmaq üçün sıfır və ya daha çox rast gəlinir n ci işarələnmiş alt ifadə. Məsələn, "\(a.\)c\1*" "abcab" və "abcaba"ya uyğun gəlir, lakin "abcac" deyil.

"\(" və "\)" və ardınca "*" işarəsi olan ifadə qeyri-qanuni hesab edilməlidir. Bəzi hallarda, mötərizə içərisində olan sətirin sıfır və ya daha çox təkrarlanmasına uyğun gəlir. Digərlərində, "*" simvolu nəzərə alınmaqla, mötərizədə verilmiş ifadəyə uyğun gəlir.

\{x,y\} Sonuncuya uyğundur ( qarşıdan gələn) ən azı meydana gələn blok x və daha çox y bir dəfə. Məsələn, "a\(3,5\)" "aaa", "aaaa" və ya "aaaaa" ilə uyğun gəlir. Digər operatorlardan fərqli olaraq, bu operator (ənənəvi sintaksisdə) əks xətt tələb edir.
.* Normal ifadənin iki hissəsi arasında istənilən simvolun istənilən sayda təyin edilməsi.

Metaxarakterlər müxtəlif uyğunluqlardan istifadə etməyimizə kömək edir. Bəs biz metaxarakteri normal xarakterli, yəni simvolu [ (kvadrat mötərizə) mənası ilə necə təmsil edə bilərik? kvadrat mötərizə? Sadəcə:

  • əvvəl olmalıdır ( qalxan) metaxarakter (. * + \ ? ( )) tərs xətt. Misal üçün \. və ya \[

Bəzi simvol dəstlərinin tərifini asanlaşdırmaq üçün onlar sözdə birləşdirildi. xarakterlərin sinifləri və kateqoriyaları. POSIX aşağıdakı cədvəldə göstərildiyi kimi müəyyən xarakter sinifləri və kateqoriyalarının bəyannaməsini standartlaşdırmışdır:

POSIX sinfi oxşar təyinat
[:yuxarı:] böyük hərflər
[:aşağı:] kiçik hərflər
[:alfa:] böyük və kiçik hərflər
[:alnum:] rəqəmlər, böyük və kiçik hərflər
[:rəqəm:] nömrələri
[:xdigit:] onaltılıq rəqəmlər
[:punkt:] [.,!?:…] durğu işarələri
[:boş:] [\t] boşluq və TAB
[:boşluq:] [\t\n\r\f\v] simvolları atlayın
[:cntrl:] nəzarət simvolları
[:graph:] [^\t\n\r\f\v] möhür simvolları
[:print:] [^\t\n\r\f\v] simvolları möhürləyin və simvolları keçin

Regex-də belə bir şey var:

Acgözlük regex

Bunu mümkün qədər aydın təsvir etməyə çalışacağam. Deyək ki, biz hər şeyi tapmaq istəyirik HTML teqləri bəzi mətndə. Problemi lokallaşdıraraq, aralarındakı dəyərləri tapmaq istəyirik< и >, eyni mötərizələrlə birlikdə. Amma biz bilirik ki, teqlər müxtəlif uzunluqlara malikdir və ən azı 50 teq var. Onların hamısını siyahıya almaq, onları metasimvollara əlavə etmək çox vaxt aparan bir işdir. Lakin biz bilirik ki, bizdə bir ifadə var.* (nöqtə ulduzu), sətirdəki istənilən simvolun istənilən sayını xarakterizə edir. Bu ifadədən istifadə edərək mətndə tapmağa çalışacağıq (

Belə ki, RAID 10/50 səviyyəsini necə yaratmaq olar LSI nəzarətçi MegaRAID (həmçinin uyğundur: Intel SRCU42x, Intel SRCS16):

) arasındakı bütün dəyərlər< и >. Nəticədə BÜTÜN sətir bu ifadəyə uyğun olacaq. niyə, çünki regex GREEDY və aralarındakı HƏR BÜTÜN simvolları tutmağa çalışır< и >, müvafiq olaraq bütün xətt, başlanğıc < p>Beləliklə... və sona çatır ...> bu qaydaya aid olacaq!

Ümid edirəm ki, bu nümunə xəsisliyin nə olduğunu aydınlaşdırır. Bu xəsislikdən xilas olmaq üçün aşağıdakı yolu izləyə bilərsiniz:

  • simvolları nəzərə alın yox istədiyiniz nümunəyə uyğundur (məsələn:<[^>]*> yuxarıdakı hal üçün)
  • kəmiyyət ifadəsinə acgöz olmayan kimi tərif əlavə etməklə xəsislikdən qurtulun:
    • *? - "acgöz deyil" ("tənbəl") ekvivalenti *
    • +? - “acgöz deyil” (“tənbəl”) ekvivalenti +
    • (n,)? - “acgöz deyil” (“tənbəl”) ekvivalenti (n,)
    • .*? - “acgöz deyil” (“tənbəl”) ekvivalenti.*

Yuxarıdakıların hamısına əlavə etmək istərdim uzadılmış müntəzəm ifadə sintaksisi:

POSIX-də müntəzəm ifadələr ənənəvi Unix sintaksisinə bənzəyir, lakin bəzi metasimvolların əlavə edilməsi ilə:

Üstəlik olduğunu göstərir əvvəlki simvolu və ya qrup təkrarlana bilər bir və ya bir neçə dəfə. Ulduz işarəsindən fərqli olaraq, ən azı bir təkrar tələb olunur.

Sual işarəsi edir əvvəlki simvol və ya qrup isteğe bağlıdır. Başqa sözlə, müvafiq sətirdə olmaya və ya mövcud ola bilər hamar bir bir dəfə.

Şaquli bar müntəzəm ifadə alternativlərini ayırır. Bir simvol iki alternativ müəyyən edir, lakin onlardan daha çox ola bilər, sadəcə daha çox şaquli çubuqlardan istifadə edin. Bu operatorun ifadədən mümkün qədər çox istifadə etdiyini xatırlamaq vacibdir. Bu səbəbdən alternativ operator ən çox mötərizə içərisində istifadə olunur.

Əks kəsiklərin istifadəsi də ləğv edilib: \(…\) (…) olur və \(…\) (…) olur.

Yazıya yekun vurmaq üçün regexdən istifadəyə dair bəzi nümunələr verəcəyəm:

$ pişik mətn1 1 alma 2 armud 3 banan $ grep p mətn1 1 alma 2 armud $ grep noxud mətn1 2 armud $ grep "p*" mətn1 1 alma 2 armud 3 banan $ grep "pp*" mətn1 1 alma 2 armud $ grep " x" mətn1 $ grep "x*" mətn1 1 alma 2 armud 3 banan $ pişik mətn1 | grep "l\|n" 1 alma 3 banan $ echo -e "burada bir\n* tap" | grep "\*" * burada $ grep "pp\+" mətn1 # bir p və 1 və ya daha çox p ehtiva edən sətir 1 alma $ grep "pl\?e" mətn1 1 alma 2 armud $ grep "pl\?e" mətn1 # mümkün simvolu olan pe l 1 alma 2 armud $ grep "p.*r" text1 # p, r 2 armud olan sətirlərdə $ grep "a.." text1 # ən azı 2 simvoldan ibarət sətirlər 1 alma 3 banan $ grep "\(an\)\+" text1 # Daha çox təkrar axtarın və 3 banan $ grep "an\(an\)\+" text1 # 2 təkrar axtarın və 3 banana $ grep "" text1 # axtarış sətirləri 3 və ya p olan yerdə 1 alma 2 armud 3 banan $ echo -e "burada\n\n* tapın." | grep "[.*]" * burada bir yerdə. $ # 3-dən 7-dək simvolları axtarır $ echo -e "123\n456\n789\n0" | grep "" 123 456 789 $ # Biz $ sətrin sonundan əvvəl n və r hərfləri olmayan rəqəm axtarırıq grep "[[:digit:]][^nr]*$" text1 1 apple $ sed -e "/\(a .*a\)\|\(s.*p\)/s/a/A/g" text1 # a-nın a və ya p-dən sonra gəldiyi bütün sətirlərdə a-nın A ilə əvəzlənməsi r 1 Alma 2 armud 3 bAnAnA $ sed -e "/^[^lmnXYZ]*$/s/ear/each/g" text1 # qulağı lmnXYZ ilə başlamayan sətirlərlə əvəz edin 1 alma 2 şaftalı 3 banan $ echo " Birincisi, bu bir cümlədir." |\ # cümlədəki son sözü SON DÜNYA ilə əvəz etmək. > sed -e "s/ [^ ]*\./ SON SÖZ./g" Birinci. SON SÖZ. Bu SON SÖZDÜR.


Kateqoriyalar