Gentoo негізін салушыдан Linux-тың негіздері сабақтары. 2-бөлім (1/5): Регулярлық формулалар

Бұл мақала аударма, түпнұсқасы мына жерде орналасқан.


Алғы сөз


Осы оқулық жайлы

"Әкімшілендіру ежелеріне" қош келіпсіздер. Бұл Linux Professional Institute-дағы 101 емтиханына дайындалуға жазылған төрт нұсқаулықтың екіншісі. Бұл бөлімде біз регулярлық формулаларды пайдалану арқылы файлдан мәтіндерді үлгі бойынша табуды қарастырамыз. Содан соң, сіз «Файлдық жүйе құрылымы стандартымен» (Filesystem Hierarchy Standard н-се қысқ. FHS) танысасыз, және де біз жүйеңіздегі файлдарды қалай табуға болатындығын көрсетеміз. Кейін, Linux-тағы процесстерді қалай толық бақылауға алуды үйренесіз: оларды фондық режимге жіберу, процесстердің тізімін қарау және т.б. Одан соң, конвейерлер, бағыттаулар және тексттерді өңдеу командаларына қысқаша шолу жасалады. Және соңғысы, біз сіздерді Linux ядросының модульдерімен таныстырамыз.

Шынында, оқулықтың бұл бөлімі (2-бөлім) bash-тың негіздерін үйренген және Linux жүйесін әкімшілендірудегі негізгі жұмыстарға сапалы бастама алғысы келгендерге арналған. Егер Linux-пен жаңа танысқан болсаңыз оқулықтың бірінші бөлімін аяқтауды кеңес береміз.

Регулярлы формулалар


«Регулярлы формулалар» дегеніміз не?

Регулярлы формулалар (ағыл-ша. regular expression) — бұл тексттік үлгілерді сипаттаудың ерекше бір синтаксисі. Linux жүйелерінде регулярлы формулалар текстте үлгі бойынша іздеуде кеңінен қолданылады. Сонымен қатар, тексттік ағымдарда іздеу және ауыстыру операциялары үшін пайдаланылады.

Globing-пен салыстырғанда

Біз регулярлы формулаларды қарастыруды бастағаннан-ақ, сіз оның синтаксисі globbing-тің синтаксисіне өте ұқсас екенін байқауыңыз мүмкін. Бірақ, бұл ұқсастықтар үстіртін ғана. Регулярлы формулалар және globbing бір-біріне өте ұқсас болып тұрса да, олар түбінен екі түрлі нәрселер.

Қатардың ішіндегі мәтіндерді іздеу

Қатардың ішіндегі мәтіндерді іздейтін ең қарапайым регулярлы формуланы қарастырайық. Ол үшін біз «grep» командасын пайдаланамыз. Бұл команда файл ішіндегі қатарларды регулярлы формулаға сәйкестікке тексереді, регулярлы формулаға сәйкес келетін әрбір қатарды консольға шығарады:

$ grep bash /etc/passwd
operator:x:11:0:operator:/root:/bin/bash
root:x:0:0::/root:/bin/bash
ftp:x:40:1::/home/ftp:/bin/bash

Жоғарыдағы мысалда, grep-ке берілген бірінші параметр ол regex; ал екіншісі — файл аты. grep /etc/passwd файлынан әрбір қатарды оқиды және әрқайсысының ішінде «bash» деген сөз кездесетіндігін тексереді. Сөз қатарда бар болған жағдайда grep сол қатарды шығарады, керісінше жағдайда, қатар шығарылмайды.

Қатардың ішіндегі мәтіндерді іздеу ерекшелігі

Жалпы жағдайда, егер сіз қарапайым қатар ішіндегі мәтінді іздеп жатқан болсаңыз, ол мәтінді ешқандай арнайы символдарды қолданбай ақ әріппе-әріп көрсетуіңізге болады. Ерекше жағдай ізделініп жатқан мәтінде +, ., *, [, ] немесе \ символдарын пайдалану керек болғанда туындайды. Сіз оларды пайдаланғанда бұл символдарды кері слэш арқылы қалқалауыңызға (орысш. экранирование) тура келеді. Қатар ішіндегі мәтіндерді іздейтін қарапайым регулярлы формулалардың бірнеше мысалдары:
  • /tmp (поиск строки /tmp)
  • "\[box\]" (поиск строки [box])
  • "\*funny\*" (поиск строки *funny*)
  • «ld\.so» (поиск строки ld.so)

Метасимволдар

Регулярлы формулаларда метасимволдарды пайдалану арқылы, жоғарыда қарастырылған мысалдардан гөрі күрделірек іздеу жасауға болады. Осындай метасимволдардың бірі кез-келген бір символмен сәйкес келетін "." (нүкте):

$ grep dev.sda /etc/fstab
/dev/sda3       /               reiserfs        noatime,ro 1 1
/dev/sda1       /boot           reiserfs        noauto,noatime,notail 1 2
/dev/sda2       swap            swap            sw 0 0
#/dev/sda4      /mnt/extra      reiserfs        noatime,rw 1 1

Мысалда көріп тұрғанымыздай «dev.sda» сөзімен тура сәйкес келетін қатар жоқ. Бірақ, grep бұл жолы файлда dev.sda қатарын әріппе-әріп емес, үлгі бойынша іздеді. Есте сақтаңыз, "." кез-келген бір символға сәйкес келеді. Байқағаныңыздай, "." метасимволы glob-қойылымдарындағы "?" белгісіне ұқсас жұмыс жасайды.

[] қолдану

Егер біз болуы керек символдарды нақтырақ көрсеткіміз келсе тік жақшаларды пайдаланамыз ([]). Ол "." секілді кез-келген символға емес, жақша ішіндегі көрсетілген символдарға ғана сәйкес келеді:

$ grep dev.sda[12] /etc/fstab
/dev/sda1       /boot           reiserfs        noauto,noatime,notail 1 2
/dev/sda2       swap            swap            sw 0 0

Бұл символдар glob-қойылымдағы тік жақшалар қандай қызмет атқарса, тура сондай қызмет атқарады. Сонда да, осында регулярлы формулаларды үйренуде қиындық пайда болады: glob-қойылымдармен синтаксис ұқсас, бірақ бірдей емес, бұл қатты жаңылыстырады.

[^] қолдану

Сіз квадраттық жақшалар ішіндегі мәндерді ^ символын [ символынан соң қою арқылы жоққа шығара аласыз. Ондай жағдайда, тік жақша — ішінде көрсетілгеннен символдардан БАСҚА кез-келген символдарға сәйкес келеді. Тағы да, [^] және glob-тағы [!] формулаларының эквивалент екенін байқаңыз:

$ grep dev.hda[^12] /etc/fstab
/dev/hda3       /               reiserfs        noatime,ro 1 1
#/dev/hda4      /mnt/extra      reiserfs        noatime,rw 1 1


Ерекше синтаксис

Келесі жағдайды айта кеткен маңызды, тік жақшалардың ішіндегі синтаксис регулярлы формуланың басқа жерлердегі синтаксисінен мүлдем ерекшеленеді. Мысалыға, тік жақшалар ішіндегі "." символы тек нүкте (".") символымен сәйкес келеді, жоғарыдағы мысалдағы «1» және «2» секілді. Енді, егер біз "." символын тік жақшадан бөлек жерде пайдалансақ, ол кез-келген символмен сәйкес келеді, әрине, егер тек нүкте алдынан "\" символын қоймасақ. Бұл ерекшеліктерді өз пайдамызға пайдалана аламыз. Мысалыға, /etc/fstab файлынан dev.sda қатарын таба аламыз:

$ grep dev[.]sda /etc/fstab

Біз оны былай да таба алатын едік:

$ grep "dev\.sda" /etc/fstab


* метасимволы

Кейбір метасимволдар өздігінен ешқандай символға сәйкес келмейді, бірақ өзінен алдын тұрған символдың мағынасын өзгертеді. Осындай символдардың бірі, ол * (жұлдызша). Бұл символ өзінен алдынғы тұрған символдың ноль немесе одан көп рет қаталануына сәйкес келеді. Байқаңыздар, бұл символдың глоббингта пайдаланылуы мен регулярлық формулалардағы пайдаланылуы екі түрлі. Міне бірнеше мысалдар, регулярлы формула мен globbing-тардың сәйкес келмейтін жерлеріне ерекше мән беріңіздер:
  • ab*c үлгісі «abbbbc» қатарына сәйкес келеді, бірақ «abqc» қатарына сәйкес келмейді
  • ab*c үлгісі «abc» қатарына сәйкес келеді, бірақ «abbqbbc» қатарына сәйкес келмейді
  • ab*c үлгісі «ac» қатарына сәйкес келеді, бірақ «cbs» қатарына сәйкес келмейді
  • b[cq]*e үлгісі «bqe» және «be» қатарына сәйкес келеді (glob-қойылымда «bqe»-ге сәйкес келеді, бірақ «be»-ге сәйкес келмейді)
  • b[cq]*e үлгісі «bqqcce»қатарына сәйкес келеді, бірақ «bccc»-қа емес (glob-қойылымда «bccqqe»-ге сәйкес келеді, бірақ «bccc»-ге сәйкес келмейді)
  • b[cq]*e үлгісі «bccqqe»қатарына сәйкес келеді, бірақ «cqe»-қа емес
  • b[cq]*e үлгісі «bbbeee»қатарына сәйкес келеді (егер глоб болса сәйкес келмейді)
  • .* үлгісі кез келген қатармен сәйкес келеді (glob-қойылымда "." символынан басталатын қатарларға сәйкес келеді)
  • foo.* үлгісі «foo» символдарынан басталатын кез-келген қатармен сәйкес келеді (glob-қойылымда «foo.» төрт символдарынан басталатын қатарларға сәйкес келеді)
Сонымен, тағы бір рет қайталаймыз: «ac» қатары «ab*c» регулярлы формуласына сәйкес келеді, өйткені жұлдызша алдыңғы тұрған символдың (b) ноль рет қайталануына сәйкес келеді.

Қатардың басы және соңы

Біздің соңғы қарастыратын метасимволдарымыз: ^ және $. Олар сәйкесінше қатардың басын және соңын көрсету үшін пайдаланылады. Өзіңіздің regex-іңіздің алдына ^ символын қою арқылы, үлгіңізді қатар басына бекітесіз. Келесі мысалда біз кез-келген # символынан басталатын қатарға сәйкес келетін ^# регулярлы формуласын пайдаланамыз:

$ grep ^# /etc/fstab
# /etc/fstab: static file system information.
#


Толық қатарлы регулярлы формулалар

^ және $ метасимволдарын, толық қатармен сәйкестікті іздеу үшін пайдалануға болады. Мысалы, төменде көрсетілген regex # символынан басталатын және "." символымен аяқталатын қатарларға сәйкес келеді:

$ grep '^#.*\.$' /etc/fstab
# /etc/fstab: static file system information.

Жоғарыда біз қабықша $ символын өңдемеуі үшін регулярлы формуланы бірлік жақшаларға алдық. Бірлік жақшаларсыз $ символы grep командасына жетпей қабықша арқылы өңделіп кетеді.

Аудармашыдан

Регулярлы формулалар (regex) күрделі тақырып. Егер сіз алдын оның не екенін білмесеңіз бұл бөлімшені түсіну қиын болады. Сондықтан оларды үйренуді басқа жерден бастаған дұрыс. Мұнда негізінен жалпылама және қысқаша мәліметтер келтірілген.

  • +1
4 пікір
raimbek
Аудару барысында көп түсініксіз жайлар болды, мысалы, орысша «регулярное выражение» деген сөзді қазақшаға дұрыс қалай аударуды білмедім, сондықтан «регулярлы формула» деп аудардым. Дұрыстау нұсқасын көрсетесіздер деген үміттемін.

Мақаланы екінші әрекеттен соң зорға жарияладым ((, мына зомби мақаланы жоя салу керек.
kamyrov
Зомбиді өшіріп тастадым)
anonym
«регулярлы формула» деп аудардым
Математикадан алдың ба? Негізі регулярное выражение дегенге келіңкіремейтін сықылды, аудармасын тапсам жазам
raimbek
«алгебраическое выражение → алгебралық формула», осыдан соң ғой
Тек тіркелген қолданушылар ғана пікір қалдыра алады.