GREP va muntazam iboralar bo'yicha o'quv dasturi. Linuxda muntazam ifodalardan (regex) foydalanish grep muntazam ifodalar jadvali

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. Buyruqlar satrida so'rov va qidiruv maydonini (faylni) kiritish orqali qidirishingiz mumkin.
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 uy katalogidagi barcha fayllardan satrlarni ko'rsatadi joriy foydalanuvchi, ismlari ~/.bash bilan boshlanadi, nomlari qator tarixini o'z ichiga olgan fayllar bundan mustasno, ~/.bash_history faylida topilgan mosliklarni istisno qilish uchun, ularning yuqori yoki kichik harflarida bir xil satr bo'lishi mumkin. 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. Qavs ichidagi ifodaning an'anaviy talqinidan foydalanish uchun LC_ALL muhit o'zgaruvchisini "C" ga o'rnatish orqali C tilidan foydalanishingiz mumkin.

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 siz "c" dan boshlanib, "h" bilan tugaydigan beshta belgidan iborat bo'lgan barcha inglizcha so'zlar ro'yxatini lug'atdan olishni istasangiz (krossvordlarni echishda 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 fayl yoki chiqish oqimida tom ma'noda yulduzcha belgisini topmoqchi bo'lsangiz, foydalaning yagona tirnoq. 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

Bash skriptlarida matnlarni sed va awk yordamida to'liq qayta ishlash uchun oddiy iboralarni tushunish kifoya. Bu eng foydali vositani amalga oshirishni hamma joyda tom ma'noda uchratish mumkin va barcha muntazam iboralar o'xshash tarzda tuzilgan va bir xil g'oyalarga asoslangan bo'lsa-da, ular bilan turli muhitlarda ishlash muayyan xususiyatlarga ega. Bu erda biz skriptlarda foydalanish uchun mos bo'lgan muntazam iboralar haqida gapiramiz buyruq qatori Linux.

Ushbu material oddiy iboralarga kirish sifatida mo'ljallangan bo'lib, ular nima ekanligini umuman bilmaganlar uchun mo'ljallangan. Shunday qilib, keling, eng boshidan boshlaylik.

Muntazam iboralar nima

Ko'p odamlar, birinchi marta muntazam iboralarni ko'rganlarida, darhol ma'nosiz belgilar aralashganligini ko'rmoqdalar deb o'ylashadi. Ammo bu, albatta, bundan uzoqdir. Masalan, ushbu regexni ko'rib chiqing


Bizning fikrimizcha, hatto mutlaq boshlang'ich ham uning qanday ishlashini va nima uchun kerakligini darhol tushunadi :) Agar siz buni to'liq tushunmasangiz, shunchaki o'qing va hamma narsa joyiga tushadi.
Muntazam ifoda - bu sed yoki awk kabi dasturlar matnni filtrlash uchun foydalanadigan naqsh. Shablonlar o'zlarini ifodalovchi oddiy ASCII belgilaridan va alohida rol o'ynaydigan metabelgilardan foydalanadi, masalan, ma'lum belgilar guruhlariga murojaat qilish imkonini beradi.

Muntazam iboralar turlari

Muntazam iboralarni turli muhitlarda, masalan, Java, Perl va Python kabi dasturlash tillarida, sed, awk va grep kabi Linux vositalarida amalga oshirish muayyan xususiyatlarga ega. Bu xususiyatlar naqshlarni sharhlaydigan muntazam ifoda dvigatellariga bog'liq.
Linuxda ikkita oddiy ifoda mexanizmi mavjud:
  • POSIX Basic Regular Expression (BRE) standartini qo'llab-quvvatlaydigan vosita.
  • POSIX Extended Regular Expression (ERE) standartini qo'llab-quvvatlaydigan vosita.
Ko'pgina Linux yordamchi dasturlari hech bo'lmaganda POSIX BRE standartiga mos keladi, lekin ba'zi yordam dasturlari (shu jumladan sed) BRE standartining faqat bir qismini tushunadi. Ushbu cheklovning sabablaridan biri bu kabi yordamchi dasturlarni matnni qayta ishlashda imkon qadar tezroq qilish istagi.

POSIX ERE standarti ko'pincha dasturlash tillarida qo'llaniladi. Foydalanishga imkon beradi katta miqdor muntazam iboralarni ishlab chiqish vositalari. Misol uchun, bu matnda alohida so'zlarni yoki raqamlar to'plamini qidirish kabi tez-tez ishlatiladigan naqshlar uchun belgilarning maxsus ketma-ketligi bo'lishi mumkin. Awk ERE standartini qo'llab-quvvatlaydi.

Dasturchining fikriga va ular yaratilgan dvigatelning xususiyatlariga qarab muntazam iboralarni ishlab chiqishning ko'plab usullari mavjud. Har qanday dvigatel tushunadigan universal muntazam iboralarni yozish oson emas. Shuning uchun biz eng ko'p qo'llaniladigan muntazam iboralarga e'tibor qaratamiz va ularni sed va awk uchun amalga oshirish xususiyatlarini ko'rib chiqamiz.

POSIX BRE muntazam ifodalari

Ehtimol, eng oddiy BRE naqshlari matndagi belgilar ketma-ketligini aniq izlash uchun muntazam ifodadir. Satrni qidirish sed va awk da shunday ko'rinadi:

$ echo "Bu sinov" | sed -n "/test/p" $ echo "Bu sinov" | awk "/test/($0 chop etish)"

sedda naqsh bo'yicha matnni topish


Awk-da matnni naqsh bo'yicha topish

Berilgan naqshni qidirish satrdagi matnning aniq joylashuvini hisobga olmasdan amalga oshirilganligini sezishingiz mumkin. Bundan tashqari, hodisalar soni muhim emas. Muntazam ifoda topilgandan keyin berilgan matn chiziqning istalgan joyida chiziq mos deb hisoblanadi va keyingi ishlov berish uchun uzatiladi.

Muntazam iboralar bilan ishlashda ularning katta-kichik harflarga sezgir ekanligini hisobga olish kerak:

$ echo "Bu sinov" | awk "/Test/($0 chop etish)" $ echo "Bu sinov" | awk "/test/($0 chop etish)"

Muntazam iboralar katta-kichik harflarga sezgir

Birinchi oddiy iborada hech qanday moslik topilmadi, chunki matnda bosh harf bilan boshlangan “test” soʻzi uchramaydi. Ikkinchisi, bosh harflar bilan yozilgan so'zni qidirish uchun tuzilgan, oqimda mos keladigan qatorni topdi.

Oddiy iboralarda siz nafaqat harflardan, balki bo'shliq va raqamlardan ham foydalanishingiz mumkin:

$ echo "Bu yana sinov 2" | awk "/test 2/($0 chop etish)"

Bo'shliqlar va raqamlarni o'z ichiga olgan matn qismini topish

Bo'shliqlar muntazam ifoda mexanizmi tomonidan muntazam belgilar sifatida ko'rib chiqiladi.

Maxsus belgilar

Foydalanish turli belgilar Muntazam iboralarda siz ba'zi xususiyatlarni hisobga olishingiz kerak. Shunday qilib, shablonda foydalanish alohida yondashuvni talab qiladigan ba'zi maxsus belgilar yoki meta-belgilar mavjud. Mana ular:

.*^${}\+?|()
Agar shablonda ulardan biri kerak bo'lsa, uni teskari chiziq (teskari chiziq) yordamida olib tashlash kerak bo'ladi - \ .

Misol uchun, matnda dollar belgisini topishingiz kerak bo'lsa, uni shablonga qo'shishingiz kerak, undan oldin qochish belgisi mavjud. Aytaylik, quyidagi matnga ega myfile fayli mavjud:

Mening cho'ntagimda 10 dollar bor
Dollar belgisi ushbu naqsh yordamida aniqlanishi mumkin:

$awk "/\$/($0 chop etish)" mening faylim

Naqshdagi maxsus belgidan foydalanish

Bunga qo'shimcha ravishda, teskari chiziq ham maxsus belgidir, shuning uchun siz uni naqshda ishlatishingiz kerak bo'lsa, undan ham qochish kerak bo'ladi. Bu bir-biridan keyin ikkita qiyshiq chiziqqa o'xshaydi:

$ echo "\ - bu maxsus belgi" | awk "/\\/($0 chop etish)"

Teskari chiziqdan qochish

To'g'ri chiziq yuqoridagi maxsus belgilar ro'yxatiga kiritilmagan bo'lsa-da, uni sed yoki awk uchun yozilgan muntazam ifodada ishlatishga urinish xatolikka olib keladi:

$ echo "3/2" | awk "///($0 chop etish)"

Naqshda oldinga egri chiziqdan noto'g'ri foydalanish

Agar kerak bo'lsa, undan ham qochish kerak:

$ echo "3/2" | awk "/\//($0 chop etish)"

Oldinga qiyshiq chiziqdan qochish

Anchor belgilari

Naqshni matn satrining boshi yoki oxiriga ulash uchun ikkita maxsus belgi mavjud. Bosh belgisi - ^ matn satrlari boshida joylashgan belgilar ketma-ketligini tasvirlash imkonini beradi. Agar siz izlayotgan naqsh satrning boshqa joyida bo'lsa, muntazam ifoda unga javob bermaydi. Ushbu belgidan foydalanish quyidagicha ko'rinadi:

$ echo "likegeeks veb-saytiga xush kelibsiz" | awk "/^likegeeks/($0 chop etish)" $ echo "likegeeks veb-sayti" | awk "/^likegeeks/($0 chop etish)"

Satrning boshida naqsh topish

^ belgisi satr boshida naqsh izlash uchun mo'ljallangan, shu bilan birga belgilarning holati ham hisobga olinadi. Keling, bu matn faylini qayta ishlashga qanday ta'sir qilishini ko'rib chiqaylik:

$awk "/^this/($0 chop etish)" mening faylim


Fayldan matndagi satr boshida naqsh topish

Sed dan foydalanganda, agar siz naqshning biron bir joyiga qopqoq qo'ysangiz, u boshqa har qanday oddiy belgilar kabi ko'rib chiqiladi:

$ echo "Bu ^ sinovdir" | sed -n "/s ^/p"

Qopqoq sedda naqsh boshida emas

awk da, xuddi shu shablondan foydalanganda, bu belgidan qochish kerak:

$ echo "Bu ^ sinovdir" | awk "/s\^/($0 chop etish)"

Awk da shablonning boshida yopmang

Biz satr boshida joylashgan matn qismlarini qidirishni aniqladik. Agar qator oxirida biror narsani topish kerak bo'lsa-chi?

Dollar belgisi - $, chiziq oxiri uchun langar belgisi bunda bizga yordam beradi:

$ echo "Bu sinov" | awk "/test$/($0 chop etish)"

Qator oxiridagi matnni topish

Xuddi shu shablonda ikkala langar belgisidan ham foydalanishingiz mumkin. Quyidagi rasmda mazmuni ko'rsatilgan myfile faylini quyidagi oddiy ifoda yordamida qayta ishlaymiz:

$ awk "/^ bu sinov $/($0 chop etish)" mening faylim


Qatorni boshlash va tugatish uchun maxsus belgilardan foydalanadigan naqsh

Ko'rib turganingizdek, shablon faqat berilgan belgilar ketma-ketligiga va ularning joylashuviga to'liq mos keladigan chiziqqa javob berdi.

Anchor belgilar yordamida bo'sh satrlarni qanday filtrlash mumkin:

$awk "!/^$/($0 chop etish)" mening faylim
Ushbu shablonda men inkor belgisi, undov belgisidan foydalandim - ! . Ushbu naqshdan foydalanib, satrning boshi va oxiri o'rtasida hech narsa bo'lmagan satrlarni qidiradi va rahmat undov belgisi Faqat ushbu naqshga mos kelmaydigan chiziqlar chop etiladi.

Nuqta belgisi

Nuqta yangi satr belgisidan tashqari har qanday bitta belgiga mos kelish uchun ishlatiladi. Keling, myfile faylini ushbu oddiy ifodaga o'tkazamiz, uning mazmuni quyida keltirilgan:

$awk "/.st/($0 chop etish)" mening faylim


Muntazam iboralarda nuqtadan foydalanish

Chiqish ma'lumotlaridan ko'rinib turibdiki, faylning faqat birinchi ikkita satri naqshga to'g'ri keladi, chunki ular boshqa belgidan oldin "st" belgilar ketma-ketligini o'z ichiga oladi, uchinchi qatorda esa mos ketma-ketlik mavjud emas va to'rtinchisi bor, lekin qatorning boshida joylashgan.

Qahramonlar sinflari

Nuqta har qanday bitta belgiga mos keladi, lekin siz izlayotgan belgilar to‘plamini cheklashda yanada moslashuvchan bo‘lishni istasangiz-chi? Bunday vaziyatda siz belgilar sinflaridan foydalanishingiz mumkin.

Ushbu yondashuv tufayli siz berilgan to'plamdan istalgan belgilarni qidirishni tashkil qilishingiz mumkin. Belgilar sinfini tavsiflash uchun kvadrat qavslar ishlatiladi:

$awk "/th/($0 chop etish)" mening faylim


Muntazam ifodadagi belgilar sinfining tavsifi

Bu erda biz "o" yoki "i" belgisidan oldin "th" belgilar ketma-ketligini qidiramiz.

Katta yoki kichik harf bilan boshlanishi mumkin bo'lgan so'zlarni qidirishda sinflar foydali bo'ladi:

$ echo "bu sinov" | awk "/uning sinovi/($0 chop etish)" $ echo "Bu sinov" | awk "/uning sinovi/($0 chop eting)"

Kichik yoki katta harf bilan boshlanishi mumkin bo'lgan so'zlarni qidiring

Belgilar sinflari harflar bilan cheklanmaydi. Bu yerda boshqa belgilardan foydalanish mumkin. Qanday vaziyatda sinflar kerakligini oldindan aytish mumkin emas - barchasi hal qilinayotgan muammoga bog'liq.

Belgilar sinflarini inkor qilish

Belgilar sinflari yuqorida tavsiflangan teskari masalani hal qilish uchun ham ishlatilishi mumkin. Ya'ni, sinfga kiritilgan belgilarni qidirish o'rniga, siz sinfga kiritilmagan barcha narsalarni qidirishni tashkil qilishingiz mumkin. Ushbu muntazam ifoda xatti-harakatiga erishish uchun siz sinf belgilari ro'yxati oldiga ^ belgisini qo'yishingiz kerak. Bu shunday ko'rinadi:

$ awk "/[^oi]th/($0 chop etish)" mening faylim


Sinfda bo'lmagan belgilarni topish

Bunday holda, "o" yoki "i" dan oldin bo'lmagan "th" belgilar ketma-ketligi topiladi.

Belgilar diapazoni

Belgilar sinflarida siz chiziqchalar yordamida belgilar diapazonini tasvirlashingiz mumkin:

$awk "/st/($0 chop etish)" mening faylim


Belgilar sinfidagi belgilar qatorining tavsifi

IN bu misolda muntazam ibora ichida joylashgan har qanday belgidan oldin "st" belgilar ketma-ketligiga javob beradi alifbo tartibida, "e" va "p" belgilar orasida.

Raqamlardan diapazonlar ham yaratilishi mumkin:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Har qanday uchta raqamni topish uchun oddiy ifoda

Belgilar sinfi bir nechta diapazonlarni o'z ichiga olishi mumkin:

$awk "/st/($0 chop etish)" mening faylim


Bir nechta diapazondan iborat belgilar sinfi

Ushbu muntazam ibora "st" ning barcha ketma-ketliklarini topadi a-f diapazonlari va m-z.

Maxsus belgilar sinflari

BREda odatiy iboralarni yozishda foydalanishingiz mumkin bo'lgan maxsus belgilar sinflari mavjud:
  • [[:alpha:]] - katta yoki kichik harflarda yozilgan har qanday alifbo belgisiga mos keladi.
  • [[:alnum:]] - har qanday alfanumerik belgilarga mos keladi, ya'ni 0-9 , A-Z , a-z oralig'idagi belgilar.
  • [[:blank:]] - bo'sh joy va yorliq belgisiga mos keladi.
  • [[:digit:]] - 0 dan 9 gacha bo'lgan istalgan raqamli belgi.
  • [[:yuqori:]] - bosh alifbo belgilari - A-Z .
  • [[:pastki:]] - kichik alifbo belgilari - a-z .
  • [[:print:]] - har qanday bosma belgiga mos keladi.
  • [[:punct:]] - tinish belgilariga mos keladi.
  • [[:bo'sh joy:]] - bo'shliq belgilari, xususan - bo'sh joy, tab, belgilar NL, FF, VT, CR.
Quyidagi kabi shablonlarda maxsus sinflardan foydalanishingiz mumkin:

$ echo "abc" | awk "/[[:alpha:]]/($0 chop etish)" $ echo "abc" | awk "/[[:digit:]]/($0 chop etish)" $ echo "abc123" | awk "/[[:raqam:]]/($0 chop etish)"


Muntazam iboralardagi maxsus belgilar sinflari

Yulduz belgisi

Agar naqshdagi belgidan keyin yulduzcha qo‘ysangiz, bu belgi satrda bir necha marta paydo bo‘lsa, oddiy ibora ishlay oladi, shu jumladan, belgi qatorda mavjud bo‘lmagan holatlar ham.

$ echo "test" | awk "/tes*t/($0 chop etish)" $ echo "tessst" | awk "/tes*t/($0 chop etish)"


Oddiy iboralarda * belgisidan foydalanish

Ushbu joker belgi odatda doimiy ravishda noto'g'ri yozilgan so'zlar yoki bo'ysunadigan so'zlar uchun ishlatiladi turli xil variantlar to'g'ri yozilishi:

$ echo "Menga yashil rang yoqadi" | awk "/colou*r/(print $0)" $ echo "Menga yashil rang yoqadi" | awk "/colou*r/($0 chop etish)"

Har xil imloga ega so'zni topish

Bu misolda bir xil muntazam ibora “rang” so‘ziga ham, “rang” so‘ziga ham javob beradi. Buning sababi shundaki, "u" belgisidan keyin yulduzcha yo'q bo'lishi yoki ketma-ket bir necha marta paydo bo'lishi mumkin.

Yulduzcha belgisidan keladigan yana bir foydali xususiyat uni nuqta bilan birlashtirishdir. Bu kombinatsiya muntazam ifodaga istalgan belgilar soniga javob berishga imkon beradi:

$ awk "/this.*test/($0 chop etish)" mening faylim


Har qanday belgilar soniga javob beradigan shablon

Bunday holda, "bu" va "sinov" so'zlari orasida qancha va qanday belgilar mavjudligi muhim emas.

Yulduzcha belgilar sinflari bilan ham ishlatilishi mumkin:

$ echo "st" | awk "/s*t/($0 chop etish)" $ echo "o'tirdi" | awk "/s*t/(chop etish $0)" $ echo "to'siq" | awk "/s*t/($0 chop etish)"


Belgilar sinflari bilan yulduzchadan foydalanish

Har uch misolda ham muntazam ifoda ishlaydi, chunki belgilar sinfidan keyingi yulduzcha “a” yoki “e” belgilarning istalgan soni topilsa yoki hech biri topilmasa, satr berilgan naqshga mos kelishini bildiradi.

POSIX ERE muntazam ifodalar

Ba'zi Linux yordam dasturlarini qo'llab-quvvatlaydigan POSIX ERE shablonlari qo'shimcha belgilarni o'z ichiga olishi mumkin. Yuqorida aytib o'tilganidek, awk ushbu standartni qo'llab-quvvatlaydi, ammo sed yo'q.

Bu erda biz ERE naqshlarida eng ko'p qo'llaniladigan belgilarni ko'rib chiqamiz, ular o'zingizning oddiy iboralaringizni yaratishda sizga foydali bo'ladi.

▍Savol belgisi

Savol belgisi matnda oldingi belgi bir marta yoki umuman boʻlmasligini bildiradi. Bu belgi takroriy meta-belgilardan biridir. Mana bir nechta misollar:

$ echo "tet" | awk "/tes?t/($0 chop etish)" $ echo "test" | awk "/tes?t/($0 chop etish)" $ echo "test" | awk "/tes?t/($0 chop etish)"


Muntazam iboralarda savol belgisi

Ko'rib turganingizdek, uchinchi holatda "s" harfi ikki marta paydo bo'ladi, shuning uchun muntazam ibora "testst" so'ziga javob bermaydi.

Savol belgisini belgilar sinflari bilan ham ishlatish mumkin:

$ echo "tst" | awk "/t?st/($0 chop etish)" $ echo "test" | awk "/t?st/($0 chop etish)" $ echo "tast" | awk "/t?st/($0 chop etish)" $ echo "taest" | awk "/t?st/($0 chop etish)" $ echo "test" | awk "/t?st/($0 chop etish)"


Savol belgisi va belgilar sinflari

Agar satrda sinfdan belgilar bo'lmasa yoki ulardan biri bir marta sodir bo'lsa, muntazam ifoda ishlaydi, lekin so'zda ikkita belgi paydo bo'lishi bilanoq, tizim matndagi naqshga mos keladigan narsani topa olmaydi.

▍Plyus belgisi

Naqshdagi ortiqcha belgi, agar oldingi belgi matnda bir yoki bir necha marta uchrasa, oddiy ibora izlayotgan narsaga mos kelishini bildiradi. Biroq, bu qurilish ramzning yo'qligiga ta'sir qilmaydi:

$ echo "test" | awk "/te+st/($0 chop etish)" $ echo "teest" | awk "/te+st/($0 chop etish)" $ echo "tst" | awk "/te+st/($0 chop etish)"


Muntazam iboralardagi ortiqcha belgisi

Ushbu misolda, agar so'zda "e" belgisi bo'lmasa, oddiy iboralar mexanizmi matndagi naqshga mos keladigan topa olmaydi. Plyus belgisi belgilar sinflari bilan ham ishlaydi - shu tarzda u yulduzcha va savol belgisiga o'xshaydi:

$ echo "tst" | awk "/t+st/($0 chop etish)" $ echo "test" | awk "/t+st/(chop etish $0)" $ echo "teast" | awk "/t+st/($0 chop etish)" $ echo "teeast" | awk "/t+st/($0 chop etish)"


Plyus belgilar va belgilar sinflari

Bunday holda, agar satrda sinfdan biron bir belgi bo'lsa, matn naqshga mos keladi deb hisoblanadi.

▍Jingalak qavslar

ERE naqshlarida ishlatilishi mumkin bo'lgan jingalak qavslar yuqorida ko'rib chiqilgan belgilarga o'xshaydi, ammo ular oldingi belgining zarur bo'lgan takrorlanish sonini aniqroq belgilashga imkon beradi. Cheklovni ikkita formatda belgilashingiz mumkin:
  • n - qidirilayotgan hodisalarning aniq sonini ko'rsatadigan raqam
  • n, m ikkita raqam bo'lib, ular quyidagicha talqin qilinadi: "kamida n marta, lekin m dan ko'p emas."
Mana birinchi variantga misollar:

$ echo "tst" | awk "/te(1)st/($0 chop etish)" $ echo "test" | awk "/te(1)st/($0 chop etish)"

Naqshlardagi jingalak qavslar, aniq hodisalar sonini qidirish

Awk ning eski versiyalarida dastur muntazam ifodalardagi intervallarni tanib olishi uchun --re-interval buyruq qatoridan foydalanishingiz kerak edi, ammo yangi versiyalarda bu shart emas.

$ echo "tst" | awk "/te(1,2)st/($0 chop etish)" $ echo "test" | awk "/te(1,2)st/($0 chop etish)" $ echo "teest" | awk "/te(1,2)st/($0 chop etish)" $ echo "teeest" | awk "/te(1,2)st/($0 chop etish)"


Jingalak qavs ichida belgilangan interval

Ushbu misolda "e" belgisi qatorda 1 yoki 2 marta paydo bo'lishi kerak, keyin oddiy ibora matnga javob beradi.

Jingalak qavslar belgilar sinflari bilan ham ishlatilishi mumkin. Siz allaqachon bilgan printsiplar bu erda qo'llaniladi:

$ echo "tst" | awk "/t(1,2)st/($0 chop etish)" $ echo "test" | awk "/t(1,2)st/($0 chop etish)" $ echo "test" | awk "/t(1,2)st/($0 chop etish)" $ echo "teeast" | awk "/t(1,2)st/($0 chop etish)"


Jingalak qavslar va belgilar sinflari

Shablon bir yoki ikki marta “a” yoki “e” belgisini o'z ichiga olsa, matnga munosabat bildiradi.

▍Mantiqiy “yoki” belgisi

Belgi | - vertikal chiziq muntazam iboralarda mantiqiy “yoki” degan ma'noni anglatadi. Bunday belgi bilan ajratilgan bir nechta fragmentlarni o'z ichiga olgan muntazam iborani qayta ishlashda, vosita tahlil qilingan matnni, agar u fragmentlardan biriga mos kelsa, mos deb hisoblaydi. Mana bir misol:

$ echo "Bu sinov" | awk "/test|imtihon/($0 chop etish)" $ echo "Bu imtihon" | awk "/test|imtihon/($0 chop etish)" $ echo "Bu boshqa narsa" | awk "/test|imtihon/($0 chop etish)"


Muntazam iboralarda mantiqiy "yoki"

Ushbu misolda oddiy ibora matnda "test" yoki "imtihon" so'zlarini qidirish uchun tuzilgan. Iltimos, shablon qismlari va ularni ajratuvchi belgi o'rtasida | bo'shliqlar bo'lmasligi kerak.

Oddiy ifoda fragmentlarini qavslar yordamida guruhlash mumkin. Agar ma'lum belgilar ketma-ketligini guruhlashtirsangiz, u tizim tomonidan oddiy belgi sifatida qabul qilinadi. Ya'ni, masalan, takroriy meta-belgilar unga qo'llanilishi mumkin. Bu shunday ko'rinadi:

$ echo "Like" | awk "/Like(Geeks)?/($0 chop etish)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/($0 chop etish)"


Muntazam ifoda fragmentlarini guruhlash

Ushbu misollarda "Geeks" so'zi qavslar ichiga olingan, so'ngra savol belgisi. Eslatib o'tamiz, savol belgisi "0 yoki 1 ta takrorlash" degan ma'noni anglatadi, shuning uchun muntazam ibora "Like" qatoriga ham, "LikeGeeks" qatoriga ham javob beradi.

Amaliy misollar

Endi biz muntazam iboralar asoslarini ko'rib chiqdik, endi ular bilan foydali narsalarni qilish vaqti keldi.

▍Fayllar sonini hisoblash

O'zgaruvchiga yozilgan kataloglarda joylashgan fayllarni hisoblaydigan bash skriptini yozamiz atrof-muhit PATH. Buni amalga oshirish uchun siz avval katalog yo'llari ro'yxatini yaratishingiz kerak bo'ladi. Keling, buni sed yordamida bajaramiz, ikki nuqtani bo'sh joylar bilan almashtiramiz:

$ echo $PATH | sed "s/:/ /g"
O'zgartirish buyrug'i matnni qidirish naqshlari sifatida muntazam ifodalarni qo'llab-quvvatlaydi. Bu holda, hamma narsa juda oddiy, biz yo'g'on nuqta belgisini qidirmoqdamiz, lekin bu erda boshqa narsadan foydalanish uchun hech kim bizni bezovta qilmaydi - barchasi aniq vazifaga bog'liq.
Endi siz olingan ro'yxatni tsiklda ko'rib chiqishingiz va fayllar sonini hisoblash uchun zarur bo'lgan amallarni bajarishingiz kerak. Skriptning umumiy sxemasi quyidagicha bo'ladi:

Mypath=$(echo $PATH | sed "s/:/ /g") $mypath katalogidagi katalog uchun bajarildi
Endi har bir katalogdagi fayllar soni haqida ma'lumot olish uchun ls buyrug'idan foydalanib, skriptning to'liq matnini yozamiz:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") $mypath ichidagi katalog uchun count=0 do check=$(ls $katalog) $check do count=$ [ $count + 1 ] bajarildi echo "$katalog - $count" count=0 bajarildi
Skriptni ishga tushirganda, PATH-dan ba'zi kataloglar mavjud emasligi aniqlanishi mumkin, ammo bu uning mavjud kataloglardagi fayllarni hisoblashiga to'sqinlik qilmaydi.


Fayllarni hisoblash

Ushbu misolning asosiy qiymati shundaki, xuddi shu yondashuvdan foydalanib, siz ancha murakkab muammolarni hal qilishingiz mumkin. Qaysi biri sizning ehtiyojlaringizga bog'liq.

▍Elektron pochta manzillarini tekshirish

Manzillarni tekshirish imkonini beruvchi oddiy iboralarning katta to'plamiga ega veb-saytlar mavjud Elektron pochta, telefon raqamlari, va hokazo. Biroq, tayyor narsalarni olish boshqa, o'zingiz yaratish boshqa narsa. Shunday qilib, elektron pochta manzillarini tekshirish uchun muntazam ifoda yozamiz. Keling, manba ma'lumotlarini tahlil qilishdan boshlaylik. Bu erda, masalan, ma'lum bir manzil:

[elektron pochta himoyalangan]
Foydalanuvchi nomi, foydalanuvchi nomi alfanumerik va boshqa belgilardan iborat bo'lishi mumkin. Ya'ni, bu nuqta, tire, pastki chiziq, ortiqcha belgisi. Foydalanuvchi nomidan keyin @ belgisi qo'yiladi.

Ushbu bilimlar bilan qurollangan holda, foydalanuvchi nomini tekshirish uchun ishlatiladigan oddiy iborani uning chap tomonidan yig'ishni boshlaylik. Mana bizda nima bor:

^(+)@
Ushbu muntazam iborani quyidagicha o'qish mumkin: "Chiziq kvadrat qavs ichida ko'rsatilgan guruhdagilardan kamida bitta belgidan keyin @ belgisi bilan boshlanishi kerak."

Endi - xost nomi navbati - hostname . Bu erda foydalanuvchi nomi bilan bir xil qoidalar qo'llaniladi, shuning uchun shablon quyidagicha ko'rinadi:

(+)
Yuqori darajadagi domen nomiga bo'ysunadi maxsus qoidalar. Faqat alifbo belgilari bo'lishi mumkin, ulardan kamida ikkitasi bo'lishi kerak (masalan, bunday domenlar odatda mamlakat kodini o'z ichiga oladi) va beshdan ko'p bo'lmasligi kerak. Bularning barchasi manzilning oxirgi qismini tekshirish uchun shablon quyidagicha bo'lishini anglatadi:

\.({2,5})$
Siz buni shunday o'qishingiz mumkin: "Avval nuqta bo'lishi kerak, keyin 2 dan 5 gacha alifbo belgilari va shundan keyin chiziq tugaydi."

Muntazam ifodaning alohida qismlari uchun shablonlarni tayyorlab, ularni birlashtiramiz:

^(+)@(+)\.({2,5})$
Endi nima bo'lganini sinab ko'rish qoladi:

$ echo " [elektron pochta himoyalangan]" | awk "/^(+)@(+)\.((2,5))$/($0 chop etish)" $ echo " [elektron pochta himoyalangan]" | awk "/^(+)@(+)\.((2,5))$/($0 chop etish)"


Oddiy iboralar yordamida elektron pochta manzilini tekshirish

awk ga uzatilgan matn ekranda ko'rsatilishi tizim uni elektron pochta manzili sifatida tan olganligini bildiradi.

Natijalar

Agar maqolaning boshida siz duch kelgan elektron pochta manzillarini tekshirish uchun odatiy ibora o'sha paytda mutlaqo tushunarsiz bo'lib tuyulgan bo'lsa, endi u endi ma'nosiz belgilar to'plamiga o'xshamaydi deb umid qilamiz. Agar bu haqiqatan ham shunday bo'lsa, demak bu material maqsadini amalga oshirdi. Darhaqiqat, oddiy iboralar - bu siz umr bo'yi o'rganishingiz mumkin bo'lgan mavzu, ammo biz ko'rib chiqqan ozgina narsa ham sizga ancha rivojlangan matnlarni qayta ishlovchi skriptlarni yozishga yordam beradi.

Ushbu materiallar seriyasida biz odatda juda ko'p narsalarni ko'rsatdik oddiy misollar tom ma'noda bir nechta satrlardan tashkil topgan bash skriptlari. Keyingi safar biz kattaroq narsani ko'rib chiqamiz.

Hurmatli kitobxonlar! Buyruqlar qatori skriptlarida matnni qayta ishlashda oddiy iboralardan foydalanasizmi?

Eng foydali va xususiyatlarga boy jamoalardan biri Linux terminali- "grep" buyrug'i. Grep qisqartmasi "global muntazam ifoda chop etish" (ya'ni, "hamma joyda muntazam ifodaga mos keladigan satrlarni qidiring va ularni chop eting") degan ma'noni anglatadi. Bu shuni anglatadiki, kiritilgan ma'lumotlar belgilangan naqshlarga mos keladimi yoki yo'qligini tekshirish uchun grep dan foydalanish mumkin.

Ko'rinishidan ahamiyatsiz bo'lib ko'ringan bu dastur to'g'ri foydalanilganda juda kuchli. Uning kirishni murakkab qoidalar asosida saralash qobiliyati uni ko'plab buyruqlar zanjirlarida mashhur bo'g'inga aylantiradi.

Ushbu qo'llanma grep buyrug'ining ba'zi imkoniyatlarini ko'rib chiqadi va keyin oddiy iboralardan foydalanishga o'tadi. Hammasi ichida tasvirlangan ushbu qo'llanma usullar virtual serverni boshqarishda qo'llanilishi mumkin.

Foydalanish asoslari

Eng oddiy shaklda grep matn faylidagi harf naqshlarining mos kelishini topish uchun ishlatiladi. Bu shuni anglatadiki, agar grepga qidiruv so'zi berilsa, u ushbu so'zni o'z ichiga olgan fayldagi har bir qatorni chop etadi.

Misol tariqasida, Ubuntu tizimidagi GNU General Public License 3-versiyasida "GNU" so'zini o'z ichiga olgan qatorlarni topish uchun grep dan foydalanishingiz mumkin.

cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU UMUMIY DAVLAT LITSENZIYASI





13. GNU Affero General Public License bilan foydalaning.
GNU Affero General Public License ning 3-versiyasi ostida bittaga
...
...

Birinchi argument "GNU" izlash uchun namunadir, ikkinchi argument "GPL-3" esa topiladigan kirish faylidir.

Natijada, matn naqshini o'z ichiga olgan barcha qatorlar chiqariladi. Ba'zilarida Linux distributivlari siz izlayotgan naqsh chiqish satrlarida ta'kidlanadi.

Umumiy variantlar

Odatiy bo'lib, grep buyrug'i oddiygina kirish faylida qat'iy belgilangan naqshlarni qidiradi va topilgan qatorlarni chop etadi. Biroq, grepning xatti-harakati ba'zi qo'shimcha bayroqlarni qo'shish orqali o'zgartirilishi mumkin.

Qidiruv parametrining registrini e'tiborsiz qoldirib, naqshning katta va kichik o'zgarishlarini qidirishingiz kerak bo'lsa, siz "-i" yoki "--ignore-case" yordam dasturidan foydalanishingiz mumkin.

Misol tariqasida, siz katta, kichik yoki aralash harflar bilan yozilgan "litsenziya" so'zini bir xil faylda qidirish uchun grep dan foydalanishingiz mumkin.

grep -i "litsenziya" GPL-3
GNU UMUMIY DAVLAT LITSENZIYASI
ushbu litsenziya hujjati, lekin uni o'zgartirishga yo'l qo'yilmaydi.
GNU General Public License - bu bepul, copyleft litsenziyasi
Ko'pgina dasturiy ta'minot va boshqa amaliy ishlar uchun litsenziyalar ishlab chiqilgan
GNU General Public License sizning erkinligingizni kafolatlash uchun mo'ljallangan
Ko'pgina dasturlarimiz uchun GNU General Public License; uchun ham amal qiladi


“Ushbu litsenziya” GNU General Public License 3-versiyasiga ishora qiladi.
"Dastur" ushbu litsenziyaga ega bo'lgan mualliflik huquqi bilan himoyalangan har qanday ishni anglatadi
...
...

Ko'rib turganingizdek, chiqishda "LITSENZA", "litsenziya" va "Litsenziya" mavjud. Agar faylda "LiCeNsE" nusxasi bo'lsa, u ham chiqariladi.
Belgilangan naqsh mavjud bo'lmagan barcha qatorlarni topishingiz kerak bo'lsa, siz "-v" yoki "--invert-match" bayroqlaridan foydalanishingiz mumkin.

Misol tariqasida, BSD litsenziyasida "the" so'zini o'z ichiga olmagan barcha qatorlarni qidirish uchun quyidagi buyruqdan foydalanishingiz mumkin:

grep -v "the" BSD
Barcha huquqlar himoyalangan.
Qayta taqsimlash va manba va ikkilik shakllarda, bilan yoki bo'lmasdan foydalanish
uchrashadi:
ushbu dasturiy ta'minotdan olingan mahsulotlarni ma'qullash yoki targ'ib qilish uchun ishlatilishi mumkin
oldindan yozma ruxsatisiz.
USHBU DASTURIY REGENTLAR VA HISSA QO'SHISHLAR TOMONIDAN TAQDIM ETILGAN ``"" VA
HAR QANDAY OG'ROQ YOKI KO'P KO'RSATILGAN KAFOLATLAR, JUMLADAN, LEKIN CHEKLANMAYDI,
...
...

Ko'rib turganingizdek, oxirgi ikki satrda "the" so'zi yo'q deb chiqdi, chunki "e'tibor bermaslik" buyrug'i ishlatilmagan.

Gugurt topilgan satr raqamlarini bilish har doim foydalidir. Ularni "-n" yoki "--line-number" bayroqlari yordamida topish mumkin.

Agar oldingi misolda ushbu bayroqni qo'llasangiz, quyidagi natija ko'rsatiladi:

grep -vn "the" BSD
2: Barcha huquqlar himoyalangan.
3:
4: Qayta taqsimlash va manba va ikkilik shakllarda, bilan yoki bo'lmasdan foydalanish
6: uchrashadi:
13: ushbu dasturiy ta'minotdan olingan mahsulotlarni ma'qullash yoki targ'ib qilish uchun ishlatilishi mumkin
14: maxsus yozma ruxsatisiz.
15:
16: USHBU DASTURIY REGENTLAR VA HISSA QO'YIShLARI TOMONIDAN TAQDIM ETILGAN """" VA
17: HAR QANDAY OG'ROQ YOKI KO'PLANGAN KAFOLATLAR, JUMLADAN, BIRINCHI EMAS,
...
...

Endi siz har bir satrda "the" bo'lmagan o'zgartirishlar kiritishingiz kerak bo'lganda qator raqamiga murojaat qilishingiz mumkin.

Oddiy ifodalar

Kirish qismida aytib o'tilganidek, grep "global muntazam ifoda chop etish" degan ma'noni anglatadi. Muntazam ifoda - bu ma'lum bir qidiruv naqshini tavsiflovchi matn qatori.

Turli xil ilovalar va dasturlash tillari oddiy iboralarni biroz boshqacha ishlatadi. Ushbu qo'llanma Grep uchun naqshlarni tasvirlash usullarining faqat kichik qismini qamrab oladi.

Harflar mos keladi

Yuqoridagi "GNU" va "the" so'zlarini qidirish misollarida "GNU" va "the" belgilar qatoriga to'liq mos keladigan juda oddiy oddiy iboralar qidirildi.

Ularni so'zlarning o'xshashligi sifatida emas, balki belgilar qatorlarining mos kelishi deb hisoblash to'g'riroq. Keyinchalik murakkab naqshlar bilan tanishganingizdan so'ng, bu farq yanada muhimroq bo'ladi.

Berilgan belgilarga to'liq mos keladigan naqshlar "harf" naqshlari deb ataladi, chunki ular naqshga harfma-harf, belgi-belgi bilan mos keladi.

Barcha alifbo va raqamli belgilar (va ba'zi boshqa belgilar), agar ular boshqa ifoda mexanizmlari bilan o'zgartirilmagan bo'lsa, tom ma'noda mos keladi.

Anchor o'yinlari

Anchorlar - bu kerakli mos keladigan satrdagi joyni ko'rsatadigan maxsus belgilar.

Misol uchun, siz qidiruv uchun faqat boshida "GNU" so'zini o'z ichiga olgan qatorlar kerakligini belgilashingiz mumkin. Buni amalga oshirish uchun siz harflar qatoridan oldin "^" langaridan foydalanishingiz kerak.

Ushbu misol faqat boshida "GNU" so'zini o'z ichiga olgan qatorlarni chop etadi.

grep "^GNU" GPL-3
Ko'pgina dasturlarimiz uchun GNU General Public License; uchun ham amal qiladi
GNU General Public License, siz nashr etilgan har qanday versiyani tanlashingiz mumkin

Xuddi shunday, "$" langari so'zma-so'z satrdan keyin faqat qidirilayotgan belgilar qatori matn satrining oxirida bo'lsa, mos kelishini ko'rsatish uchun ishlatilishi mumkin.

Quyidagi oddiy ifoda faqat oxirida "va" ni o'z ichiga olgan qatorlarni chop etadi:

grep "va $" GPL-3
ushbu bepul dasturiy ta'minot uchun hech qanday kafolat yo'qligi. Ikkala foydalanuvchi uchun" va
Nusxa ko'chirish, tarqatish uchun aniq shartlar va shartlar


muqobil faqat vaqti-vaqti bilan va notijorat ruxsat etiladi, va
o'zgartirish o'zi moddiy va qachon tarmoq rad etilishi mumkin
tarmoqning ishlashiga salbiy ta'sir qiladi yoki qoidalarni buzadi va
vaqtinchalik, agar mualliflik huquqi egasi aniq va
asl litsenziarlardan litsenziya oladi, ishga tushirish, o'zgartirish va
qilish, ishlatish, sotish, sotish uchun taklif qilish, import qilish va boshqa yo'l bilan ishga tushirish, o'zgartirish va

Har qanday belgini moslashtiring

Muntazam iboralarda nuqta (.) koʻrsatilgan joyda istalgan belgi paydo boʻlishi mumkinligini bildirish uchun ishlatiladi.

Misol uchun, agar siz ikkita belgidan va keyin "cept" ketma-ketligini o'z ichiga olgan mosliklarni topmoqchi bo'lsangiz, siz quyidagi naqshdan foydalanasiz:

grep "..cept" GPL-3
foydalanish, bu eng qabul qilinishi mumkin bo'lmagan joyda. Shuning uchun, biz
amaldagi mualliflik huquqi qonunchiligiga muvofiq huquqbuzarlik, uni amalga oshirish bundan mustasno
foydalanuvchiga ish uchun hech qanday kafolat yo'qligini aytadi (.dan tashqari

alohida yozilgan yoki istisno tariqasida ko'rsatilgan litsenziya shakli;
To'g'ridan-to'g'ri yo'l qo'yiladigan holatlar bundan mustasno, qamrab olingan ishni targ'ib qila olmaysiz yoki o'zgartira olmaysiz
9. Nusxalarga ega bo'lish uchun qabul qilish shart emas.
...
...

Ko'rib turganingizdek, natijalar "qabul qilaman" va "istisno" so'zlarini, shuningdek, ushbu so'zlarning o'zgarishlarini o'z ichiga oladi. Agar matnda bo'lsa, naqsh "z2cept" ketma-ketligiga ham mos keladi.

Qavs ichidagi ifodalar

Belgilar guruhini kvadrat qavslar ("") ichiga qo'yish orqali siz qavs ichidagi har qanday belgilar o'sha joyda paydo bo'lishi mumkinligini ko'rsatishingiz mumkin.

Bu shuni anglatadiki, agar siz "juda" yoki "ikki" ni o'z ichiga olgan satrlarni topishingiz kerak bo'lsa, siz ushbu o'zgarishlarni quyidagi naqsh yordamida qisqacha ko'rsatishingiz mumkin:

grep "to" GPL-3
dasturlaringiz ham.

GNU GPL dan foydalanadigan dasturchilar sizning huquqlaringizni ikki bosqichda himoya qiladi:
nusxasi uzatilmagan kompyuter tarmog'i uzatilmaydi.

Tegishli manba tarmoq serveridan bepul.
...
...

Ko'rib turganingizdek, ikkala variant ham faylda topilgan.

Qavslar ichidagi belgilarni qo'yish ham bir nechta foydali xususiyatlarni beradi. Qavs ichidagi belgilar roʻyxatini “^” belgisi bilan boshlash orqali qavs ichidagi belgilardan tashqari hamma narsa naqshga mos kelishini koʻrsatishingiz mumkin.

Ushbu misolda "kod" ketma-ketligiga mos kelmasligi kerak bo'lgan ".ode" naqsh ishlatiladi.

grep "[^c]ode" GPL-3
1. Manba kodi.
model, ob'ekt kodiga ega bo'lgan har bir kishiga berish uchun (1) a
mahsulotdan foydalanishning yagona muhim usuli.
u interaktiv rejimda ishga tushganda shunday e'tibor bering:

Shuni ta'kidlash kerakki, ikkinchi qatorning chiqishida "kod" so'zi mavjud. Bu regex yoki grep xatosi emas.

Toʻgʻrirogʻi, bu satr chop etilgan, chunki unda “model” soʻzida joylashgan naqshga mos keladigan “rejim” ketma-ketligi ham mavjud. Ya'ni, ip naqshga mos kelgani uchun chop etilgan.

Boshqasi foydali xususiyat qavslar - har bir belgini alohida kiritish o'rniga belgilar oralig'ini ko'rsatish imkoniyati.

Bu shuni anglatadiki, agar siz bosh harf bilan boshlangan har bir qatorni topishingiz kerak bo'lsa, siz quyidagi naqshdan foydalanishingiz mumkin:

grep "^" GPL-3
Ko'pgina dasturlarimiz uchun GNU General Public License; uchun ham amal qiladi

Litsenziya. Har bir litsenziatga “siz” deb murojaat qilinadi. "Litsenziyalar" va


Tizim kutubxonalari yoki umumiy maqsadli vositalar yoki umuman bepul mavjud
Manba.

...
...

Ba'zi o'ziga xos taqqoslash muammolari tufayli, aniqroq natijalarga erishish uchun yuqoridagi misolda ishlatilgan belgilar oralig'i o'rniga POSIX belgilar sinflaridan foydalanish yaxshiroqdir.
Ushbu qo'llanmada ko'rib chiqilmagan ko'plab belgilar sinflari mavjud; masalan, yuqoridagi misoldagi kabi amalni bajarish uchun qavs ichidagi “[:upper:]” belgilar sinfidan foydalanishingiz mumkin.

grep "^[[:yuqori:]]" GPL-3
Ko'pgina dasturlarimiz uchun GNU General Public License; uchun ham amal qiladi
Davlatlar patentlarni ishlab chiqish va ulardan foydalanishni cheklashiga yo'l qo'ymasliklari kerak
Litsenziya. Har bir litsenziatga “siz” deb murojaat qilinadi. "Litsenziyalar" va
Komponent va (b) faqat u bilan ishlashdan foydalanishga xizmat qiladi
Asosiy komponent yoki standart interfeysni amalga oshirish uchun
Tizim kutubxonalari yoki umumiy maqsadli vositalar yoki umuman bepul mavjud
Manba.
Foydalanuvchi mahsuloti oluvchiga abadiy yoki a uchun uzatiladi
...
...

Naqshni takrorlash (0 yoki undan ortiq marta)

Eng ko'p ishlatiladigan meta-belgilardan biri "*" belgisi bo'lib, "oldingi belgi yoki ifodani 0 yoki undan ortiq marta takrorlash" degan ma'noni anglatadi.

Misol uchun, agar siz faqat harflar va ular orasidagi bitta bo'shliqni o'z ichiga olgan qavslarni ochish yoki yopish bilan har bir qatorni topmoqchi bo'lsangiz, quyidagi ifodadan foydalanishingiz mumkin:

grep "(*)" GPL-3

tarqatish (o'zgartirishlar bilan yoki o'zgartirishlarsiz), mavjud qilish
umuman asarga qaraganda, (a) ning normal shakliga kiritilgan
Komponent va (b) faqat u bilan ishlashdan foydalanishga xizmat qiladi
(agar mavjud bo'lsa) bajariladigan ish ishlaydigan yoki ishlatadigan kompilyator
(jumladan, jismoniy tarqatish vositasi), bilan birga
(jumladan, jismoniy tarqatish vositasi), a bilan birga
joy (bepul yoki haq evaziga) va shunga o'xshash kirishni taklif qiling
...
...

Metabelgilardan qanday qochish kerak

Ba'zan siz tom ma'nodagi davr yoki tom ma'noda ochiq qavsni izlashingiz kerak bo'lishi mumkin. Ushbu belgilar muntazam iboralarda o'ziga xos ma'noga ega bo'lganligi sababli, grepga bu holda ularning maxsus ma'nosi kerak emasligini aytib, ulardan "qochish" kerak.

Odatda maxsus ma'noga ega bo'lgan belgidan oldin teskari chiziq (\) yordamida bu belgilardan qochish mumkin.

Misol uchun, agar siz bosh harf bilan boshlanib, nuqta bilan tugaydigan qatorni topishingiz kerak bo'lsa, quyidagi ifodadan foydalanishingiz mumkin. Oxirgi nuqta oldidagi teskari chiziq “qochish” buyrug‘ini bildiradi, shunda oxirgi nuqta to‘g‘ridan-to‘g‘ri nuqtani ifodalaydi va “hech qanday belgi” ma’nosiga ega bo‘lmaydi:

grep "^.*\.$" GPL-3
Manba.
Litsenziyaning bir yoki bir nechta shartlaridan istisno qilish orqali.
Litsenziya Dasturni uzatishdan butunlay voz kechishdir.
BARCHA KERAK XIZMAT QILISH, TA'MIRLASH YOKI TUZATISH.
BUNDAY ZARARLAR.
Shuningdek, siz bilan elektron va qog'oz pochta orqali qanday bog'lanish haqida ma'lumot qo'shing.

Kengaytirilgan muntazam ifodalar

Grep buyrug'i kengaytirilgan muntazam ifoda tili bilan -E bayrog'idan foydalanish yoki grep o'rniga egrep buyrug'ini chaqirish orqali ham ishlatilishi mumkin.

Bu buyruqlar “kengaytirilgan muntazam iboralar” imkoniyatlarini ochadi. Kengaytirilgan muntazam iboralar barcha asosiy metabelgilarni, shuningdek murakkabroq mosliklarni ifodalash uchun qoʻshimcha metabelgilarni oʻz ichiga oladi.

Guruhlash

Kengaytirilgan muntazam iboralarning eng oddiy va foydali xususiyatlaridan biri iboralarni guruhlash va ularni bitta birlik sifatida ishlatish qobiliyatidir.

Qavslar ifodalarni guruhlash uchun ishlatiladi. Agar kengaytirilgan oddiy iboralar tashqarisida qavslardan foydalanish kerak bo'lsa, ular teskari chiziq yordamida "qochish" mumkin.

grep "\(guruhlash\)" fayl.txt
grep -E "(guruhlash)" fayl.txt
egrep "(guruhlash)" fayl.txt

Yuqoridagi iboralar ekvivalentdir.

Almashinuv

Kvadrat qavslar bitta belgi uchun turli xil mumkin bo'lgan mosliklarni ko'rsatganidek, interleaving belgilar qatorlari yoki ifodalar to'plami uchun muqobil mosliklarni belgilashga imkon beradi.

Vertikal chiziq belgisi "|" almashishni ko'rsatish uchun ishlatiladi. Ikki yoki undan ortiq mumkin bo'lgan variantlardan biri mos kelishini ko'rsatish uchun guruhlashda ko'pincha alternativa ishlatiladi.

Ushbu misolda siz "GPL" yoki "Umumiy davlat litsenziyasi" ni qidirishingiz kerak:

grep -E "(GPL | General Public License)" GPL-3
GNU General Public License - bu bepul, copyleft litsenziyasi
GNU General Public License sizning erkinligingizni kafolatlash uchun mo'ljallangan
Ko'pgina dasturlarimiz uchun GNU General Public License; uchun ham amal qiladi
narx. Bizning umumiy jamoat litsenziyalarimiz sizga ishonch hosil qilish uchun yaratilgan
GNU GPL dan foydalanadigan dasturchilar sizning huquqlaringizni ikki bosqichda himoya qiladi:
Ishlab chiquvchilar va mualliflar himoyasi uchun GPL aniq tushuntiradi
mualliflar uchun, GPL o'zgartirilgan versiyalar sifatida belgilanishini talab qiladi
GPLning ushbu versiyasini ular uchun amaliyotni taqiqlash uchun ishlab chiqdik
...
...

Alternativ ikki yoki undan ortiq variantni tanlash uchun ishlatilishi mumkin; Buni amalga oshirish uchun siz qolgan variantlarni tanlash guruhiga kiritishingiz kerak, ularning har birini vertikal chiziq belgisi "|" yordamida ajrating.

Miqdor ko'rsatkichlari

Kengaytirilgan muntazam iboralarda belgi qanchalik tez-tez takrorlanishini ko'rsatadigan metabelgilar mavjud, xuddi "*" metabelgisi oldingi belgi yoki belgilar qatori 0 yoki undan ortiq marta mos kelishini bildiradi.

Belgini 0 yoki undan ortiq marta moslashtirish uchun siz “?” belgisidan foydalanishingiz mumkin. Bu oldingi belgi yoki belgilar seriyasini asosan ixtiyoriy qiladi.

Ushbu misolda ixtiyoriy guruhga "nusxa olish" ketma-ketligini kiritish orqali "mualliflik huquqi" va "o'ng" mosliklari ko'rsatiladi:

grep -E "(nusxalash)?to'g'ri" GPL-3
Mualliflik huquqi (C) 2007 Free Software Foundation, Inc.
Huquqlaringizni himoya qilish uchun boshqalar sizni rad etishiga yo'l qo'ymasligimiz kerak
ushbu huquqlar yoki sizdan huquqlardan voz kechishingizni so'rash. Shuning uchun, sizda bor
huquqlarini bilish.
GNU GPL dan foydalanadigan dasturchilar sizning huquqlaringizni ikki bosqichda himoya qiladi:
(1) dasturiy ta'minotga mualliflik huquqini himoya qilish va (2) sizga ushbu Litsenziyani taklif qilish
"Mualliflik huquqi" shuningdek, mualliflik huquqiga o'xshash boshqa turdagi qonunlarni ham anglatadi
...
...

"+" belgisi ifodalarga 1 yoki undan ortiq marta mos keladi. Bu deyarli "*" belgisi kabi ishlaydi, lekin "+" dan foydalanganda ifoda kamida 1 marta mos kelishi kerak.

Quyidagi ifoda "bepul" qatoriga va bo'sh joy bo'lmagan 1 yoki undan ortiq belgilarga mos keladi:

grep -E "free[^[:space:]]+" GPL-3
GNU General Public License - bu bepul, copyleft litsenziyasi
asarlarni almashish va o'zgartirish erkinligingizdan mahrum qilish. Aksincha,
GNU General Public License sizning erkinligingizni kafolatlash uchun mo'ljallangan
Erkin dasturiy ta'minot haqida gapirganda, biz erkinlikni emas, balki erkinlikni nazarda tutamiz
bepul dasturiy ta'minot nusxalarini tarqatish erkinligiga ega bo'ling (va to'lov uchun

siz olgan erkinliklar. Ular ham qabul qilishlariga ishonch hosil qilishingiz kerak
foydalanuvchilarni himoya qilish" dasturiy ta'minotni o'zgartirish erkinligi. Tizimli
foydalanuvchilar erkinligini himoya qilish uchun kerak bo'lganda GPL.
patentlardan dasturni bepul qilish uchun foydalanish mumkin emas.

Takrorlangan o'yinlar soni

Agar mosliklarni necha marta takrorlash kerakligini ko'rsatish kerak bo'lsa, siz jingalak qavslardan foydalanishingiz mumkin (“( )”). Ushbu belgilar ifodaning aniq sonini, diapazonini va yuqori va pastki chegaralarini ko'rsatish uchun ishlatiladi.

Agar siz uchta unli tovush birikmasini o'z ichiga olgan barcha qatorlarni topishingiz kerak bo'lsa, siz quyidagi iboradan foydalanishingiz mumkin:

grep -E "(3)" GPL-3
Ularning muammolari noto'g'ri bo'lmasligi uchun o'zgartirildi
oldingi versiyalarning mualliflari.
uni, har qanday vositada, agar siz ko'zga ko'rinadigan va
oldingi bandga muvofiq, unga egalik qilish huquqini beradi
bir vaqtning o'zida ushbu bo'yicha majburiyatlaringizni qondirish uchun qoplangan ish
Agar siz 16-20 belgidan iborat barcha so'zlarni topishingiz kerak bo'lsa, quyidagi iboradan foydalaning:
grep -E "[[:alpha:]](16,20)" GPL-3
dasturiy ta'minot nusxalarini tarqatadigan bo'lsangiz yoki muayyan mas'uliyat
siz uni o'zgartirasiz: boshqalarning erkinligini hurmat qilish majburiyatlari.
c) ushbu materialning kelib chiqishi haqida noto'g'ri ma'lumot berishni taqiqlash yoki

xulosalar

Ko'p hollarda grep buyrug'i fayllar ichida yoki ierarxiyadagi naqshlarni topish uchun foydalidir fayl tizimi. Bu ko'p vaqtni tejaydi, shuning uchun uning parametrlari va sintaksisi bilan tanishib chiqishga arziydi.

Muntazam iboralar yanada ko'p qirrali va ko'plab mashhur dasturlarda ishlatilishi mumkin. Masalan, ko'p matn muharrirlari matnni qidirish va almashtirish uchun oddiy iboralardan foydalaning.

Bundan tashqari, ilg'or dasturlash tillari ma'lum ma'lumotlar bo'laklarida protseduralarni bajarish uchun muntazam iboralardan foydalanadi. Muntazam iboralar bilan ishlashni bilish kompyuter bilan bog'liq keng tarqalgan muammolarni hal qilishda yordam beradi.

Teglar: ,

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. Yordamida berilgan ifoda matndan topishga harakat qilamiz (

Shunday qilib, Qanday yaratish kerak RAID darajasi LSI MegaRAID kontrolleridagi 10/50 (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 ajratadi muqobil variantlar muntazam iboralar. Bitta belgi ikkita muqobilni bildiradi, lekin ular ko'proq bo'lishi mumkin, shunchaki ko'proq vertikal chiziqlardan foydalaning. Shuni esda tutish kerakki, bu operator imkon qadar ko'proq ifoda ishlatadi. 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!

grep "global muntazam ifoda printeri" degan ma'noni anglatadi. grep sizga kerakli qatorlarni kesadi matnli fayllar foydalanuvchi tomonidan belgilangan matnni o'z ichiga oladi.

grep ikki usulda - mustaqil yoki oqimlar bilan birgalikda ishlatilishi mumkin.

grep qo'llab-quvvatlaydigan ko'plab variantlar tufayli juda keng funktsionaldir, masalan: string naqsh yoki RegExp muntazam ifoda namunasi yoki perl asosidagi muntazam ifodalar yordamida qidirish va hokazo.

Turli xilligi tufayli funksionallik Grep vositasida ko'plab variantlar mavjud, shu jumladan egrep (kengaytirilgan GREP), fgrep (Ruxsat etilgan GREP), pgrep (GREP jarayoni), rgrep (rekursiv GREP) va hokazo. Ammo bu variantlar asl grepdan kichik farqlarga ega.

grep variantlari

$ grep -V grep (GNU grep) 2.10 Mualliflik huquqi (C) 2011 Free Software Foundation, Inc. GPLv3+ litsenziyasi

Grep yordam dasturining modifikatsiyalari mavjud: egrep (kengaytirilgan muntazam iboralarni qayta ishlash bilan), fgrep (u $*^|()\ belgilarini literal sifatida ko'rib chiqadi, ya'ni so'zma-so'z ma'noda), rgrep (rekursiv qidiruv yoqilgan).

    egrep grep -E bilan bir xil

    fgrep grep -F bilan bir xil

    rgrep grep -r bilan bir xil

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] cheklangan_regex_BRE [fayl ...]

grep buyrug'i manba fayllaridagi satrlarni limited_regex tomonidan belgilangan naqshga moslashtiradi. Hech qanday fayl ko'rsatilmagan bo'lsa, standart kiritish ishlatiladi. Odatda, har bir muvaffaqiyatli mos keladigan satr standart chiqishga ko'chiriladi; agar bir nechta manba fayllar mavjud bo'lsa, fayl nomi topilgan qatordan oldin beriladi. grep ixcham, deterministik bo'lmagan algoritmdan foydalanadi. Cheklangan muntazam iboralar (o'z ma'nolari bilan belgilar qatoriga ega bo'lgan va cheklangan harf-raqamli va maxsus belgilar to'plamidan foydalanadigan iboralar) shablon sifatida qabul qilinadi. Ular tahrirdagi muntazam iboralar bilan bir xil ma'noga ega.

Qobiq talqinidan $, *, , ^, |, () va \ belgilaridan qochish uchun constrained_regex ni bitta tirnoq ichiga olish oson.

Variantlar:

B Har bir satrga u topilgan blok raqamini kiritadi. Bu kontekst bo'yicha bloklarni qidirishda foydali bo'lishi mumkin (bloklar 0 dan boshlab raqamlangan). -c Faqat naqshni o'z ichiga olgan qatorlar sonini chop etadi. -h Tegishli qatorni o'z ichiga olgan fayl nomi satrning o'zidan oldin chop etilishini oldini oladi. Bir nechta fayllarni qidirishda foydalaniladi. -i Taqqoslashda katta-kichik harflarga e'tibor bermaydi. -l Har bir satrga bittadan mos keladigan satrlarni o'z ichiga olgan fayllar nomlarinigina chop etadi. Agar faylning bir nechta satrida naqsh topilsa, fayl nomi takrorlanmaydi. -n Fayldagi har bir satrdan oldin uning raqamini chop etadi (satrlar 1 dan boshlab raqamlangan). -s Mavjud bo'lmagan yoki o'qib bo'lmaydigan fayllar haqidagi xabarlarni bosadi. -v Naqsh o'z ichiga olganlardan tashqari barcha qatorlarni chop etadi. -w ifodani metabelgilar bilan o'ralgandek so'z sifatida qidiradi \< и \>.

grep - yordam

Foydalanish: grep [OPTION]... PATTERN [FILE]... Har bir FAYL yoki standart kiritishda PATTERNni qidiradi. Odatiy bo'lib, PATTERN oddiy oddiy ifodadir (BRE). Misol: grep -i "salom dunyo" menu.h main.c Muntazam ifoda turini tanlash va uning talqini: -E, --extended-regexp PATTERN - kengaytirilgan muntazam ifoda (ERE) -F, --fixed-regexp PATTERN - yangi satr belgisi bilan ajratilgan qat'iy uzunlikdagi satrlar -G, --basic-regexp PATTERN - oddiy oddiy ifoda (BRE) -P, --perl-regexp PATTERN - Perl muntazam ifodalari -e, --regexp=PATTERN PATTERN-dan foydalanish uchun qidiruv - f, --file=FILE FILE dan PATTERN olish -i, --ignore-case e'tibor bermaslik katta-kichik harflar farqi -w, --word-regexp PATTERN barcha so'zlarga mos kelishi kerak -x, --line-regexp PATTERN butun qatorga mos kelishi kerak -z, --null-ma'lumotlar satrlari satr oxiri belgisi emas, balki null bayt bilan ajratiladi. Turli xil: -s, --no-xabarlar xato xabarlarini bostiradi -v, --revert-match mos kelmaydigan satrlarni tanlang -V, - - versiyani chop etish versiyasi haqida ma'lumot va chiqish --help bu yordamni ko'rsatish va chiqish --mmap for orqaga qarab muvofiqlik, e'tiborga olinmagan Chiqish boshqaruvi: -m, --max-count=Sayıning ko'rsatilgan NUMBER moslikdan keyin to'xtashi -b, --bayt-ofset bayt ofsetini chiqish satrlari bilan birga chop etish -n, --line-raqami qatorni chop etish raqam chiqish satrlari bilan birga --line-bufered buferni har bir satrdan keyin yuving -H, --with-filename har bir moslik uchun fayl nomini chop eting -h, --no-filename fayl nomi bilan chiqishni boshlamang -- label=LABEL standart kiritish uchun fayl nomi sifatida LABEL dan foydalaning -o, --only-matching PATTERN-ga mos keladigan chiziqning faqat bir qismini ko'rsatadi -q, --quiet, --silent barcha normal chiqishlarni bostiradi --binary-files=TYPE assume bu ikkilik fayl TYPEga ega: ikkilik, matnli yoki mos kelmaydigan. -a, --matn --binary-files=matn bilan bir xil -I bir xil --binary-files=without-match -d, --directories=ACTION kataloglarni qanday boshqarish kerak ACTION o'qilishi mumkin ), rekursiv (rekursiv) yoki o'tkazib yuborish (o'tkazib yuborish). -D, --devices=ACTION qurilmalar, FIFO va rozetkalar bilan qanday ishlash kerak ACTION o'qilishi yoki o'tkazib yuborilishi mumkin -R, -r, --rekursiv --directories=recurse --include=F_PATTERN faqat F_TEMPLATE ostida mos keladigan fayllarni qayta ishlaydi - -exclude=F_TEMPLATE F_TEMPLATE mos keladigan fayllar va kataloglarni o'tkazib yuborish --exclude-from=FILE shablon fayllariga mos keladigan faylni o'tkazib yuborish FILE --exclude-dir=PATTERN bo'yicha mos keladigan TEMPLATE kataloglar o'tkazib yuboriladi -L, - -fayllar-fayllar faqat mos kelmaydigan chop etish Mos kelmaydigan FILE nomlari -l, --files-with-matches faqat mos keladigan FAYL nomlarini chop etadi -c, --count har bir FILE -T uchun faqat mos keladigan satrlar sonini chop etadi, --initial-tab align yorlig'i (agar kerak bo'lsa) - Z, --null FILE nomidan keyin 0 bayt bosib chiqarish Kontekstni boshqarish: -B, --before-context=NUM oldingi kontekstning NUMBER qatorini chop etish -A, --after-context=NUM keyingi kontekst -C, --kontekst[=NUMBER] kontekst satrlarining SONini chop eting -NUMBER bir xil --context=NUMBER --color[=WHEN], --colour[=WHEN] moslikni farqlash uchun markerlardan foydalaning chiziqlar; QAChON har doim bo'lishi mumkin, hech qachon yoki avtomatik -U, --binary satr oxiridagi CR belgilarini olib tashlamang (MSDOS) -u, --unix-bayt-ofsetlar CR-lar yo'qdek ofsetni ko'rsatadi (MSDOS). ) "egrep" o'rniga u "grep -E" ni ishlatishi kerak. "Fgrep" o'rniga "grep -F" qabul qilinadi. "egrep" yoki "fgrep" sifatida ishlamaslik yaxshiroqdir. FILE ko'rsatilmaganda yoki FILE - bo'lsa, standart kiritish o'qiladi. Agar ikkitadan kam fayl ko'rsatilgan bo'lsa, -h qabul qilinadi. Agar moslik topilsa, chiqish kodi 0, bo'lmasa 1 bo'ladi. Agar xatolar yuzaga kelsa yoki -q opsiyasi ko'rsatilmagan bo'lsa, chiqish kodi 2 bo'ladi. Xatolar haqida xabar bering: Tarjimadagi xatolar haqida quyidagi manzilga xabar bering: GNU Grep bosh sahifasi: GNU dasturlari bilan ishlash bo'yicha yordam: