uy - Noutbuklar
Linux muntazam ifodalari. Linux Unix muntazam ifodalarida matn naqshlarini topish uchun Grep va muntazam ifodalardan foydalanish

Ushbu darslik haqida

Sizni Linux Professional Institute imtihon 101 ga tayyorlash uchun moʻljallangan toʻrtta oʻquv qoʻllanmaning ikkinchisi boʻlgan asosiy boshqaruvga xush kelibsiz. Ushbu bo'limda biz naqshlar yordamida fayllardagi matnni qidirish uchun oddiy iboralardan qanday foydalanishni ko'rib chiqamiz. Keyin siz "Ierarxik standart" bilan tanishasiz. fayl tizimi"(Fayl tizimi ierarxiyasi standarti yoki qisqartirilgan FHS), biz sizga qanday topishni ham ko'rsatamiz kerakli fayllar tizimingizda. Shundan so'ng, siz Linuxda jarayonlarni ishga tushirish orqali ularni to'liq nazorat qilishni o'rganasiz fon, jarayonlar ro'yxatini ko'rish, ularni terminaldan ajratish va boshqalar. Quyida quvurlar, qayta yo'naltirishlar va matnni qayta ishlash buyruqlari haqida qisqacha ma'lumot berilgan. Nihoyat, biz sizni Linux yadro modullari bilan tanishtiramiz.

Xususan, o'quv qo'llanmaning ushbu qismi (2-qism) bash haqida yaxshi boshlang'ich bilimga ega bo'lgan va Linux boshqaruvining asosiy vazifalari bilan yaxshi tanishishni istaganlar uchun idealdir. Agar siz Linuxda yangi bo'lsangiz, avval ushbu "Qanday qilish" seriyasining 1-qismini tugatishingizni tavsiya qilamiz. Ba'zilar uchun ushbu materialning aksariyati yangi bo'ladi, lekin ko'proq tajribaga ega bo'lganlar uchun Linux foydalanuvchilari Bu ularning asosiy boshqaruv qobiliyatlarini umumlashtirishning ajoyib usulini topishi mumkin.



Agar siz ushbu qoʻllanmaning birinchi nashrini LPI imtihoniga tayyorlanishdan boshqa maqsadda oʻrgangan boʻlsangiz, ushbu nashrni qayta oʻqishga hojat qolmasligi mumkin. Ammo, agar siz imtihon topshirishni rejalashtirayotgan bo'lsangiz, o'quv qo'llanmasining qayta ko'rib chiqilgan versiyasini qayta o'qib chiqishingiz tavsiya etiladi.

Oddiy ifodalar

"Doimiy ifoda" nima?

Muntazam ibora (ingliz tilida oddiy ibora, qisqartirilgan "regexp" yoki "regex", bizning mamlakatimizda uni ba'zan "regular" deb ham atashadi - taxminan chiziqli) tasvirlash uchun ishlatiladigan maxsus sintaksisdir. matn shablonlari. Linux tizimlarida oddiy iboralar matnda naqsh izlash, shuningdek, matn oqimlarida qidirish va almashtirish operatsiyalari uchun keng qo'llaniladi.

Globbing bilan solishtirganda

Oddiy iboralarni ko'rib chiqishni boshlaganimizdan so'ng, ularning sintaksisi biz 1-qismda ko'rib chiqqan globbing sintaksisiga juda o'xshashligini sezishingiz mumkin. Biroq, xato qilmang, bu o'xshashlik juda yuzaki. Muntazam iboralar va globbing naqshlari, hatto ular o'xshash bo'lsa ham, tubdan farq qiladi.

Oddiy pastki qator

Bu ogohlantirishdan voz kechgan holda, keling, oddiy iboralar haqidagi eng asosiy narsani, eng oddiy pastki qatorni ko'rib chiqaylik. Buning uchun biz "grep" buyrug'idan foydalanamiz, bu buyruq fayl tarkibini berilgan muntazam ifodaga muvofiq skanerlaydi. grep qolganlarini e'tiborsiz qoldirib, muntazam ifodaga mos keladigan har bir qatorni chop etadi:

$ 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

Yuqorida grep uchun birinchi parametr regex; ikkinchisi - fayl nomi. grep har bir satrni o'qiydi /etc/passwd va moslik izlash uchun unga oddiy "bash" regex pastki qatorini qo'lladi. Agar moslik topilsa, grep butun qatorni chop etdi; aks holda, chiziq e'tiborga olinmaydi.

Oddiy pastki qatorni tushunish

Umuman olganda, agar siz pastki qatorni qidirayotgan bo'lsangiz, uni hech qanday "maxsus" belgilardan foydalanmasdan oddiygina tom ma'noda belgilashingiz mumkin. Agar pastki satringizda +, ., *, [, ] yoki \ bo'lsa, alohida e'tibor berishingiz kerak, bu holda bu belgilardan teskari qiyshiq chiziq va pastki qator qo'shtirnoq ichiga olinishi kerak. Oddiy pastki qator sifatidagi oddiy iboralarga ba'zi misollar:

  • /tmp (/tmp qatorini qidiring)
  • "\" (string qidiruvi)
  • "\*kulgili\*" (*kulgili* qatorini qidiring)
  • "ld\.so" (ld.so qatorini qidiring)

Meta belgilar

Muntazam iboralar yordamida, metabelgilardan foydalangan holda, biz yaqinda ko'rib chiqqan misollarga qaraganda ancha murakkab qidiruvlarni amalga oshirish mumkin. Bunday meta-belgilardan biri "." (nuqta), har qanday bitta belgiga mos keladi:

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

Bu misolda dev.sda matni hech bir satrda ko'rinmaydi /etc/fstab. Biroq, grep uni dev.sda chizig'i bo'yicha emas, balki dev.sda namunasi bo'yicha skanerlaydi. Shuni esda tutingki, "." har qanday bitta belgiga mos keladi. Ko'rib turganingizdek, meta-belgi "." funksional jihatdan “?” metabelgisi qanday ishlashiga teng. glob almashinuvlarida.

Foydalanish

Agar biz belgi haqida "." dan ko'ra aniqroq ma'lumot olishni istasak, mos keladigan belgilar to'plamini belgilash uchun [ va ] (kvadrat qavs) dan foydalanishimiz mumkin:

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

Siz sezganingizdek, xususan, bu sintaktik konstruktsiya fayl nomlarini glob bilan almashtirganda "" konstruktsiyasi bilan bir xil ishlaydi. Shunga qaramay, bu muntazam iboralarni o'rganishdagi noaniqliklardan biridir: sintaksis glob almashtirish sintaksisiga o'xshash, lekin bir xil emas, bu chalkashlikdir.

[^] dan foydalanish

Kvadrat qavslar maʼnosini [dan keyin darhol ^ qoʻyish orqali oʻzgartirishingiz mumkin. Bunday holda, qavslar ularning ichida YO'Q har qanday belgiga mos keladi. Yana e'tibor bering, biz [^] dan muntazam ifoda bilan va [!] dan globus bilan foydalanamiz:

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

Turli sintaksis

Shuni ta'kidlash kerakki, kvadrat qavslar ichidagi sintaksis boshqa oddiy iboralardan tubdan farq qiladi. Misol uchun, agar siz "." ni qo'ysangiz. kvadrat qavslar ichida, bu kvadrat qavslarning "" mos kelishiga imkon beradi. tom ma'noda, xuddi yuqoridagi misoldagi 1 va 2 kabi. Taqqoslash uchun, "." kvadrat qavslar tashqarisida joylashtirilgan, agar "\" qo'shilmasa, metabelgi sifatida talqin qilinadi. Foyda olishimiz mumkin bu fakt/etc/fstab dan dev.sda qatorini o'z ichiga olgan satrlarni yozilganidek chop etish uchun:

$ grep dev[.]sda /etc/fstab

Shuningdek, biz quyidagilarni yozishimiz mumkin:

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

Bu oddiy iboralar sizning bitta qatoringizga mos kelmasligi mumkin /etc/fstab fayl.

Matasymbol *

Ba'zi meta-belgilar o'zlari hech narsaga mos kelmaydi, lekin oldingi belgining ma'nosini o'zgartiradi. Bunday belgilardan biri * (yulduzcha) bo'lib, u oldingi belgining nol yoki undan ortiq takrorlanishiga mos kelish uchun ishlatiladi. E'tibor bering, bu * regexda globbingdan ko'ra boshqacha ma'noga ega ekanligini anglatadi. Mana bir nechta misollar va muntazam ifoda moslashuvi glob almashtirishlardan farq qiladigan holatlarga alohida e'tibor bering:

  • ab*c"abbbbc" ga mos keladi, lekin "abqc" emas (glob almashtirilganda ikkala satr ham naqshga mos keladi. Nima uchun hali tushundingizmi?)
  • ab*c"abc" ga mos keladi, lekin "abbqbbc" emas (yana globni almashtirish bilan naqsh ikkala qatorga mos keladi)
  • ab*c"ac" ga mos keladi, lekin "cba" emas (globbing holatida "ac" ham, "cba" ham naqshga mos kelmaydi)
  • b*e"bqe" va "be" ga mos keladi (globusni almashtirish "bqe"ga mos keladi, lekin "be" emas)
  • b*e"bccqqe" ga mos keladi, lekin "bccc" emas (globbing paytida naqsh birinchisiga to'liq mos keladi, lekin ikkinchisiga emas)
  • b*e“bqqcce”ga mos keladi, lekin “cqe” emas (globni almashtirish bilan bir xil)
  • b*e"bbbeee" ni qondiradi (lekin globbing holatida emas)
  • .* har qanday satr bilan solishtirish mumkin (globni almashtirish faqat "." bilan boshlanadigan satrlar bilan qondiriladi)
  • foo.*"foo" bilan boshlanadigan har qanday pastki qatorga mos keladi (glob almashtirilganda, bu naqsh to'rtta "foo" belgisidan boshlanadigan satrlarga mos keladi).

Shunday qilib, mustahkamlash uchun takrorlaymiz: "ac" qatori "ab*c" muntazam ifodasiga mos keladi, chunki yulduzcha oldingi (b) ifodani ham nol marta takrorlashga imkon beradi. Va yana shuni ta'kidlash kerakki, muntazam iboralardagi * metabelgisi glob almashtirishlardagi * belgisidan butunlay boshqacha talqin qilinadi.

Chiziqning boshlanishi va oxiri

Biz batafsil ko'rib chiqadigan oxirgi meta-belgilar ^ va $ bo'lib, ular mos ravishda satrning boshi va oxiriga mos kelish uchun ishlatiladi. Regexning boshida ^ dan foydalanib, siz naqshingizni satr boshiga "langar" qilasiz. Quyidagi misolda biz # belgisi bilan boshlangan har qanday qatorga mos keladigan ^# oddiy ifodasidan foydalanamiz:

$ grep ^# /etc/fstab

#

To'liq chiziqli muntazam

^ va $ butun qatorga mos kelishi uchun birlashtirilishi mumkin. Masalan, quyidagi oddiy ibora # belgisi bilan boshlanib, "." belgisi bilan tugaydigan qatorlarga mos keladi, ular orasida ixtiyoriy sonli belgilar mavjud:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: statik fayl tizimi ma `lumot.

Yuqoridagi misolda qobiq $ belgisini talqin qilishiga yo'l qo'ymaslik uchun oddiy iborani bitta tirnoq ichiga oldik. Bitta tirnoqsiz $ bizning regeximizdan grep uni ko'rmasdan yo'qoladi.

Mualliflar haqida

Daniel Robbins

Daniel Robbins - Gentoo hamjamiyatining asoschisi va yaratuvchisi operatsion tizim Gentoo Linux. Daniel rafiqasi Meri va ikkita baquvvat qizi bilan Nyu-Meksikoda yashaydi. U, shuningdek, Funtoo asoschisi va bosh direktori bo‘lib, IBM developerWorks, Intel Developer Services va C/C++ Users Journal uchun ko‘plab texnik maqolalar yozgan.

Kris Xauser

Chris Houser 1994 yilda Teylor universitetida (Indiana, AQSH) ma'muriy guruhga qo'shilganidan beri UNIX advokati bo'lib, u erda kompyuter fanlari va matematika bo'yicha bakalavr darajasini olgan. O'shandan beri u turli sohalarda ishlagan, jumladan, veb-ilovalar, video tahrirlash, UNIX drayverlari va kriptografik xavfsizlik. IN hozirda Sentry Data Systems kompaniyasida ishlaydi. Kris, shuningdek, Gentoo Linux va Clojure kabi ko'plab bepul loyihalarga hissa qo'shgan va "Clojure quvonchi" kitobining hammuallifi.

Aron Griffis

Aaron Griffis Bostonda yashaydi, u yerda soʻnggi oʻn yilni Hewlett-Packard’da Tru64 uchun UNIX tarmoq drayverlari, Linux xavfsizlik sertifikati, Xen va boshqalar kabi loyihalarda ishlagan. KVM virtualizatsiyasi, va yaqinda, HP ePrint platformasi. Aaron dasturlash bilan shug'ullanmasa, velosipedda haydash, ko'rshapalaklar o'ynash yoki Boston Red Sox professional beysbol jamoasini qo'llab-quvvatlash paytida dasturlash muammolari haqida o'ylashni yaxshi ko'radi.

Linux terminalidagi eng foydali va xususiyatlarga boy buyruqlardan biri bu "grep" buyrug'idir. Bu nom inglizcha “Dunyoviy ifodaga mos keladigan satrlarni global miqyosda qidiring va ularni chop eting” iborasining qisqartmasi boʻlib (hamma joyda muntazam ifodaga mos keladigan satrlarni qidiring va ularni chop eting). "grep" buyrug'i kirish oqimini satr bo'yicha skanerdan o'tkazadi, mosliklarni qidiradi va faqat berilgan naqshga mos keladigan matnni o'z ichiga olgan satrlarni chiqaradi (filtrlar) - muntazam ifoda.

Muntazam iboralar metabelgilardan foydalanishga asoslangan matndagi pastki qatorlarni qidirish va boshqarish uchun maxsus rasmiy tildir. Hozir deyarli barcha zamonaviy dasturlash tillarida matnni qayta ishlash uchun oddiy iboralar oʻrnatilgan, ammo tarixan UNIX dunyosi va xususan, “grep”, “sed” va hokazo buyruqlar ichiga kiritilgan gʻoyalar katta hissa qoʻshgan. “Hammasi fayl” falsafasi » UNIX tizimiga to‘liq kirib boradi va matnli fayllar bilan ishlash vositalarini o‘zlashtirish har bir Linux foydalanuvchisi uchun zarur bo‘lgan ko‘nikmalardan biridir.

NAMUNA

GIST | "Odamlar" matnini o'z ichiga olgan barcha qatorlarni oddiy qidirish. Ushbu va keyingi misollarni formatlashda biz quyidagi tartibga rioya qilamiz: yuqorida buyruq qatori parametrlari, pastda standart oqimlar, chapda stdin kiritish va o'ngda stdout chiqishi.

"grep" buyrug'i uni ishga tushirishda belgilashingiz mumkin bo'lgan ta'sirchan sonli variantlarga ega. Ushbu variantlar yordamida siz juda ko'p foydali narsalarni qilishingiz mumkin va hatto oddiy ifoda sintaksisini yaxshi bilishingiz shart emas.

VARIANTLAR

Keling, "grep" nafaqat standart kirish stdinni filtrlashi, balki fayllarni qidirishi ham mumkinligidan boshlaylik. Odatiy bo'lib, grep faqat joriy katalogdagi fayllarni qidiradi, lekin juda foydali --recursive opsiyasi bilan siz grepga berilgan katalogdan boshlab rekursiv qidirishni aytishingiz mumkin.

GIST | Odatiy bo'lib, grep buyrug'i katta-kichik harflarga sezgir. Quyidagi misolda katta-kichik harflar sezgir bo'lmasdan qanday qilib qidirish mumkinligi ko'rsatilgan, masalan, "Adams" va "adams" bir xil narsa:

"Adams" harfini e'tiborsiz qoldiring

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jon Adams, 1797-1801

GIST | Qidiruv buning aksi (ba'zan ular teskari qidiruv deyishadi), ya'ni ko'rsatilgan naqshga ega bo'lganlardan tashqari barcha qatorlar ko'rsatiladi:

Invert-match "Adams"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jorj Vashington, 1789-1797 Tomas Jefferson, 1801-1809

GIST | Variantlar, albatta, bir-biri bilan birlashtirilishi mumkin va kerak. Masalan, teskari yo'nalishda qidirish, ketma-ket raqamlarni ko'rsatish bilan:

Satr raqami --invert-match "Adams"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 1: Jorj Vashington, 1789-1797 3: Tomas Jefferson, 1801-1809

GIST | Rang berish. Ba'zan biz izlayotgan so'z rang bilan ta'kidlanganda qulay. Bularning barchasi allaqachon "grep" da, qolganlari quyidagilardan iborat:

Satr raqami --color=har doim "Odamlar"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 2: Jon Adams, 1797-1801

GIST | Biz jurnal faylidagi barcha xatolarni tanlamoqchimiz, lekin xatolikdan keyingi qatorda bo'lishi mumkinligini bilamiz foydali ma'lumotlar, keyin kontekstdan bir nechta satrlarni chiqarish qulay. Odatiy bo'lib, grep faqat moslik topilgan qatorni chop etadi, ammo grepni ko'proq chop etish uchun bir nechta variant mavjud. Kirishdan keyin bir nechta satrlarni (bizning holatlarimizda ikkita) ko'rsatish uchun:

Rang = har doim -A2 "Adams"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jeyms Madison, 1809-1817 Jeyms Monro, 1817-1825 Jon Adams, 1797-1801, Tomas Jefferson, Tomas Jefferson 817

GIST | Xuddi shunday, kirishdan oldin bir nechta satrlarning qo'shimcha chiqishi uchun:

Rang = har doim -B2 "Jeyms"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jeyms Madison, 1809-1817 Jeyms Monro, 1817-1825 Jon Adams, 1797-1801, Tomas Jefferson, Tomas Jefferson 817 Jeyms Monro , 1817-1825

GIST | Biroq, ko'pincha siz nosimmetrik kontekstni ko'rsatishingiz kerak, buning uchun undan ham qisqaroq belgilar mavjud. Keling, yozuvning tepasida va ostida ikkita qatorni chop qilaylik:

Rang = har doim -C2 "Jeyms"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jeyms Madison, 1809-1817 Jeyms Monro, 1817-1825 Jon Quincy Adams, 1825-1829 Jon Kvinsi Adams, 1825-1829 Endryu317 Van31818 41 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jeyms Madison, 1809-1817 Jeyms Monro, 1817-1825 Jon Kvinsi Adams, 1825-1829 Endryu Jekson, 1829-1837

GIST | Qwe ni qidirganingizda, sukut bo'yicha "grep" qwe123, 345qwerty va shunga o'xshash kombinatsiyalarni ham chiqaradi. Keling, faqat butun so'zni o'chirib qo'yadigan qatorlarni topamiz:

Word-regexp --color=har doim "Jon"

Jon Fitsjerald Kennedi, 1961-1963 Lindon Beyns Jonson, 1963-1969 Jon Fitsjerald Kennedi, 1961-1963

GIST | Va nihoyat, agar siz bitta raqamga mos keladigan satrlar sonini bilmoqchi bo'lsangiz, lekin boshqa hech narsani ko'rsatmasangiz:

Hisoblash --color=har doim "Jon"

Jon Fitsjerald Kennedi, 1961-1963 Lindon Beyns Jonson, 1963-1969 Richard Milxous Nikson, 1969-1974 2

Shuni ta'kidlash kerakki, ko'pgina variantlarda o'xshash mavjud, masalan --ignore-case qisqaroq -i shakliga qisqartirilishi mumkin va hokazo.

ASOSIY MONTAJIDAGI iboralar

Barcha muntazam iboralar ikki turdagi belgilardan iborat: standart matn belgilar, chaqirildi harflar, va maxsus belgilar chaqiriladi metabelgilar. Oldingi misollarda qidiruv literallar (harflarning aniq mosligi) yordamida amalga oshirildi, ammo keyingi narsa qiziqroq bo'ladi. Muntazam iboralar dunyosiga xush kelibsiz!

Karet ^ va dollar belgilari $ muntazam ifodada alohida ma'noga ega. Ular "langarlar" deb ataladi. Ankorlar Maxsus belgilar, bu kerakli mos keladigan satrdagi joyni ko'rsatadi. Qidiruv langarga yetganda, moslik bor-yo'qligini tekshiradi va agar shunday bo'lsa, naqsh bo'yicha davom etadi. natijaga hech narsa qo'shmasdan.

GIST | Karet langari muntazam ifodani satr boshidan sinab ko'rish kerakligini ko'rsatish uchun ishlatiladi:

Rang=har doim "^J"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jon Adams, 1797-1801

GIST | Shunga o'xshab, dollar langari naqsh oxirida ishlatilishi kerak, agar izlanayotgan belgilar qatori matn satrining oxirida bo'lsa, mos kelishi to'g'ri ekanligini ko'rsatish uchun ishlatiladi va boshqacha emas:

Rang=har doim "9$"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Tomas Jefferson, 1801-1809

GIST | Har qanday xarakter. Belgilangan joyda mutlaqo istalgan belgi paydo bo'lishi mumkinligini ko'rsatish uchun nuqta belgisi odatiy iboralarda ishlatiladi:

Rang=har doim "0.$"

GIST | Himoya. Agar siz aniq nuqta belgisini topishingiz kerak bo'lsa, qochish yordam beradi. Nuqta kabi belgi oldidagi qochish belgisi (odatda teskari qiyshiq chiziq) metabelgini literalga aylantiradi:

Rang=har doim "\".

Jorj Vashington. 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jorj Vashington. 1789-1797 yillar

GIST | Qahramonlar sinflari. Muntazam ifodalar diapazonlar va belgilar sinflaridan foydalanishi mumkin. Buning uchun shablonni yaratishda kvadrat qavslar qo'llaniladi. Kvadrat qavslar ichiga belgilar guruhini (shu jumladan metabelgilar sifatida talqin qilinishi mumkin bo'lgan belgilarni) joylashtirish orqali siz qavs ichidagi har qanday belgilar o'sha joyda paydo bo'lishi mumkinligini ko'rsatishingiz mumkin:

Rang = har doim "0"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809

GIST | Diapazon. Bular tire bilan ajratilgan ikkita belgi, masalan 0-9 (o'nlik raqamlar) yoki 0-9a-fA-F (on oltilik raqamlar):

Rang=har doim ""

Jorj Vashington, ??? Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809

GIST | Inkor qilish. Agar kvadrat qavs ichidagi ifodaning birinchi belgisi karet bo'lsa, qolgan belgilar muntazam ifodaning berilgan joyida bo'lmasligi kerak bo'lgan belgilar to'plami sifatida qabul qilinadi:

Rang=har doim "[^7]$"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809

GIST | POSIX belgilar sinflari. Muntazam iboralarda foydalanishingiz mumkin bo'lgan oldindan tayyorlangan belgilar sinflarining ma'lum bir to'plami mavjud. Ularning o'nga yaqini bor, har birining maqsadini tushunish uchun qo'llanmani tezda ko'rib chiqing. Masalan, faqat o'n oltilik raqamlarni filtrlaymiz:

Rang=har doim "^[[:xdigit:]]*$"

4.2 42 42abc 42 42abc

GIST | Takrorlang (0 yoki undan ortiq marta). Eng ko'p ishlatiladigan meta-belgilardan biri yulduzcha belgisi bo'lib, "oldingi belgi yoki ifodani nol yoki undan ko'p marta takrorlash" degan ma'noni anglatadi:

Rang=har doim "^*$"

Jorj Vashington, ??? Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jorj Vashington, ???

Asosiy muntazam iboralar BRE (asosiy muntazam iboralar) va kengaytirilgan muntazam iboralar ERE (kengaytirilgan muntazam iboralar) mavjud. BREda quyidagi meta-belgilar tan olingan: ^$. * va boshqa barcha belgilar harflar sifatida qabul qilinadi. Quyidagi metabelgilar ERE () ( ) ga qo'shilganmi? + | va tegishli funktsiyalar. Hammani chalkashtirib yuborish uchun ular “grep” da bu narsani o‘ylab topishdi – BREdagi () ( ) belgilar, agar ular teskari qiyshiq chiziq bilan qochib qutulsa, metabelgilar sifatida qabul qilinadi, EREda esa oldiga teskari chiziq qo‘yadi. har qanday metabelgilar ularga harflar kabi munosabatda bo'lishiga olib keladi.

MUVOFIQ MUVOFIQ iboralar

GIST | Ajralish. Kvadrat qavslar bitta belgi uchun turli xil mumkin bo'lgan mosliklarni ko'rsatganidek, ajratish ham belgilar yoki ifodalar qatorlari uchun muqobil mosliklarni belgilashga imkon beradi. Vertikal chiziq belgisi disjunctionni ko'rsatish uchun ishlatiladi:

Extended-regexp --color=har doim "Jorj|Jon"

Jorj Vashington, 1789-1797 Jon Adams, 1797-1801 Tomas Jefferson, 1801-1809 Jorj Vashington, 1789-1797 Jon Adams, 1797-1801

GIST | Nol yoki bir marta moslang. Kengaytirilgan muntazam iboralarda belgi yoki ibora qanchalik tez-tez takrorlanishini ko'rsatadigan bir nechta qo'shimcha metabelgilar mavjud (yulduzcha metabelgi 0 yoki undan ortiq marta mos kelishini ko'rsatishiga o'xshash). Bunday metabelgilardan biri oldingi belgi yoki ifodani asosan ixtiyoriy holga keltiradigan savol belgisidir:

Extended-regexp --color=always "^(Endryu)?Jon"

Jon Adams, 1797-1801 Endryu Jonson, 1865-1869 Lindon Beyns Jonson, 1963-1969 Jon Adams, 1797-1801 Endryu Jonson, 1865-1869

GIST | Bir yoki bir necha marta moslang. Shu maqsadda ortiqcha belgisi ko'rinishidagi meta-belgi taqdim etiladi. U deyarli yulduzcha belgisi kabi ishlaydi, faqat ifoda kamida bir marta mos kelishi kerak:

Extended-regexp --color=always "^[[:alpha:] ]+$"

Jon Adams Endryu Jonson, 1865-1869 Lindon Beyns Jonson, 1963-1969 Jon Adams

GIST | Belgilangan sonni moslashtiring. Buning uchun jingalak qavslardan foydalanishingiz mumkin. Ushbu metabelgilar ifodaning aniq sonini, diapazonini va yuqori va pastki chegarasini ko'rsatish uchun ishlatiladi:

Extended-regexp --color=har doim "(1,3)\.(1,3)\.(1,3)\.(1,3)"

42 127.0.0.1 127.0.0.1

grep buyrug'i shunchalik foydali, imkoniyatlarga boy va ishlatish uchun qulayki, uni bilganingizdan so'ng, usiz ishlashni tasavvur qilib bo'lmaydi.

grep yordam dasturi juda kuchli qidiruv va filtrlash vositasidir. matnli ma'lumotlar. Ushbu maqolada uning imkoniyatlarini baholashga imkon beradigan undan foydalanishning bir nechta misollari keltirilgan.
Grep ning asosiy qo'llanilishi fayllar va chiqish oqimlarida so'z yoki iboralarni qidirishdir. Siz kiritish orqali qidirishingiz mumkin buyruq qatori so'rov va qidiruv maydoni (fayl).
Masalan, hystack.txt faylida "igna" qatorini topish uchun quyidagi buyruqdan foydalaning:

$ grep igna haystack.txt

Natijada, grep haystack.txt fayli mazmunida uchraydigan barcha igna holatlarini ko'rsatadi. Shuni ta'kidlash kerakki, bu holda grep so'zni emas, balki belgilar to'plamini qidiradi. Misol uchun, "keraksiz" so'zini va "igna" ketma-ketligini o'z ichiga olgan boshqa so'zlarni o'z ichiga olgan satrlar ko'rsatiladi.


Grepga ma'lum bir so'zni qidirayotganingizni aytish uchun -w tugmasidan foydalaning. Ushbu tugma qidiruvni faqat belgilangan so'z bilan cheklaydi. So'z - bu har qanday bo'shliq, tinish belgilari yoki qator tanaffuslari bilan har ikki tomondan ajratilgan so'rovdir.

$ grep -w igna haystack.txt

Qidiruvni faqat bitta fayl bilan cheklash shart emas; grep fayllar guruhi bo'ylab qidirishi mumkin va qidiruv natijalari moslik topilgan faylni ko'rsatadi. -n kaliti moslik topilgan qator raqamini ham qo'shadi va -r kaliti rekursiv qidiruvni amalga oshirishga imkon beradi. Bu dastur manba kodlari bo'lgan fayllarni qidirishda juda qulay.

$ grep -rnw function_name /home/www/dev/myprogram/

Fayl nomi har bir oʻyindan oldin roʻyxatga olinadi. Agar fayl nomlarini yashirish kerak bo'lsa, -h tugmasidan foydalaning, aksincha, agar sizga faqat fayl nomlari kerak bo'lsa, u holda -l kalitini belgilang.
Quyidagi misolda biz IRC jurnali faylida URL manzillarini qidiramiz va oxirgi 10 ta moslikni ko'rsatamiz.

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

-o opsiyasi grepga butun qatorni emas, balki faqat naqsh mosligini chop etishni aytadi. Quvurdan foydalanib, biz grep chiqishini sukut bo'yicha oxirgi 10 qatorni chiqaradigan quyruq buyrug'iga yo'naltiramiz.
Endi biz ma'lum foydalanuvchilar tomonidan irc kanaliga yuborilgan xabarlar sonini hisoblaymiz. Masalan, men uydan va ish joyidan yuborgan barcha xabarlar. Ular taxallusda farqlanadi, uyda men user_at_home taxallusidan foydalanaman, ishda esa user_at_work.

$ grep -c "^user_at_(uy|ish)" channel.log

-c opsiyasi bilan grep faqat topilgan mosliklar sonini chop etadi, mosliklarning o'zini emas. Qidiruv qatori qo'shtirnoq ichiga olingan, chunki u qobiq tomonidan nazorat belgilari sifatida tan olinishi mumkin bo'lgan maxsus belgilarni o'z ichiga oladi. E'tibor bering, qo'shtirnoqlar qidiruv sxemasiga kiritilmagan. Teskari chiziq "" maxsus belgilardan qochish uchun ishlatiladi.
Keling, kanalda "qichqirishni" yoqtiradigan odamlarning xabarlarini qidiramiz. "Qichqiriq" deganda biz sarg'ish uslubda, barcha BOSHQA harflar bilan yozilgan xabarlarni nazarda tutamiz. Qidiruvdan qisqartmalarning tasodifiy urishlarini istisno qilish uchun biz besh yoki undan ortiq belgidan iborat so'zlarni qidiramiz:

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

Batafsilroq tavsif uchun grep man sahifasiga murojaat qilishingiz mumkin.
Yana bir nechta misollar:

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

/etc/passwd faylidan satr ildizini o'z ichiga olgan satrlarni ko'rsatadi.

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

Bundan tashqari, qidirilayotgan qatorni o'z ichiga olgan qator raqamlari ko'rsatiladi.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown stop: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 foydalanuvchisi:/:/bin/false nscd:x:28:28:NSCD Demon:/:/bin/false nomli:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP Foydalanuvchi: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Qaysi foydalanuvchilar bash ishlatmayotganligini tekshiradi, ularning qobig'i sifatida nologin ko'rsatilgan foydalanuvchi hisoblari bundan mustasno.

# grep -c false /etc/passwd 7

Qobiq sifatida /bin/false bo'lgan hisoblar sonini hisoblaydi.

# grep -i o'yinlari ~/.bash* | grep -v tarixi

Bu buyruq joriy foydalanuvchining uy katalogidagi nomlari ~/.bash bilan boshlanadigan barcha fayllardan satrlarni ko'rsatadi, nomlari qator tarixini o'z ichiga olgan fayllar bundan mustasno, ~/.bash_history ichida bir xil qatorni belgilashi mumkin bo'lgan mosliklarni istisno qilish uchun. katta yoki kichik harflarda. E'tibor bering, "o'yinlar" so'zini qidirish amalga oshiriladi, uning o'rniga istalgan boshqa so'zni qo'shishingiz mumkin.
grep buyrug'i va muntazam ifodalar

Oldingi misoldan farqli o'laroq, biz endi faqat "root" qatori bilan boshlanadigan qatorlarni ko'rsatamiz:

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

Qaysi hisoblar qobiqdan umuman foydalanmaganligini ko'rishni istasak, biz ":" belgisi bilan tugaydigan qatorlarni qidiramiz:

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

~/.bashrc faylingizdagi PATH o'zgaruvchisi eksport qilinganligini tekshirish uchun avval "eksport" bilan qatorlarni tanlang va keyin "PATH" qatoridan boshlanadigan qatorlarni qidiring; bu holda MANPATH va boshqalar ko'rsatilmaydi mumkin bo'lgan usullar:

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

Qahramonlar sinflari

Kvadrat qavs ichidagi ifoda [" va "]"" belgilar ichiga olingan belgilar ro'yxatidir. U ushbu ro'yxatda ko'rsatilgan har qanday bitta belgiga mos keladi; agar ro'yxatning birinchi belgisi "^" bo'lsa, u ro'yxatda YO'Q har qanday belgiga mos keladi. Masalan, "" muntazam ifodasi har qanday bitta raqamga mos keladi.

Kvadrat qavs ichidagi ifoda ichida siz chiziqcha bilan ajratilgan ikkita belgidan iborat diapazonni belgilashingiz mumkin. Keyin ibora tartiblash qoidalariga ko'ra, ushbu ikki belgi, shu jumladan, ushbu ikkita belgi ichiga tushadigan har qanday singlga mos keladi; bu mahalliy tilda ko'rsatilgan harmanlama va belgilar to'plamini hisobga oladi. Misol uchun, standart til C bo'lsa, "" ifodasi "" ifodasiga tengdir. Saralash lug'at tartibida amalga oshiriladigan ko'plab tillar mavjud va bu tillarda "" odatda "" ga ekvivalent emas, ularda, masalan, "" iborasiga ekvivalent bo'lishi mumkin. Kvadrat qavs ichida ko'rsatilgan ifodaning an'anaviy talqinidan foydalanish uchun uni o'rnatish orqali C tilidan foydalanishingiz mumkin atrof-muhit o'zgaruvchisi LC_ALL qiymati "C".

Nihoyat, kvadrat qavslar ichida ifodalar ichida ko'rsatilgan maxsus nomlangan belgilar sinflari mavjud. Qo'shimcha ma'lumot Ushbu oldindan belgilangan iboralar haqida ma'lumot olish uchun man sahifalariga yoki grep buyrug'i hujjatlariga qarang.

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

Misol "y" yoki "f" belgisini o'z ichiga olgan barcha qatorlarni ko'rsatadi.
Universal belgilar (metabelgilar)

"." dan foydalaning. har qanday bitta belgiga mos kelish uchun. Agar hammasi ro'yxatini olishni istasangiz Inglizcha so'zlar, lug'atdan olingan, "c" bilan boshlanib, "h" bilan tugaydigan beshta belgidan iborat (krossvordlarni echish uchun foydali):

# grep " " /usr/share/dict/words catch clash cloth coach divan yo'tal crash crush

Agar siz nuqta belgisini o'z ichiga olgan satrlarni harf sifatida ko'rsatishni istasangiz, grep buyrug'ida -F variantini belgilang. Belgilar"< " и «>" ko'rsatilgan harflardan oldin va shunga mos ravishda keyin bo'sh qator mavjudligini anglatadi. Demak, so'zlar faylidagi so'zlar mos ravishda yozilishi kerak. Agar siz matndagi barcha so'zlarni bo'sh qatorlarni hisobga olmagan holda ko'rsatilgan naqshlar bo'yicha topmoqchi bo'lsangiz, belgilarni o'tkazib yuboring "< " и «>", faqat so'zlarni aniqroq qidirish uchun -w tugmasidan foydalaning.

Xuddi shunday, "c" va "h" orasida istalgan miqdordagi belgilar bo'lishi mumkin bo'lgan so'zlarni topish uchun yulduzcha (*) dan foydalaning. Quyidagi misol tizim lug'atidan "c" bilan boshlanib, "h" bilan tugaydigan barcha so'zlarni tanlaydi:

# grep " " /usr/share/dict/words caliph cash catch tülbent gepard --chiqish o'chirildi--

Agar siz fayl yoki chiqish oqimida yulduzcha belgisini topmoqchi bo'lsangiz, uni topish uchun bitta tirnoqdan foydalaning. Quyidagi misoldagi foydalanuvchi avval /etc/profile faylida tirnoqlarni ishlatmasdan “yulduzcha”ni izlashga harakat qiladi, natijada hech narsa topilmaydi. Qo'shtirnoq ishlatilsa, natija chiqadi:

# grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh ; qil

Xayrli kun, mehmonlar!

Bugungi maqolada men shunday katta mavzuga to'xtalib o'tmoqchiman Oddiy ifodalar. Menimcha, regexlar mavzusi (muntazam iboralar jargonda deyilganidek) bitta post doirasida juda keng ekanligini hamma biladi. Shuning uchun, men qisqacha, lekin iloji boricha aniq, o'z fikrlarimni to'plashga va ularni sizga etkazishga harakat qilaman.

Muntazam iboralarning bir nechta turlari mavjudligini aytishdan boshlaylik:

1. An'anaviy muntazam iboralar(ular ham asosiy, asosiy va asosiy muntazam iboralar(BRE))

  • Ushbu iboralarning sintaksisi eskirgan deb ta'riflangan, ammo shunga qaramay hali ham keng tarqalgan va ko'plab UNIX utilitlari tomonidan qo'llaniladi.
  • Asosiy muntazam iboralar quyidagi metabelgilarni o'z ichiga oladi (quyida ularning ma'nolari haqida batafsilroq ma'lumot):
    • \( \) - ( ) uchun dastlabki versiya (kengaytirilgan)
    • \(\) - () uchun dastlabki versiya (kengaytirilgan)
    • \n, Qayerda n- 1 dan 9 gacha raqam
  • Ushbu meta-belgilardan foydalanish xususiyatlari:
    • Yulduzcha bitta belgiga mos keladigan ifodadan keyin kelishi kerak. Misol: *.
    • ifoda \( blok\)* noto'g'ri deb hisoblash kerak. Ba'zi hollarda u satrning nol yoki undan ko'p takrorlanishiga mos keladi blok. Boshqalarida u satrga mos keladi blok* .
    • Belgilar sinfida maxsus belgilar ma'nolari asosan e'tiborga olinmaydi. Maxsus holatlar:
    • To'plamga ^ belgisini qo'shish uchun u erda birinchi bo'lib joylashtirilmasligi kerak.
    • To'plamga - belgisini qo'shish uchun u erda birinchi yoki oxirgi joylashtirilishi kerak. Masalan:
      • DNS nom shabloni, unda harflar, raqamlar, minus va nuqta bo'lishi mumkin: [-0-9a-zA-Z.] ;
      • minus va raqamlardan tashqari har qanday belgi: [^-0-9] .
    • To‘plamga [ yoki ] belgi qo‘shish uchun avval u yerga joylashtirilishi kerak. Masalan:
      • mos keladi ], [, a yoki b.

2. Kengaytirilgan muntazam ifodalar(ular kengaytirilgan muntazam iboralar(ERE))

  • Ushbu iboralarning sintaksisi asosiy iboralar sintaksisiga o'xshaydi, bundan mustasno:
    • ( ) va () metabelgilar uchun teskari chiziqdan foydalanish olib tashlandi.
    • Metabelgi oldidagi teskari chiziq uning maxsus ma'nosini bekor qiladi.
    • Nazariy jihatdan rad etilgan tartibsiz dizayn\ n .
    • Qo'shilgan meta-belgilar + , ? , | .

3. Perl bilan mos keladigan oddiy iboralar(ular Perl bilan mos keladigan muntazam ifodalar(PCRE))

  • hatto POSIX ERE ga qaraganda boyroq va ayni paytda bashorat qilinadigan sintaksisga ega, shuning uchun ular ko'pincha ilovalar tomonidan qo'llaniladi.

Oddiy ifodalar dan iborat shablonlar, aniqrog'i shablonni o'rnating qidirmoq. Shakldan iborat dan qoidalar dan tashkil topgan qidiruvlar belgilar Va metabelgilar.

Qidiruv qoidalari quyidagilar bilan belgilanadi operatsiyalar:

Ro'yxatga olish |

Quvur (|) to'g'ri variantlarni ajratadi, deyish mumkin - mantiqiy OR. Misol uchun, "kulrang | kulrang" mos keladi kulrang yoki kulrang.

Guruh yoki uyushma()

Dumaloq qavslar operatorlar doirasi va ustuvorligini aniqlash uchun ishlatiladi. Masalan, "gray|grey" va "gr(a|e)y" turli naqshlardir, lekin ikkalasi ham o'z ichiga olgan to'plamni tasvirlaydi. kulrang Va kulrang.

Quantify()? * +

Miqdor ko'rsatkichi belgi yoki guruhdan keyin necha marta aniqlaydi oldingi ifodalanishi mumkin.

umumiy ifoda, takrorlar bo'lishi mumkin m dan n gacha.

umumiy ifoda m yoki undan ortiq takrorlash.

umumiy ifoda n dan ortiq takrorlash mumkin emas.

silliqn takrorlash.

So'roq belgisi anglatadi 0 yoki 1 marta, xuddi shunday {0,1} . Misol uchun, "colou?r" mos keladi va rang, Va rang.

Yulduz anglatadi 0, 1 yoki istalgan raqam bir marta ( {0,} ). Masalan, "go*gle" mos keladi kulmoq, Google, google va boshq.

Bundan tashqari anglatadi kamida 1 bir marta ( {1,} ). Masalan, "go+gle" mos keladi Google, google va boshqalar (lekin emas kulmoq).

Ushbu muntazam iboralarning aniq sintaksisi amalga oshirishga bog'liq. (ya'ni, ichida asosiy muntazam iboralar belgilar (Va)- teskari chiziq bilan qochib qutuldi)

Meta belgilar, sodda qilib aytganda, ularning haqiqiy ma'nosiga to'g'ri kelmaydigan belgilar, ya'ni belgi. (nuqta) nuqta emas, balki biron bir belgi va hokazo. Iltimos, meta-belgilar va ularning ma'nolari bilan tanishib chiqing:

. mos keladi yolg'iz har qanday belgi
[nimadur] Muvofiq har qanday singl qavs ichiga olingan belgilar. Bu holda: “-” belgisi faqat ochilishdan keyin yoki yopilish qavsdan oldin joylashgan bo'lsa, so'zma-so'z talqin qilinadi: yoki [-abc]. Aks holda, u belgilar oralig'ini bildiradi. Masalan, "a", "b" yoki "c" ga mos keladi. lotin alifbosining kichik harflariga mos keladi. Bu belgilarni birlashtirish mumkin: a, b, c, q, r, s, t, u, v, w, x, y, z. “[” yoki “]” belgilariga mos kelish uchun Yopuvchi qavs ochilish belgisidan keyingi birinchi belgi edi: "]", "[", "a" yoki "b" ga mos keladi. Agar kvadrat qavs ichidagi qiymatdan oldin ^ belgisi bo'lsa, u holda ifoda qiymati mos keladi. yagona belgi ular orasidan qavs ichida bo'lmagan. Masalan, [^abc] "a", "b" yoki "c" dan boshqa har qanday belgiga mos keladi. [^a-z] lotin alifbosidagi kichik harflardan tashqari har qanday belgiga mos keladi.
^ Matn boshiga (yoki tartib satr satr bo'lsa, istalgan qatorning boshiga) mos keladi.
$ Matn oxiriga (yoki tartib satr satr bo'lsa, istalgan qatorning oxiriga) mos keladi.
\(\) yoki () Keyinchalik foydalanish mumkin bo'lgan "belgilangan pastki ifoda" (guruhlangan ifoda) e'lon qiladi (quyidagi elementga qarang: \ n). "Belgilangan pastki ifoda" ham "blok" hisoblanadi. Boshqa operatorlardan farqli o'laroq, bu (an'anaviy sintaksisda) teskari chiziqni talab qiladi; kengaytirilgan va Perlda \ belgisi kerak emas.
\n Qayerda n- bu 1 dan 9 gacha bo'lgan raqam; mos keladi n th belgilangan pastki ifoda (masalan (abcd)\0, ya'ni abcd belgilari nol bilan belgilangan). Ushbu dizayn nazariy jihatdan tartibsiz, kengaytirilgan muntazam ifoda sintaksisida qabul qilinmadi.
*
  • Yulduz bitta belgiga mos keladigan ifodadan keyin mos keladi nol yoki Ko'proq nusxalari bu (oldingi) ifoda. Masalan, "*" bo'sh qatorga mos keladi, "x", "y", "zx", "zyx" va boshqalar.
  • \n*, Qayerda n 1 dan 9 gacha bo'lgan raqam bo'lib, mos keladigan nol yoki undan ko'p holatlarga mos keladi n th belgilangan pastki ifoda. Misol uchun, "\(a.\)c\1*" "abcab" va "abcaba" ga mos keladi, lekin "abcac" emas.

"\(" va "\)" va undan keyin "*" qo'shilgan ibora noqonuniy deb hisoblanishi kerak. Ba'zi hollarda, u qavslar ichiga olingan satrning nol yoki undan ko'p takrorlanishiga mos keladi. Boshqalarida, "*" belgisini hisobga olgan holda, qavs ichiga olingan ifodaga mos keladi.

\{x,y\} Oxirgisiga mos keladi ( yaqinlashib kelayotgan) blok kamida sodir bo'ladi x va boshqa emas y bir marta. Masalan, "a\(3,5\)" "aaa", "aaaa" yoki "aaaaa" ga mos keladi. Boshqa operatorlardan farqli o'laroq, bu (an'anaviy sintaksisda) teskari chiziqni talab qiladi.
.* Muntazam ifodaning ikki qismi orasidagi istalgan belgilarning istalgan sonini belgilash.

Metabelgilar bizga turli xil mosliklardan foydalanishga yordam beradi. Lekin qanday qilib biz metabelgini muntazam belgi sifatida, ya'ni [ (kvadrat qavs) belgisini kvadrat qavs ma'nosi bilan ifodalashimiz mumkin? Shunchaki:

  • oldin bo'lishi kerak ( qalqon) metabelgi (. * + \ ? ( )) teskari chiziq. Masalan \. yoki \[

Ba'zi belgilar to'plamining ta'rifini soddalashtirish uchun ular birlashtirildi. belgilar sinflari va toifalari. POSIX quyidagi jadvalda ko'rsatilganidek, ma'lum belgilar sinflari va toifalari deklaratsiyasini standartlashtirdi:

POSIX klassi xuddi shunday belgilash
[:yuqori:] bosh harflar
[:pastki:] kichik harflar
[:alfa:] katta va kichik harflar
[:alnum:] raqamlar, katta va kichik harflar
[:raqam:] raqamlar
[:xdigit:] o'n oltilik raqamlar
[:punkt:] [.,!?:…] tinish belgilari
[:bo'sh:] [\t] bo'sh joy va TAB
[:bo'sh joy:] [\t\n\r\f\v] belgilarni o'tkazib yuborish
[:cntrl:] nazorat belgilar
[:grafik:] [^\t\n\r\f\v] muhr belgilari
[:print:] [^\t\n\r\f\v] muhr belgilari va o'tkazib yuborilgan belgilar

Regexda shunday narsa bor:

Ochko'zlik regex

Men buni iloji boricha aniq tasvirlashga harakat qilaman. Aytaylik, biz hamma narsani topmoqchimiz HTML teglari ba'zi matnda. Muammoni lokalizatsiya qilgandan so'ng, biz ularning orasidagi qiymatlarni topmoqchimiz< и >, xuddi shu qavslar bilan birga. Lekin biz bilamizki, teglar har xil uzunliklarga ega va kamida 50 ta teg bor.Ularning barchasini sanab o'tish, ularni metasimbollarga qo'shish juda ko'p vaqt talab qiladigan ish. Lekin biz bilamizki, bizda bir ifoda bor.* (nuqta yulduzcha), bu qatordagi istalgan belgilarning istalgan sonini tavsiflaydi. Ushbu iboradan foydalanib, biz matnda topishga harakat qilamiz (

Shunday qilib, LSI MegaRAID kontrollerida RAID 10/50 darajasini qanday yaratish mumkin (shuningdek, Intel SRCU42x, Intel SRCS16 uchun ham tegishli):

) orasidagi barcha qiymatlar< и >. Natijada, BUTUN satr ushbu ifodaga mos keladi. nega, chunki regex GREEDY bo'lib, ular orasidagi HAMMA sondagi belgilarni olishga harakat qiladi< и >, mos ravishda butun chiziq, boshlovchi < p>Shunday qilib... va tugashi ...> bu qoidaga tegishli bo'ladi!

Umid qilamanki, bu misol ochko'zlik nima ekanligini aniqlab beradi. Ushbu ochko'zlikdan xalos bo'lish uchun siz quyidagi yo'ldan borishingiz mumkin:

  • belgilarni hisobga olish Yo'q kerakli naqshga mos keladi (masalan:<[^>]*> yuqoridagi holat uchun)
  • ochko'zlikdan xalos bo'ling:
    • *? - "ochko'z emas" ("dangasa") ekvivalenti *
    • +? - "ochko'z emas" ("dangasa") ekvivalenti +
    • (n,)? - “ochko‘z emas” (“dangasa”) ekvivalenti (n,)
    • .*? - “ochko‘z emas” (“dangasa”) ekvivalenti.*

Men yuqorida aytilganlarning barchasiga qo'shimcha qilmoqchiman kengaytirilgan muntazam ifoda sintaksisi:

POSIX-dagi oddiy iboralar an'anaviy Unix sintaksisiga o'xshaydi, lekin ba'zi meta-belgilar qo'shilishi bilan:

Bundan tashqari ekanligini bildiradi oldingi belgisi yoki guruh takrorlanishi mumkin bir yoki bir necha marta. Yulduzchadan farqli o'laroq, kamida bitta takrorlash kerak.

So'roq belgisi qiladi oldingi belgi yoki guruh ixtiyoriy. Boshqacha qilib aytganda, tegishli qatorda u yo'qligi yoki mavjud bo'lishi mumkin silliq bitta bir marta.

Vertikal bar muntazam ifoda muqobillarini ajratadi. Bitta belgi ikkita muqobilni bildiradi, lekin ular ko'proq bo'lishi mumkin, shunchaki ko'proq vertikal chiziqlardan foydalaning. Shuni esda tutish kerakki, ushbu operator maksimaldan foydalanadi mumkin bo'lgan qism ifodalar. Shu sababli, muqobil operator ko'pincha qavs ichida ishlatiladi.

Teskari chiziqlardan foydalanish ham bekor qilindi: \(…\) (…) va \(…\) (…) ga aylanadi.

Xabarni yakunlash uchun men regexdan foydalanishga misollar keltiraman:

$ cat text1 1 olma 2 nok 3 banan $ grep p text1 1 olma 2 nok $ grep "pp*" text1 1 olma 2 nok $ cat text1 | grep "l\|n" 1 olma 3 banan $ echo -e "bu yerda\n* toping" | grep "\*" * bu yerda $ grep "pl\?.*r" text1 # p, r 2 nok bo'lgan satrlarda $ grep "a.." text1 # satrlardan keyin kamida 2 ta belgidan iborat 1 olma 3 banana $ grep "" text1 # 3 yoki p o'z ichiga olgan qatorlarni qidiring 1 olma 2 nok 3 banan $ echo -e "bir joydan\n* toping." | grep "[.*]" * bu yerda biror joyda..name]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # a dan keyin kelgan barcha qatorlarda a ni A bilan almashtiring a yoki p dan keyin keladi p 1 Olma 2 nok 3 bAnAnA *\./ OXIRGI SO'Z./g" Birinchi. OXIRGI SO'Z. Bu OXIRGI SO'Z.

Hurmat bilan, MakSim!

Muntazam iboralar juda kuchli vosita matnni naqsh bo'yicha qidirish, satrlarni qayta ishlash va o'zgartirish uchun, bu ko'plab muammolarni hal qilish uchun ishlatilishi mumkin. Mana asosiylari:

  • Matn kiritishni tekshirish;
  • Fayldagi matnni qidirish va almashtirish;
  • Fayllarni ommaviy qayta nomlash;
  • Apache kabi xizmatlar bilan o'zaro aloqa;
  • Naqshga mos keladigan satrni tekshirish.

Bu uzoq to'liq ro'yxat, muntazam iboralar sizga ko'proq narsani qilish imkonini beradi. Ammo yangi foydalanuvchilar uchun ular juda murakkab ko'rinishi mumkin, chunki ularni yaratish uchun ular maxsus tildan foydalanadilar. Ammo taqdim etilgan imkoniyatlarni hisobga olgan holda, har bir tizim ma'muri Linux oddiy ifodalarini bilishi va ulardan foydalanishi kerak.

Ushbu maqolada biz yangi boshlanuvchilar uchun oddiy bash iboralarini ko'rib chiqamiz, shunda siz ushbu vositaning barcha xususiyatlarini tushunishingiz mumkin.

Muntazam iboralarda ishlatilishi mumkin bo'lgan ikki turdagi belgilar mavjud:

  • oddiy harflar;
  • meta-belgilar.

Umumiy belgilar har qanday qatorni tashkil etuvchi harflar, raqamlar va tinish belgilaridir. Barcha matnlar harflardan iborat bo'lib, siz ularni oddiy iboralarda matndagi kerakli pozitsiyani topish uchun ishlatishingiz mumkin.

Metabelgilar boshqa narsa, ular muntazam ifodalarga o'z kuchini beradi. Metabelgilar yordamida siz faqat bitta belgi qidirishdan ko'proq narsani qilishingiz mumkin. Siz belgilar kombinatsiyasini qidirishingiz, belgilarning dinamik sonidan foydalanishingiz va diapazonlarni tanlashingiz mumkin. Barcha maxsus belgilarni ikki turga bo'lish mumkin: oddiy belgilar o'rnini bosuvchi almashtirish belgilar yoki belgi necha marta takrorlanishi mumkinligini ko'rsatadigan operatorlar. Muntazam ifoda sintaksisi quyidagicha ko'rinadi:

muntazam_belgi maxsus belgi_operator

maxsus_almashtirish_belgi maxsus belgi_operator

  • \ - alfavitdagi maxsus belgilar teskari chiziq bilan boshlanadi va u har qanday tinish belgisi shaklida maxsus belgidan foydalanish kerak bo'lganda ham qo'llaniladi;
  • ^ - qatorning boshlanishini ko'rsatadi;
  • $ - qatorning oxirini ko'rsatadi;
  • * - oldingi belgi 0 yoki undan ortiq marta takrorlanishi mumkinligini bildiradi;
  • + - oldingi belgi bir yoki bir necha marta takrorlanishi kerakligini ko'rsatadi;
  • ? - oldingi belgi nol yoki bir marta sodir bo'lishi mumkin;
  • (n)- oldingi belgi necha marta (n) takrorlanishi kerakligini ko'rsatadi;
  • (N, n)- oldingi belgi N dan n martagacha takrorlanishi mumkin;
  • . - satr tasmasidan tashqari har qanday belgi;
  • - qavs ichida ko'rsatilgan har qanday belgi;
  • x|y- x belgisi yoki y belgisi;
  • [^az]- qavs ichida ko'rsatilganlardan tashqari har qanday belgi;
  • - belgilangan diapazondagi istalgan belgi;
  • [^a-z]- diapazonda bo'lmagan har qanday belgi;
  • \b- so‘z chegarasini bo‘sh joy bilan bildiradi;
  • \B- belgi so'z ichida bo'lishi kerakligini bildiradi, masalan, ux uxb yoki smoking bilan mos keladi, lekin Linuxga mos kelmaydi;
  • \d- belgi son ekanligini bildiradi;
  • \D- raqamli bo'lmagan belgi;
  • \n- chiziqli tasma belgisi;
  • \s- bo'sh joy belgilaridan biri, bo'sh joy, tab va boshqalar;
  • \S- bo'sh joydan tashqari har qanday belgi;
  • \t- yorliq belgisi;
  • \v- vertikal yorliq belgisi;
  • \w- har qanday alifbo belgisi, shu jumladan pastki chiziq;
  • \V- har qanday alifbo belgisi, pastki chiziqdan tashqari;
  • \uXXX- Unicdoe belgisi.

Shuni ta'kidlash kerakki, alifbodagi maxsus belgilardan oldin maxsus belgi kelishini ko'rsatish uchun chiziq chizig'idan foydalanish kerak. Buning teskarisi ham to'g'ri, agar siz chiziqsiz ishlatiladigan maxsus belgini oddiy belgi sifatida ishlatmoqchi bo'lsangiz, unda siz chiziq qo'shishingiz kerak bo'ladi.

Masalan, siz matnda 1+ 2=3 qatorini topmoqchisiz. Agar siz ushbu qatorni muntazam ifoda sifatida ishlatsangiz, hech narsa topa olmaysiz, chunki tizim plyusni oldingi birlik bir yoki bir necha marta takrorlanishi kerakligini ko'rsatadigan maxsus belgi sifatida izohlaydi. Shunday qilib, undan qochish kerak: 1 \+ 2 = 3. Qochimasdan, bizning oddiy ifodamiz faqat 11=3 yoki 111=3 qatoriga mos keladi va hokazo. Tengning oldiga chiziq qo'yishning hojati yo'q, chunki bu maxsus belgi emas.

Muntazam iboralardan foydalanishga misollar

Endi biz asoslarni ko‘rib chiqdik va siz hamma narsa qanday ishlashini bilasiz, qolgan narsa Linux grep muntazam ifodalari haqida olgan bilimlaringizni amalda mustahkamlashdir. Ikkita juda foydali maxsus belgilar ^ va $ qatorning boshi va oxirini bildiradi. Masalan, biz nomi s bilan boshlangan barcha foydalanuvchilarni tizimimizda ro'yxatdan o'tkazmoqchimiz. Keyin oddiy ifodadan foydalanishingiz mumkin "^s". Siz egrep buyrug'idan foydalanishingiz mumkin:

egrep "^s" /etc/passwd

Agar biz satrdagi oxirgi belgi asosida qatorlarni tanlamoqchi bo'lsak, buning uchun $ dan foydalanishimiz mumkin. Masalan, barcha tizim foydalanuvchilarini tanlaymiz, qobiqsiz, bunday foydalanuvchilar haqidagi yozuvlar noto'g'ri tugaydi:

egrep "false$" /etc/passwd

s yoki d bilan boshlanadigan foydalanuvchi nomlarini ko'rsatish uchun quyidagi ifodadan foydalaning:

egrep "^" /etc/passwd

Xuddi shu natijani "|" belgisi yordamida olish mumkin. Birinchi variant diapazonlar uchun ko'proq mos keladi, ikkinchisi esa odatiy yoki/yoki:

egrep "^" /etc/passwd

Endi nomi uch belgidan iborat bo'lmagan barcha foydalanuvchilarni tanlaymiz. Foydalanuvchi nomi ikki nuqta bilan tugaydi. Aytishimiz mumkinki, u har qanday alifbo belgisini o'z ichiga olishi mumkin, uni yo'g'on ichakdan oldin uch marta takrorlash kerak:

egrep "^\w(3):" /etc/passwd

xulosalar

Ushbu maqolada biz Linux oddiy iboralarini ko'rib chiqdik, ammo bu faqat asoslar edi. Agar siz biroz chuqurroq qazsangiz, ushbu vosita yordamida juda ko'p qiziqarli narsalarni qilishingiz mumkinligini bilib olasiz. Muntazam iboralarni o'zlashtirishga vaqt ajratish, albatta, bunga arziydi.

Xulosa qilish uchun Yandex-dan muntazam iboralar haqida ma'ruza:



 


O'qing:



Eng yaxshi simsiz minigarnituralar reytingi

Eng yaxshi simsiz minigarnituralar reytingi

Universal quloqlarni arzon sotib olish mumkinmi? 3000 rubl - bunday pulga yuqori sifatli eshitish vositalarini sotib olish mumkinmi? Ma'lum bo'lishicha, ha. Va nutq ...

Mobil qurilmaning asosiy kamerasi odatda tananing orqa tomonida joylashgan bo'lib, fotosuratlar va videolarni olish uchun ishlatiladi.

Mobil qurilmaning asosiy kamerasi odatda tananing orqa tomonida joylashgan bo'lib, fotosuratlar va videolarni olish uchun ishlatiladi.

Yaxshilangan xarakteristikalar va yuqori avtonomiyaga ega planshet telefonining yangilangan versiyasi.Acer tomonidan ishlab chiqarilgan smartfonlar kamdan-kam hollarda tashrif buyuruvchilarga aylanadi...

Raqamingizni saqlab qolgan holda boshqa operatorga qanday o'tish mumkin

Raqamingizni saqlab qolgan holda boshqa operatorga qanday o'tish mumkin

Rossiyada 1 dekabrdan boshlab abonent boshqa uyali aloqa operatoriga o‘tganda telefon raqamini saqlab qolish to‘g‘risidagi qonun kuchga kirdi. Biroq, ma'lum bo'lishicha, ...

phabletni ko'rib chiqish, qimmat, lekin juda malakali

phabletni ko'rib chiqish, qimmat, lekin juda malakali

Qimmatbaho, lekin juda malakali fablet sharhi 20.03.2015 Men dunyodagi etiksiz yagona poyabzalchiman, o'z smartfonimsiz smartfon sharhlovchisiman....

tasma tasviri RSS