Gentoo негізін салушыдан Linux-тың негіздері сабақтары. 2-бөлім (1/5): Регулярлық формулалар
Бұл мақала аударма, түпнұсқасы мына жерде орналасқан.
"Әкімшілендіру ежелеріне" қош келіпсіздер. Бұл Linux Professional Institute-дағы 101 емтиханына дайындалуға жазылған төрт нұсқаулықтың екіншісі. Бұл бөлімде біз регулярлық формулаларды пайдалану арқылы файлдан мәтіндерді үлгі бойынша табуды қарастырамыз. Содан соң, сіз «Файлдық жүйе құрылымы стандартымен» (Filesystem Hierarchy Standard н-се қысқ. FHS) танысасыз, және де біз жүйеңіздегі файлдарды қалай табуға болатындығын көрсетеміз. Кейін, Linux-тағы процесстерді қалай толық бақылауға алуды үйренесіз: оларды фондық режимге жіберу, процесстердің тізімін қарау және т.б. Одан соң, конвейерлер, бағыттаулар және тексттерді өңдеу командаларына қысқаша шолу жасалады. Және соңғысы, біз сіздерді Linux ядросының модульдерімен таныстырамыз.
Шынында, оқулықтың бұл бөлімі (2-бөлім) bash-тың негіздерін үйренген және Linux жүйесін әкімшілендірудегі негізгі жұмыстарға сапалы бастама алғысы келгендерге арналған. Егер Linux-пен жаңа танысқан болсаңыз оқулықтың бірінші бөлімін аяқтауды кеңес береміз.
Регулярлы формулалар (ағыл-ша. regular expression) — бұл тексттік үлгілерді сипаттаудың ерекше бір синтаксисі. Linux жүйелерінде регулярлы формулалар текстте үлгі бойынша іздеуде кеңінен қолданылады. Сонымен қатар, тексттік ағымдарда іздеу және ауыстыру операциялары үшін пайдаланылады.
Біз регулярлы формулаларды қарастыруды бастағаннан-ақ, сіз оның синтаксисі globbing-тің синтаксисіне өте ұқсас екенін байқауыңыз мүмкін. Бірақ, бұл ұқсастықтар үстіртін ғана. Регулярлы формулалар және globbing бір-біріне өте ұқсас болып тұрса да, олар түбінен екі түрлі нәрселер.
Қатардың ішіндегі мәтіндерді іздейтін ең қарапайым регулярлы формуланы қарастырайық. Ол үшін біз «grep» командасын пайдаланамыз. Бұл команда файл ішіндегі қатарларды регулярлы формулаға сәйкестікке тексереді, регулярлы формулаға сәйкес келетін әрбір қатарды консольға шығарады:
Жоғарыдағы мысалда, grep-ке берілген бірінші параметр ол regex; ал екіншісі — файл аты. grep /etc/passwd файлынан әрбір қатарды оқиды және әрқайсысының ішінде «bash» деген сөз кездесетіндігін тексереді. Сөз қатарда бар болған жағдайда grep сол қатарды шығарады, керісінше жағдайда, қатар шығарылмайды.
Жалпы жағдайда, егер сіз қарапайым қатар ішіндегі мәтінді іздеп жатқан болсаңыз, ол мәтінді ешқандай арнайы символдарды қолданбай ақ әріппе-әріп көрсетуіңізге болады. Ерекше жағдай ізделініп жатқан мәтінде +, ., *, [, ] немесе \ символдарын пайдалану керек болғанда туындайды. Сіз оларды пайдаланғанда бұл символдарды кері слэш арқылы қалқалауыңызға (орысш. экранирование) тура келеді. Қатар ішіндегі мәтіндерді іздейтін қарапайым регулярлы формулалардың бірнеше мысалдары:
Регулярлы формулаларда метасимволдарды пайдалану арқылы, жоғарыда қарастырылған мысалдардан гөрі күрделірек іздеу жасауға болады. Осындай метасимволдардың бірі кез-келген бір символмен сәйкес келетін "." (нүкте):
Мысалда көріп тұрғанымыздай «dev.sda» сөзімен тура сәйкес келетін қатар жоқ. Бірақ, grep бұл жолы файлда dev.sda қатарын әріппе-әріп емес, үлгі бойынша іздеді. Есте сақтаңыз, "." кез-келген бір символға сәйкес келеді. Байқағаныңыздай, "." метасимволы glob-қойылымдарындағы "?" белгісіне ұқсас жұмыс жасайды.
Егер біз болуы керек символдарды нақтырақ көрсеткіміз келсе тік жақшаларды пайдаланамыз ([]). Ол "." секілді кез-келген символға емес, жақша ішіндегі көрсетілген символдарға ғана сәйкес келеді:
Бұл символдар glob-қойылымдағы тік жақшалар қандай қызмет атқарса, тура сондай қызмет атқарады. Сонда да, осында регулярлы формулаларды үйренуде қиындық пайда болады: glob-қойылымдармен синтаксис ұқсас, бірақ бірдей емес, бұл қатты жаңылыстырады.
Сіз квадраттық жақшалар ішіндегі мәндерді ^ символын [ символынан соң қою арқылы жоққа шығара аласыз. Ондай жағдайда, тік жақша — ішінде көрсетілгеннен символдардан БАСҚА кез-келген символдарға сәйкес келеді. Тағы да, [^] және glob-тағы [!] формулаларының эквивалент екенін байқаңыз:
Келесі жағдайды айта кеткен маңызды, тік жақшалардың ішіндегі синтаксис регулярлы формуланың басқа жерлердегі синтаксисінен мүлдем ерекшеленеді. Мысалыға, тік жақшалар ішіндегі "." символы тек нүкте (".") символымен сәйкес келеді, жоғарыдағы мысалдағы «1» және «2» секілді. Енді, егер біз "." символын тік жақшадан бөлек жерде пайдалансақ, ол кез-келген символмен сәйкес келеді, әрине, егер тек нүкте алдынан "\" символын қоймасақ. Бұл ерекшеліктерді өз пайдамызға пайдалана аламыз. Мысалыға, /etc/fstab файлынан dev.sda қатарын таба аламыз:
Біз оны былай да таба алатын едік:
Кейбір метасимволдар өздігінен ешқандай символға сәйкес келмейді, бірақ өзінен алдын тұрған символдың мағынасын өзгертеді. Осындай символдардың бірі, ол * (жұлдызша). Бұл символ өзінен алдынғы тұрған символдың ноль немесе одан көп рет қаталануына сәйкес келеді. Байқаңыздар, бұл символдың глоббингта пайдаланылуы мен регулярлық формулалардағы пайдаланылуы екі түрлі. Міне бірнеше мысалдар, регулярлы формула мен globbing-тардың сәйкес келмейтін жерлеріне ерекше мән беріңіздер:
Біздің соңғы қарастыратын метасимволдарымыз: ^ және $. Олар сәйкесінше қатардың басын және соңын көрсету үшін пайдаланылады. Өзіңіздің regex-іңіздің алдына ^ символын қою арқылы, үлгіңізді қатар басына бекітесіз. Келесі мысалда біз кез-келген # символынан басталатын қатарға сәйкес келетін ^# регулярлы формуласын пайдаланамыз:
^ және $ метасимволдарын, толық қатармен сәйкестікті іздеу үшін пайдалануға болады. Мысалы, төменде көрсетілген regex # символынан басталатын және "." символымен аяқталатын қатарларға сәйкес келеді:
Жоғарыда біз қабықша $ символын өңдемеуі үшін регулярлы формуланы бірлік жақшаларға алдық. Бірлік жақшаларсыз $ символы grep командасына жетпей қабықша арқылы өңделіп кетеді.
Регулярлы формулалар (regex) күрделі тақырып. Егер сіз алдын оның не екенін білмесеңіз бұл бөлімшені түсіну қиын болады. Сондықтан оларды үйренуді басқа жерден бастаған дұрыс. Мұнда негізінен жалпылама және қысқаша мәліметтер келтірілген.
Алғы сөз
Осы оқулық жайлы
"Әкімшілендіру ежелеріне" қош келіпсіздер. Бұл 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.» төрт символдарынан басталатын қатарларға сәйкес келеді)
Қатардың басы және соңы
Біздің соңғы қарастыратын метасимволдарымыз: ^ және $. Олар сәйкесінше қатардың басын және соңын көрсету үшін пайдаланылады. Өзіңіздің regex-іңіздің алдына ^ символын қою арқылы, үлгіңізді қатар басына бекітесіз. Келесі мысалда біз кез-келген # символынан басталатын қатарға сәйкес келетін ^# регулярлы формуласын пайдаланамыз:
$ grep ^# /etc/fstab
# /etc/fstab: static file system information.
#
Толық қатарлы регулярлы формулалар
^ және $ метасимволдарын, толық қатармен сәйкестікті іздеу үшін пайдалануға болады. Мысалы, төменде көрсетілген regex # символынан басталатын және "." символымен аяқталатын қатарларға сәйкес келеді:
$ grep '^#.*\.$' /etc/fstab
# /etc/fstab: static file system information.
Жоғарыда біз қабықша $ символын өңдемеуі үшін регулярлы формуланы бірлік жақшаларға алдық. Бірлік жақшаларсыз $ символы grep командасына жетпей қабықша арқылы өңделіп кетеді.
Аудармашыдан
Регулярлы формулалар (regex) күрделі тақырып. Егер сіз алдын оның не екенін білмесеңіз бұл бөлімшені түсіну қиын болады. Сондықтан оларды үйренуді басқа жерден бастаған дұрыс. Мұнда негізінен жалпылама және қысқаша мәліметтер келтірілген.
-
+1
Мақаланы екінші әрекеттен соң зорға жарияладым ((, мына зомби мақаланы жоя салу керек.