خانه - لپ تاپ ها
عبارات منظم لینوکس استفاده از Grep و عبارات با قاعده برای یافتن الگوهای متن در عبارات منظم یونیکس لینوکس

در مورد این آموزش

به مدیریت پایه، دومین آموزش از چهار آموزش طراحی شده برای آماده سازی شما برای آزمون 101 موسسه حرفه ای لینوکس خوش آمدید. در این قسمت به نحوه استفاده از عبارات منظم برای جستجوی متن در فایل ها با استفاده از الگوها خواهیم پرداخت. در ادامه با "استاندارد سلسله مراتبی" آشنا می شوید. سیستم فایل"(Filesystem Hierarchy Standard یا به اختصار FHS)، ما همچنین به شما نشان خواهیم داد که چگونه پیدا کنید فایل های لازمروی سیستم شما پس از آن، شما یاد خواهید گرفت که چگونه با اجرای آن ها در لینوکس، کنترل کاملی بر روی فرآیندها به دست آورید زمینه، مشاهده لیست فرآیندها، جدا کردن آنها از ترمینال و موارد دیگر. آنچه در ادامه می آید معرفی سریع خطوط لوله، تغییر مسیرها و دستورات پردازش متن است. در نهایت ماژول های هسته لینوکس را به شما معرفی می کنیم.

به طور خاص، این بخش از آموزش (قسمت 2) برای کسانی ایده آل است که قبلاً دانش پایه خوبی از bash دارند و می خواهند با وظایف اساسی مدیریت لینوکس آشنا شوند. اگر در لینوکس تازه کار هستید، توصیه می کنیم ابتدا قسمت 1 این سری آموزش را به پایان برسانید. برای برخی، بیشتر این مطالب جدید خواهد بود، اما برای کسانی که تجربه بیشتری دارند کاربران لینوکسممکن است آن را راهی عالی برای خلاصه کردن مهارت‌های اساسی مدیریت خود بدانند.



اگر نسخه اول این آموزش را برای هدفی غیر از آمادگی برای آزمون LPI مطالعه کرده اید، ممکن است نیازی به خواندن مجدد این نسخه نداشته باشید. با این حال، اگر قصد شرکت در آزمون را دارید، اکیداً به شما توصیه می شود این نسخه اصلاح شده آموزش را دوباره بخوانید.

عبارات با قاعده

"بیان منظم" چیست؟

یک عبارت منظم (در عبارت منظم انگلیسی، به اختصار "regexp" یا "regex"، در کشور ما گاهی اوقات به آن "قاعده" می گویند - تقریباً خط) یک نحو خاص است که برای توصیف استفاده می شود. قالب های متنی. در سیستم های لینوکس، عبارات منظم به طور گسترده برای جستجوی الگو در متن، و همچنین برای عملیات جستجو و جایگزینی در جریان متن استفاده می شود.

در مقایسه با globbing

هنگامی که شروع به بررسی عبارات منظم می کنیم، ممکن است متوجه شوید که نحو آنها بسیار شبیه به نحو globbing است که در قسمت 1 به آن نگاه کردیم. با این حال، اشتباه نکنید، این شباهت بسیار سطحی است. عبارات منظم و الگوهای globbing، حتی زمانی که شبیه به نظر می رسند، اساسا چیزهای متفاوتی هستند.

زیر رشته ساده

با این اخطار خارج از راه، اجازه دهید به اساسی ترین چیز در مورد عبارات منظم، ساده ترین رشته فرعی نگاه کنیم. برای انجام این کار، از "grep" استفاده می کنیم، دستوری که محتویات یک فایل را با توجه به یک عبارت منظم اسکن می کند. grep هر خطی را که با عبارت معمولی مطابقت دارد چاپ می کند و بقیه را نادیده می گیرد:

$ grep bash /etc/passwd
operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/ ضربه شدید

در بالا، اولین پارامتر برای grep regex است. دومی نام فایل است. grep خواندن هر خط از /etc/passwdو یک زیر رشته regex ساده "bash" را در جستجوی یک تطابق به آن اعمال کرد. اگر مطابقت پیدا شد، grep کل خط را چاپ کرد. در غیر این صورت، خط نادیده گرفته شد.

درک یک زیر رشته ساده

به طور کلی، اگر به دنبال یک رشته فرعی هستید، می توانید به سادگی آن را بدون استفاده از هیچ کاراکتر «ویژه» به معنای واقعی کلمه مشخص کنید. فقط در صورتی که زیررشته شما حاوی +، .، *، [،] یا \ باشد، باید مراقب باشید، در این صورت این کاراکترها باید با یک اسلش خارج شوند و رشته فرعی در گیومه قرار گیرد. در اینجا چند نمونه از عبارات منظم به عنوان یک زیر رشته ساده آورده شده است:

  • /tmp (جستجوی رشته /tmp)
  • "\" (جستجوی رشته ای)
  • "\*funny\*" (جستجوی رشته *funny*)
  • "ld\.so" (جستجوی رشته ld.so)

متا شخصیت ها

با عبارات منظم، با استفاده از متاکاراکترها، می توان جستجوهای بسیار پیچیده تری نسبت به نمونه هایی که اخیراً به آنها نگاه کردیم، انجام داد. یکی از این متاکاراکترها "." (نقطه)، که با هر کاراکتری مطابقت دارد:

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

در این مثال، متن dev.sda به معنای واقعی کلمه در هیچ یک از خطوط از ظاهر نمی شود /etc/fstab. با این حال، grep آن را نه به معنای واقعی کلمه توسط خط dev.sda، بلکه توسط الگوی dev.sda اسکن می کند. به یاد بیاور "." با هر شخصیت منفرد مطابقت خواهد داشت. همانطور که می بینید، متاکاراکتر "." از نظر عملکردی معادل نحوه عملکرد متاکاراکتر "?" است. در تعویض های گلوب

استفاده

اگر بخواهیم در مورد یک کاراکتر دقیق تر از "." باشیم، می توانیم از [ و ] (پرانتزهای مربع) برای تعیین زیر مجموعه ای از کاراکترها برای مطابقت استفاده کنیم:

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

همانطور که متوجه شدید، به طور خاص، این ساختار نحوی در هنگام جایگزینی نام فایل‌ها به طور یکسان با ساختار "" کار می‌کند. باز هم، این یکی از ابهامات در یادگیری عبارات منظم است: نحو مشابه، اما نه یکسان، به نحو جایگزین های glob است، که گیج کننده است.

با استفاده از [^]

می‌توانید با قرار دادن یک ^ بلافاصله بعد از [، معنای کروشه‌ها را معکوس کنید. در این حالت، براکت ها با هر کاراکتری که در داخل آنها فهرست نشده است مطابقت خواهند داشت. و دوباره توجه کنید که از [^] با یک عبارت منظم و [!] با یک glob استفاده می کنیم:

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

نحو متفاوت

توجه به این نکته بسیار مهم است که نحو داخل کروشه ها اساساً با بقیه عبارت های معمولی متفاوت است. به عنوان مثال، اگر شما "." در داخل براکت های مربع، این اجازه می دهد تا براکت های مربع با "." به معنای واقعی کلمه، درست مانند 1 و 2 در مثال بالا. برای مقایسه، "." قرار دادن خارج از پرانتز مربع به عنوان یک متاکاراکتر تفسیر می شود مگر اینکه یک "\" اضافه شود. می توانیم بهره مند شویم این حقیقتبرای چاپ خطوطی از /etc/fstab که حاوی خط dev.sda به صورت نوشته شده است:

$ grep dev[.]sda /etc/fstab

همچنین می توانیم تایپ کنیم:

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

این عبارات منظم احتمالاً با یک خط از شما مطابقت ندارند /etc/fstabفایل.

ماتاسمبول *

برخی از متا شخصیت ها با هیچ چیزی مطابقت ندارند، اما معنای شخصیت قبلی را تغییر می دهند. یکی از این کاراکترها * (ستاره) است که برای مطابقت با تکرارهای صفر یا بیشتر از کاراکتر قبلی استفاده می شود. توجه داشته باشید که این بدان معنی است که * در regex معنای متفاوتی نسبت به globbing دارد. در اینجا چند مثال آورده شده است و به مواردی که تطبیق عبارت منظم با جایگزینی glob متفاوت است، توجه ویژه داشته باشید:

  • ab*cبا "abbbbc" منطبق است اما با "abqc" مطابقت ندارد (در مورد جایگزینی glob، هر دو رشته با الگو مطابقت دارند. آیا هنوز دلیل آن را می‌دانید؟)
  • ab*cبا "abc" منطبق است اما "abbqbbc" را ندارد (دوباره، با جایگزینی glob، الگو با هر دو رشته مطابقت دارد)
  • ab*cمنطبق با "ac" اما نه "cba" (در مورد globbing، نه "ac" و نه "cba" با الگو مطابقت ندارد)
  • بودنمطابق با "bqe" و "be" (تعویض گلوب با "bqe" اما نه "be")
  • بودنبا «bccqqe» منطبق است، اما «bccc» نیست (هنگام globbing، الگو دقیقاً با اولی مطابقت دارد، اما نه دوم)
  • بودن"bqqcce" را منطبق می کند، اما "cqe" را ندارد (همانطور با جایگزینی glob)
  • بودن"bbbeee" را برآورده می کند (اما نه در مورد globbing)
  • .* قابل مقایسه با هر رشته ای (جایگزینی glob فقط با رشته هایی که با "." شروع می شوند انجام می شود)
  • فو.*با هر زیر رشته ای که با "foo" شروع می شود مطابقت دارد (در مورد جایگزینی glob، این الگو با رشته هایی که با چهار کاراکتر "foo" شروع می شوند مطابقت خواهد داشت)

بنابراین، برای تقویت تکرار می کنیم: خط "ac" با عبارت منظم "ab*c" مطابقت دارد زیرا ستاره همچنین اجازه می دهد تا عبارت قبلی (b) صفر بار تکرار شود. و دوباره، توجه به این نکته مهم است که متاکاراکتر * در عبارات منظم کاملاً متفاوت از کاراکتر * در جایگزین‌های glob تفسیر می‌شود.

شروع و پایان خط

آخرین متاکاراکترهایی که به طور مفصل به آنها نگاه خواهیم کرد ^ و $ هستند که به ترتیب برای مطابقت با ابتدا و انتهای یک رشته استفاده می شوند. با استفاده از یک ^ در ابتدای regex خود، الگوی خود را به ابتدای خط "لنگر" می کنید. در مثال زیر از عبارت منظم ^# استفاده می کنیم که با هر رشته ای که با کاراکتر # شروع می شود مطابقت دارد:

$ grep ^# /etc/fstab

#

معمولی های تمام خط

^ و $ را می توان برای مطابقت با کل رشته ترکیب کرد. برای مثال، عبارت منظم زیر خطوطی را که با کاراکتر # شروع می‌شوند و با کاراکتر "." ختم می‌شوند، با تعداد دلخواه کاراکتر بین آنها مطابقت می‌دهد:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: ایستا سیستم فایلاطلاعات

در مثال بالا، عبارت منظم خود را در یک نقل قول قرار دادیم تا پوسته از تفسیر کاراکتر $ جلوگیری کند. بدون نقل قول، $ قبل از اینکه grep بتواند آن را ببیند، از regex ما ناپدید می شود.

درباره نویسندگان

دنیل رابینز

دانیل رابینز - بنیانگذار و خالق انجمن جنتو سیستم عاملجنتو لینوکس. دانیل با همسرش مری و دو دختر پرانرژی در نیومکزیکو زندگی می کند. او همچنین بنیانگذار و مدیر عامل Funtoo است و مقالات فنی متعددی برای IBM developerWorks، Intel Developer Services و C/C++ Users Journal نوشته است.

کریس هاوسر

کریس هاوسر از سال 1994، زمانی که به تیم اداری دانشگاه تیلور (ایندیانا، ایالات متحده آمریکا) پیوست و در آنجا مدرک لیسانس خود را در علوم کامپیوتر و ریاضیات دریافت کرد، مدافع یونیکس بوده است. او از آن زمان در زمینه های مختلفی از جمله برنامه های کاربردی وب، ویرایش ویدیو، درایورهای یونیکس و امنیت رمزنگاری کار کرده است. که در در حال حاضردر Sentry Data Systems کار می کند. کریس همچنین در بسیاری از پروژه‌های رایگان مانند Gentoo Linux و Clojure مشارکت داشته و کتاب The Joy of Clojure را نیز تالیف کرده است.

آرون گریفیس

آرون گریفیس در بوستون زندگی می کند، جایی که دهه گذشته را در Hewlett-Packard روی پروژه هایی مانند درایورهای شبکه یونیکس برای Tru64، گواهینامه امنیتی لینوکس، Xen و مجازی سازی KVMو اخیراً پلتفرم HP ePrint. وقتی او برنامه نویسی نمی کند، آرون دوست دارد در حین دوچرخه سواری، شعبده بازی با خفاش یا تشویق تیم بیسبال حرفه ای بوستون رد ساکس به مشکلات برنامه نویسی فکر کند.

یکی از دستورات مفید و غنی در ترمینال لینوکس، دستور grep است. این نام مخفف عبارت انگلیسی "جستجوی جهانی برای خطوط مطابق با عبارت منظم، و چاپ آنها" است (در همه جا خطوط منطبق با عبارت منظم را جستجو کنید و آنها را چاپ کنید). دستور "grep" جریان ورودی را خط به خط اسکن می کند، و فقط به دنبال موارد منطبق و خروجی (فیلترها) می گردد که حاوی متنی است که با الگوی داده شده مطابقت دارد - عبارت منظم.

عبارات منظم یک زبان رسمی ویژه برای جستجو و دستکاری زیر رشته ها در متن، بر اساس استفاده از متاکراکترها هستند. اکنون تقریباً تمام زبان های برنامه نویسی مدرن از عبارات منظم برای پردازش متن پشتیبانی می کنند، اما از نظر تاریخی دنیای یونیکس و به ویژه ایده های تعبیه شده در دستورات "grep"، "sed" و غیره کمک زیادی کرده است. فلسفه "همه چیز یک فایل است" به طور کامل در یونیکس نفوذ می کند و تسلط بر ابزارهای کار با فایل های متنی یکی از مهارت های مورد نیاز هر کاربر لینوکس است.

نمونه

GIST | جستجوی ساده برای تمام خطوطی که حاوی متن "آدامز" هستند. هنگام قالب‌بندی این و نمونه‌های بعدی، به ترتیب زیر عمل می‌کنیم: پارامترهای خط فرمان در بالا، جریان‌های استاندارد در پایین، ورودی stdin در سمت چپ و خروجی stdout در سمت راست.

دستور "grep" دارای تعداد قابل توجهی از گزینه ها است که می توانید هنگام اجرای آن مشخص کنید. شما می توانید با این گزینه ها کارهای مفید زیادی انجام دهید و حتی نیازی به تسلط به نحو عبارات منظم ندارید.

گزینه ها

بیایید با این واقعیت شروع کنیم که "grep" نه تنها می تواند ورودی استاندارد stdin را فیلتر کند، بلکه می تواند در میان فایل ها نیز جستجو کند. به طور پیش‌فرض، grep فقط فایل‌ها را در دایرکتوری فعلی جستجو می‌کند، اما با گزینه بسیار مفید --recursive، می‌توانید به grep بگویید که با شروع از یک دایرکتوری معین به صورت بازگشتی جستجو کند.

GIST | به طور پیش فرض، دستور grep به حروف بزرگ و کوچک حساس است. مثال زیر نشان می‌دهد که چگونه می‌توانید بدون حساس بودن به حروف بزرگ و کوچک جستجو کنید، برای مثال «آدامز» و «آدامز» یکسان هستند:

نادیده گرفتن "آدامز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جان آدامز، 1797-1801

GIST | جستجو برعکس است (گاهی اوقات می گویند جستجوی معکوس)، یعنی همه خطوط نمایش داده می شوند به جز آنهایی که دارای الگوی مشخص شده هستند:

مسابقه معکوس "آدامز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جورج واشنگتن، 1789-1797 توماس جفرسون، 1801-1809

GIST | گزینه ها، البته، می توانند و باید با یکدیگر ترکیب شوند. به عنوان مثال، جستجوی معکوس با نمایش شماره سریال خطوط دارای رخداد:

شماره خط --مطابقت معکوس "آدامز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 1: جرج واشنگتن، 1789-1797 3: توماس جفرسون، 1801-1809

GIST | رنگ آمیزی. گاهی اوقات زمانی که کلمه مورد نظر ما با رنگ برجسته شده است راحت است. همه اینها قبلاً در "grep" هستند، تنها چیزی که باقی می ماند شامل موارد زیر است:

شماره خط --color=همیشه "آدامز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 2: جان آدامز، 1797-1801

GIST | ما می خواهیم همه خطاها را از فایل log انتخاب کنیم، اما می دانیم که خط بعدی بعد از خطا ممکن است حاوی باشد اطلاعات مفید، سپس خروجی چندین خط از متن راحت است. به‌طور پیش‌فرض، grep فقط خطی را که مطابقت پیدا شده است چاپ می‌کند، اما گزینه‌های مختلفی برای چاپ بیشتر grep وجود دارد. برای خروجی چند خط (در مورد ما دو) پس از یک ورودی:

رنگ = همیشه -A2 "آدامز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جیمز مدیسون، 1809-1817 جیمز مونرو، 1817-1825 جان آدامز، 1797-1801، 1797-1801 توماس جفرسون، 1891-1801- James Madison، 1891-1809

GIST | به همین ترتیب برای خروجی اضافی چندین خط قبل از ورود:

رنگ = همیشه -B2 "جیمز"

جورج واشنگتن ، 1789-1797 جان آدامز ، 1797-1801 توماس جفرسون ، 1801-1809 جیمز مدیسون ، 1809-1817 جیمز مونرو ، 1817-1825 جان آدامز ، 1797-1801 توماس جفرسون ، 1801-1809 جیمز مدیسون ، 1809-1817 جیمز مونرو ، 1817-1825

GIST | با این حال، اغلب شما نیاز به نمایش یک زمینه متقارن دارید؛ نمادی حتی کوتاه‌تر برای این کار وجود دارد. بیایید دو خط را در بالا و پایین ورودی چاپ کنیم:

رنگ = همیشه -C2 "جیمز"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جیمز مدیسون، 1809-1817 جیمز مونرو، 1817-1825 جان کوئینسی آدامز، 1825-1829، 1825-1829، 1825-1829، 1825-1829، مارتین ون318-1829-1829-1829-1829-1829-1825-1829، اندرو ون318-1809-1809. جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جیمز مدیسون، 1809-1817 جیمز مونرو، 1817-1825 جان کوئینسی آدامز، 1825-1829 اندرو جکسون، 1829-1837

GIST | وقتی qwe را جستجو می کنید، به طور پیش فرض "grep" نیز qwe123، 345qwerty و ترکیب های مشابه را خروجی می دهد. بیایید فقط آن خطوطی را پیدا کنیم که کل کلمه را خاموش می کنند:

Word-regexp --color=همیشه "جان"

جان فیتزجرالد کندی، 1961-1963 لیندون بینز جانسون، 1963-1969 جان فیتزجرالد کندی، 1961-1963

GIST | و در نهایت، اگر فقط می‌خواهید تعداد خطوطی را که با یک عدد منطبق هستند بدانید، اما چیز دیگری را نمایش ندهید:

شمارش --color=همیشه "جان"

جان فیتزجرالد کندی، 1961-1963 لیندون بینز جانسون، 1963-1969 ریچارد میلهوس نیکسون، 1969-1974 2

شایان ذکر است که اکثر گزینه ها یک همتای دارند، برای مثال --ignore-case را می توان به شکل کوتاهتر -i و غیره کاهش داد.

عبارات با قاعده اساسی

تمام عبارات منظم از دو نوع کاراکتر تشکیل شده اند: استاندارد کاراکترهای متن، تماس گرفت به معنای واقعی کلمه، و کاراکترهای خاص نامیده می شود متا شخصیت ها. در مثال‌های قبلی، جستجو با استفاده از حروف واقعی (تطابق دقیق حروف) انجام شد، اما آنچه در ادامه می‌آید بسیار جالب‌تر خواهد بود. به دنیای عبارات منظم خوش آمدید!

علامت های caret ^ و dollar $ در یک عبارت منظم معانی خاصی دارند. آنها "لنگر" نامیده می شوند. لنگرها هستند نمادهای خاص، که مکان را در رشته مطابقت مورد نظر نشان می دهد. هنگامی که جستجو به یک لنگر می رسد، بررسی می کند که آیا مطابقت دارد یا خیر، و اگر چنین است، به دنبال الگو ادامه می دهد. بدون اینکه چیزی به نتیجه اضافه شود.

GIST | لنگر caret برای نشان دادن اینکه عبارت منظم باید از ابتدای خط آزمایش شود استفاده می شود:

رنگ = همیشه "^J"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جان آدامز، 1797-1801

GIST | به طور مشابه، لنگر دلار باید در انتهای الگو استفاده شود تا نشان دهد که تطابق تنها در صورتی معتبر است که رشته کاراکتر مورد جستجو در انتهای رشته متن باشد نه در غیر این صورت:

رنگ = همیشه "9$"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 توماس جفرسون، 1801-1809

GIST | هر شخصیتی کاراکتر نقطه در عبارات منظم استفاده می شود تا نشان دهد که مطلقاً هر کاراکتری می تواند در مکان مشخص شده ظاهر شود:

رنگ = همیشه "0.$"

GIST | محافظ. اگر دقیقاً باید نماد نقطه را پیدا کنید، فرار کمک خواهد کرد. یک کاراکتر فرار (معمولاً یک اسلش معکوس) قبل از یک کاراکتر مانند یک نقطه، متاکاراکتر را به یک حرف واقعی تبدیل می کند:

رنگ = همیشه "\."

جرج واشنگتن. 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جورج واشنگتن. 1789-1797

GIST | کلاس های شخصیت. عبارات منظم می توانند از محدوده ها و کلاس های کاراکتر استفاده کنند. برای انجام این کار، هنگام ایجاد الگو از براکت مربع استفاده می شود. با قرار دادن گروهی از کاراکترها (شامل کاراکترهایی که در غیر این صورت به عنوان متاکاراکتر تفسیر می شوند) در داخل پرانتز، می توانید نشان دهید که هر یک از کاراکترهای داخل پرانتز می توانند در آن موقعیت ظاهر شوند:

رنگ = همیشه "0"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809

GIST | دامنه. اینها دو نویسه هستند که با خط فاصله از هم جدا شده اند، به عنوان مثال 0-9 (اعداد اعشاری) یا 0-9a-fA-F (اعداد هگزا دسیمال):

رنگ = همیشه ""

جرج واشنگتن، ؟؟؟ جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809

GIST | نفی. اگر اولین کاراکتر عبارت در پرانتز یک caret باشد، کاراکترهای باقی مانده به عنوان مجموعه ای از کاراکترها در نظر گرفته می شوند که نباید در موقعیت داده شده عبارت منظم وجود داشته باشند:

Color=همیشه "[^7]$"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809

GIST | کلاس های کاراکتر POSIX مجموعه خاصی از کلاس های کاراکتر از پیش آماده شده وجود دارد که می توانید در عبارات منظم استفاده کنید. حدود دوازده مورد از آنها وجود دارد، فقط به سرعت به کتابچه راهنمای کاربر نگاه کنید تا هدف هر کدام را بفهمید. به عنوان مثال، اجازه دهید فقط ارقام هگزادسیمال را فیلتر کنیم:

Color=همیشه "^[[:xdigit:]]*$"

4.2 42 42abc 42 42abc

GIST | تکرار کنید (0 بار یا بیشتر). یکی از متاکاراکترهای پرکاربرد، علامت ستاره است که به معنای "تکرار کاراکتر یا عبارت قبلی صفر یا چند بار" است:

رنگ = همیشه "^*$"

جرج واشنگتن، ؟؟؟ جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جورج واشنگتن، ???

عبارات منظم اولیه BRE (عبارات منظم پایه) و عبارات منظم گسترده ERE (عبارات منظم گسترده) وجود دارد. متاکاراکترهای زیر در BRE شناسایی می شوند: ^$. * و تمام شخصیت های دیگر به صورت تحت اللفظی رفتار می شوند. آیا متاکاراکترهای زیر به ERE () ( ) اضافه شده اند؟ + | و توابع مرتبط خوب، برای اینکه همه را کاملاً گیج کنند، آنها به این موضوع در "grep" رسیدند - کاراکترهای () ( ) در BRE در صورتی که با یک بک اسلش فرار کنند به عنوان متاکاراکتر در نظر گرفته می شوند، در حالی که در ERE، یک بک اسلش در جلوی هر متاکاراکتری منجر به این واقعیت می شود که با آنها مانند واقعیات رفتار می شود.

عبارات منظم پیشرفته

GIST | تفکیک. همانطور که براکت‌های مربع تطابق‌های ممکن مختلف را برای یک کاراکتر مشخص می‌کنند، یک تفکیک به شما اجازه می‌دهد تا مطابقت‌های جایگزین را برای رشته‌هایی از کاراکترها یا عبارات مشخص کنید. نماد نوار عمودی برای نشان دادن تفکیک استفاده می شود:

Extended-regexp --color=always "George|John"

جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801 توماس جفرسون، 1801-1809 جورج واشنگتن، 1789-1797 جان آدامز، 1797-1801

GIST | صفر یا یک زمان را مطابقت دهید. در عبارات منظم توسعه‌یافته، چندین متاکاراکتر اضافی وجود دارد که نشان می‌دهد یک کاراکتر یا عبارت چقدر تکرار می‌شود (مشابه اینکه چگونه متاکاراکتر ستاره تطابق‌های ۰ یا بیشتر را نشان می‌دهد). یکی از این متاکاراکترها علامت سوال است که کاراکتر یا عبارت قبلی را اساسا اختیاری می کند:

Extended-regexp --color=همیشه "^(اندرو)؟جان"

جان آدامز، 1797-1801 اندرو جانسون، 1865-1869 لیندون بینز جانسون، 1963-1969 جان آدامز، 1797-1801 اندرو جانسون، 1865-1869

GIST | یک یا چند بار مطابقت دهید. برای این منظور یک متاکاراکتر به شکل علامت مثبت ارائه شده است. تقریباً مانند علامت ستاره عمل می کند، با این تفاوت که عبارت باید حداقل یک بار مطابقت داشته باشد:

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

جان آدامز اندرو جانسون، 1865-1869 لیندون بینز جانسون، 1963-1969 جان آدامز

GIST | تعداد دفعات مشخص شده را مطابقت دهید. برای این کار می توانید از بریس های مجعد استفاده کنید. این متاکاراکترها برای نشان دادن تعداد دقیق، محدوده و حد بالا و پایین تعداد مطابقت یک عبارت استفاده می‌شوند:

Extended-regexp --color=همیشه "(1,3)\.(1,3)\.(1,3)\.(1,3)"

42 127.0.0.1 127.0.0.1

دستور grep آنقدر مفید، غنی از ویژگی ها و استفاده آسان است که وقتی آن را بشناسید، نمی توانید بدون آن کار کنید.

ابزار grep یک ابزار جستجو و فیلتر بسیار قدرتمند است. اطلاعات متنی. این مقاله چندین نمونه از کاربرد آن را نشان می دهد که به شما امکان می دهد از قابلیت های آن قدردانی کنید.
کاربرد اصلی grep جستجوی کلمات یا عبارات در فایل ها و جریان های خروجی است. با تایپ کردن می توانید جستجو کنید خط فرمانپرس و جو و منطقه جستجو (فایل).
به عنوان مثال، برای یافتن رشته “needle” در فایل hystack.txt، از دستور زیر استفاده کنید:

$ grep needle haystack.txt

در نتیجه، grep تمام رخدادهای سوزنی را که در محتویات فایل haystack.txt با آن مواجه می شود، نمایش می دهد. توجه به این نکته ضروری است که در این مورد، grep به دنبال مجموعه ای از شخصیت ها است، نه یک کلمه. به عنوان مثال، رشته هایی که شامل کلمه "نیازی" و سایر کلماتی که حاوی دنباله "سوزن" هستند نمایش داده می شوند.


برای اینکه به grep بگویید به دنبال کلمه خاصی هستید، از کلید -w استفاده کنید. این کلید جستجو را فقط به کلمه مشخص شده محدود می کند. کلمه عبارت است از پرس و جوی که از هر دو طرف با هر فضای خالی، نقطه گذاری، یا شکست خط مشخص می شود.

$ grep -w needle haystack.txt

لازم نیست جستجو را فقط به یک فایل محدود کنید؛ grep می‌تواند در میان گروهی از فایل‌ها جستجو کند و نتایج جستجو فایلی را که مطابقت در آن پیدا شده است نشان می‌دهد. سوئیچ -n همچنین شماره خطی را که مطابقت در آن پیدا شده است اضافه می کند و سوئیچ -r به شما امکان می دهد جستجوی بازگشتی انجام دهید. این هنگام جستجو در میان فایل‌های دارای کد منبع برنامه بسیار راحت است.

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

نام فایل قبل از هر مسابقه ذکر می شود. اگر می‌خواهید نام فایل‌ها را مخفی کنید، از سوئیچ -h استفاده کنید، برعکس، اگر فقط به نام فایل‌ها نیاز دارید، سوئیچ -l را مشخص کنید.
در مثال زیر، URL ها را در فایل لاگ IRC جستجو می کنیم و 10 مورد آخر را نشان می دهیم.

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

گزینه -o به grep می گوید که به جای کل خط، فقط مطابقت الگو را چاپ کند. با استفاده از pipe، خروجی grep را به دستور tail هدایت می کنیم که به طور پیش فرض 10 خط آخر را خروجی می دهد.
اکنون تعداد پیام های ارسال شده به کانال irc توسط کاربران خاص را می شماریم. مثلا تمام پیام هایی که از خانه و محل کار فرستادم. آنها در نام مستعار متفاوت هستند، در خانه از نام مستعار user_at_home و در محل کار user_at_work استفاده می کنم.

$ grep -c "^user_at_(خانه|کار)" channel.log

با گزینه -c، grep فقط تعداد موارد منطبق را چاپ می کند، نه خود منطبقات را. رشته جستجو در داخل نقل قول قرار می گیرد زیرا حاوی کاراکترهای خاصی است که می تواند توسط پوسته به عنوان کاراکترهای کنترل شناسایی شود. لطفا توجه داشته باشید که علامت نقل قول در الگوی جستجو گنجانده نشده است. بک اسلش "" برای فرار از کاراکترهای خاص استفاده می شود.
بیایید پیام های افرادی را که دوست دارند در کانال "فریاد بزنند" جستجو کنیم. منظور ما از "جیغ" پیام هایی است که به سبک بلوندی و با تمام حروف بزرگ نوشته شده اند. برای حذف ضربات تصادفی اختصارات از جستجو، کلماتی با پنج کاراکتر یا بیشتر جستجو می کنیم:

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

برای توضیحات بیشتر می توانید به صفحه grep man مراجعه کنید.
چند مثال دیگر:

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

خطوطی از فایل /etc/passwd که حاوی ریشه رشته هستند را نمایش می دهد.

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

علاوه بر این، شماره خطوط حاوی خط جستجو شده نمایش داده می شود.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0: shutdown:/sbin:/sbin/shutdown halt: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:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC کاربر:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP کاربر: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

بررسی می کند که کدام کاربران از bash استفاده نمی کنند، به استثنای آن دسته از حساب های کاربری که nologin به عنوان پوسته آنها مشخص شده است.

# grep -c false /etc/passwd 7

تعداد حساب هایی را که /bin/false به عنوان پوسته آنها وجود دارد، می شمارد.

# بازی های grep -i ~/.bash* | تاریخچه grep -v

این دستور خطوطی را از تمام فایل‌های فهرست اصلی کاربر فعلی که نام آنها با ~/.bash شروع می‌شود، نمایش می‌دهد، به استثنای آن دسته از فایل‌هایی که نام آنها شامل تاریخچه رشته است، به طوری که مطابقت‌های موجود در ~/.bash_history که می‌توانند رشته مشابهی را در آن مشخص کنند، حذف می‌شوند. در حروف بزرگ یا کوچک لطفاً توجه داشته باشید که جستجوی کلمه "بازی" انجام شده است، می توانید هر کلمه دیگری را جایگزین کنید.
دستور grep و عبارات منظم

بر خلاف مثال قبلی، اکنون فقط آن خطوطی را نشان خواهیم داد که با خط "ریشه" شروع می شوند:

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

اگر بخواهیم ببینیم کدام حساب‌ها اصلاً از پوسته استفاده نکرده‌اند، به دنبال خطوطی می‌گردیم که با کاراکتر ":" ختم می‌شوند:

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

برای بررسی اینکه آیا متغیر PATH در فایل ~/.bashrc شما صادر شده است، ابتدا خطوط را با "export" انتخاب کنید و سپس به دنبال خطوطی بگردید که با خط "PATH" شروع می شوند. در این حالت MANPATH و دیگران نمایش داده نمی شوند راه های ممکن:

# صادرات grep ~/.bashrc | grep "PATH" صادرات PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

کلاس های شخصیت

عبارت در پرانتز فهرستی از کاراکترهای محصور در کاراکترهای [" و "]" است. با هر کاراکتر مشخص شده در این لیست مطابقت دارد. اگر اولین کاراکتر لیست "^" باشد، با هر کاراکتری که در لیست نیست مطابقت دارد. برای مثال، عبارت منظم "" با هر رقمی مطابقت دارد.

در یک عبارت در براکت مربع، می توانید محدوده ای متشکل از دو کاراکتر که با خط فاصله از هم جدا شده اند را مشخص کنید. سپس عبارت با هر تک آهنگی که طبق قوانین مرتب سازی در داخل این دو کاراکتر قرار می گیرد، از جمله این دو کاراکتر، مطابقت دارد. این ترکیب و مجموعه کاراکتر مشخص شده در منطقه را در نظر می گیرد. به عنوان مثال، هنگامی که محلی پیش فرض C است، عبارت "" معادل عبارت "" است. بسیاری از زبان‌ها وجود دارند که مرتب‌سازی در آنها به ترتیب فرهنگ لغت انجام می‌شود، و در این زبان‌ها "" به طور کلی معادل "" نیست، که در آن، برای مثال، ممکن است معادل عبارت "" باشد. برای استفاده از تفسیر سنتی عبارت مشخص شده در پرانتز، می‌توانید از زبان C با تنظیم آن استفاده کنید. متغیر محیطیمقدار LC_ALL "C".

در نهایت، کلاس‌های کاراکتری با نام‌های خاص وجود دارد که در داخل عبارات در براکت مربع مشخص می‌شوند. اطلاعات تکمیلیبرای اطلاعات در مورد این عبارات از پیش تعریف شده، به صفحات man یا مستندات دستور grep مراجعه کنید.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nobody:x:99: فلاپی:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

مثال تمام خطوطی را که شامل کاراکتر "y" یا نویسه "f" هستند را نشان می دهد.
کاراکترهای جهانی (فراراکترها)

استفاده کنید "." برای مطابقت با هر شخصیت اگر می خواهید لیستی از همه آنها را دریافت کنید کلمات انگلیسی، از یک فرهنگ لغت گرفته شده است که شامل پنج کاراکتر است که با "c" شروع می شود و با "h" ختم می شود (مفید برای حل جدول کلمات متقاطع):

#گرپ" " /usr/share/dict/words catch clash پارچه مربی نیمکت سرفه له شدن

اگر می خواهید خطوطی را که حاوی یک کاراکتر نقطه هستند به صورت واقعی نمایش دهید، در دستور grep گزینه -F را مشخص کنید. نمادها "< " и «>"به معنای وجود یک خط خالی قبل و بر این اساس بعد از حروف مشخص شده است. به این معنی که کلمات موجود در فایل word باید بر اساس آن نوشته شوند. اگر می خواهید تمام کلمات متن را با توجه به الگوهای مشخص شده بدون در نظر گرفتن خطوط خالی پیدا کنید، نمادها را حذف کنید.< " и «>"، برای جستجوی دقیق تر فقط کلمات، از کلید -w استفاده کنید.

برای یافتن کلماتی که می توانند هر تعداد کاراکتر بین "c" و "h" داشته باشند، از یک ستاره (*) استفاده کنید. مثال زیر تمام کلماتی که با "c" شروع می شوند و با "h" ختم می شوند را از فرهنگ لغت سیستم انتخاب می کند:

#گرپ" " /usr/share/dict/words خلیفه پول نقد یوزپلنگ - خروجی حذف شد--

اگر می خواهید کاراکتر ستاره تحت اللفظی را در یک فایل یا جریان خروجی پیدا کنید، از نقل قول های تکی برای پیدا کردن آن استفاده کنید. کاربر در مثال زیر ابتدا سعی می کند بدون استفاده از نقل قول به دنبال "ستاره" در فایل /etc/profile بگردد که نتیجه آن یافت نشدن چیزی است. هنگامی که از نقل قول استفاده می شود، نتیجه خروجی است:

# grep * /etc/profile # grep "*" /etc/profile برای i در /etc/profile.d/*.sh ; انجام دادن

ظهر بخیر، مهمانان!

در مقاله امروز می خواهم به چنین موضوع بزرگی بپردازم عبارات با قاعده. فکر می‌کنم همه می‌دانند که مبحث رجکس‌ها (که به عبارات منظم در زبان عامیانه گفته می‌شود) در محدوده یک پست گسترده است. بنابراین، سعی می کنم به طور خلاصه، اما تا حد امکان واضح، افکار خود را جمع آوری و به شما منتقل کنم.

اجازه دهید با این جمله شروع کنم که چندین نوع عبارات منظم وجود دارد:

1. عبارات منظم سنتی(آنها نیز پایه، پایه و عبارات منظم اولیه(BRE))

  • نحو این عبارات به عنوان منسوخ تعریف شده است، اما با این وجود هنوز هم گسترده است و توسط بسیاری از ابزارهای یونیکس استفاده می شود.
  • عبارات با قاعده اصلی شامل متاکاراکترهای زیر است (در زیر در مورد معانی آنها بیشتر توضیح می دهیم):
    • \( \) - نسخه اولیه برای ( ) (در توسعه یافته)
    • \(\) - نسخه اولیه برای () (در توسعه یافته)
    • \n، جایی که n- شماره از 1 تا 9
  • ویژگی های استفاده از این متا کاراکترها:
    • یک ستاره باید از عبارت مربوط به یک کاراکتر پیروی کند. مثال: *.
    • اصطلاح \( مسدود کردن\)* باید نادرست در نظر گرفته شود. در برخی موارد با صفر یا بیشتر تکرار رشته مطابقت دارد مسدود کردن. در برخی دیگر با رشته مطابقت دارد مسدود کردن* .
    • در یک کلاس کاراکتر، معانی کاراکترهای خاص تا حد زیادی نادیده گرفته می شوند. موارد خاص:
    • برای افزودن یک کاراکتر ^ به یک مجموعه، نباید ابتدا در آنجا قرار گیرد.
    • برای افزودن یک کاراکتر به یک مجموعه، باید ابتدا یا آخر در آنجا قرار گیرد. مثلا:
      • الگوی نام DNS، که ممکن است شامل حروف، اعداد، منفی و یک نقطه باشد: [-0-9a-zA-Z.] ;
      • هر کاراکتری به جز منهای و اعداد: [^-0-9] .
    • برای افزودن یک کاراکتر [ یا ] به یک مجموعه، ابتدا باید در آنجا قرار گیرد. مثلا:
      • مطابقت دارد ]، [، a یا b.

2. عبارات با قاعده پیشرفته(آن ها هستند عبارات منظم توسعه یافته(ERE))

  • نحو این عبارات مشابه نحو عبارات اصلی است، به استثنای:
    • استفاده از بک اسلش برای متاکاراکترهای ( ) و () حذف شد.
    • اسلش معکوس قبل از اینکه یک متاکاراکتر بر معنای خاص آن غلبه کند.
    • از لحاظ نظری رد شد بی رویهطرح\ n .
    • متاکاراکترهای اضافه شده + , ? ، | .

3. عبارات منظم سازگار با پرل(آن ها هستند عبارات منظم سازگار با Perl(PCRE))

  • سینتکس غنی تر و در عین حال قابل پیش بینی حتی از POSIX ERE دارند، بنابراین اغلب توسط برنامه ها استفاده می شوند.

عبارات با قاعده شاملقالب ها، یا بهتر است بگوییم یک قالب تنظیم کنیدجستجو کردن. قالب شاملاز جانب قوانینجستجوهایی که از آن تشکیل شده است شخصیت هاو متا شخصیت ها.

قوانین جستجوبا موارد زیر تعیین می شوند عملیات:

شمارش |

لوله (|)می توان گفت گزینه های معتبر را از هم جدا می کند - منطقی OR. به عنوان مثال، "خاکستری | خاکستری" مطابقت دارد خاکسترییا خاکستری.

گروه یا اتحادیه()

براکت های گردبرای تعریف محدوده و تقدم عملگرها استفاده می شود. برای مثال، «خاکستری|خاکستری» و «gr(a|e)y» الگوهای متفاوتی هستند، اما هر دو مجموعه‌ای را توصیف می‌کنند که شامل خاکستریو خاکستری.

کمیت ()؟ * +

کمیت کنندهبعد از اینکه یک شخصیت یا گروه چند بار تعیین می کند پیشینبیان ممکن است رخ دهد.

بیان کلی، تکرار ممکن است باشد از m تا n شامل.

بیان کلی m یا بیشتر تکرار می شود.

بیان کلی نه بیشتر از n تکرار.

صافn تکرار.

علامت سوالبه معنای 0 یا 1بارها، همان {0,1} . به عنوان مثال، "colou?r" مطابقت دارد و رنگ، و رنگ.

ستارهبه معنای 0، 1 یا هر عددییک بار ( {0,} ). به عنوان مثال، "go*gle" مطابقت دارد جیغ زدن, گوگل, گوگلو غیره.

به علاوهبه معنای حداقل 1یک بار ( {1,} ). به عنوان مثال، "go+gle" مطابقت دارد گوگل, گوگلو غیره (اما نه جیغ زدن).

نحو دقیق این عبارات منظم به پیاده سازی وابسته است. (یعنی در عبارات منظم اولیهنمادها (و)- با بک اسلش فرار کرد)

متا شخصیت هابه عبارت ساده، نمادهایی هستند که با معنای واقعی خود، یعنی نماد مطابقت ندارند. (نقطه) یک نقطه نیست، بلکه یک شخصیت و غیره است. لطفاً با متا کاراکترها و معانی آنها آشنا شوید:

. مطابقت دارد تنهاهر نماد
[چیزی] سازگار هر مجردینویسه از آنهایی که در داخل پرانتز قرار دارند. در این مورد: کاراکتر "-" به معنای واقعی کلمه فقط در صورتی تفسیر می شود که بلافاصله پس از باز شدن یا قبل از پرانتز بسته شود: یا [-abc]. در غیر این صورت، یک فاصله کاراکتر را نشان می دهد، به عنوان مثال، با "a"، "b" یا "c" مطابقت دارد. مربوط به حروف کوچک الفبای لاتین است. این عناوین را می توان ترکیب کرد: مطابق با a، b، c، q، r، s، t، u، v، w، x، y، z. برای مطابقت با کاراکترهای "[" یا "]، کافی است که براکت بسته اولین کاراکتر بعد از کاراکتر آغازین بود: "]، "[، "a" یا "b" را منطبق می‌کند. اگر مقدار در براکت‌های مربع قبل از یک کاراکتر ^ باشد، مقدار عبارت مطابقت دارد. تک شخصیتاز میان آن ها که داخل پرانتز نیستند. برای مثال، [^abc] با هر کاراکتری غیر از "a"، "b" یا "c" مطابقت دارد. [^a-z] با هر کاراکتری به جز حروف کوچک در الفبای لاتین مطابقت دارد.
^ با ابتدای متن (یا ابتدای هر خط اگر حالت خط به خط باشد) مطابقت دارد.
$ انتهای متن (یا انتهای هر خط اگر حالت خط به خط باشد) مطابقت دارد.
\(\) یا () یک "زیرعبارت مشخص شده" (عبارت گروهی) را اعلام می کند که می تواند بعداً استفاده شود (عنصر زیر را ببینید: \ n). یک "زیرعبارت مشخص شده" نیز یک "بلوک" است. برخلاف سایر عملگرها، این یکی (در نحو سنتی) به یک بک اسلش نیاز دارد؛ در Extended و Perl، کاراکتر \ مورد نیاز نیست.
\n جایی که n- این یک عدد از 1 تا 9 است. مطابقت دارد nامین عبارت فرعی مشخص شده (به عنوان مثال (abcd)\0، یعنی کاراکترهای abcd با صفر مشخص شده اند). این طرح به صورت تئوری است بی رویه، در نحو عبارت منظم توسعه یافته پذیرفته نشد.
*
  • ستارهپس از عبارتی که با یک کاراکتر مطابقت دارد، مطابقت دارد صفریا بیشتر کپی هااین عبارت (قبلی) به عنوان مثال، "*" با رشته خالی، "x"، "y"، "zx"، "zyx" و غیره مطابقت دارد.
  • \n*، جایی که nرقمی از 1 تا 9 است که با صفر یا چند مورد مطابقت دارد nعبارت فرعی مشخص شده برای مثال، "\(a.\)c\1*" با "abcab" و "abcaba" مطابقت دارد، اما با "abcac" مطابقت ندارد.

عبارت محصور شده در "\(" و "\)" به دنبال "*" باید غیرقانونی در نظر گرفته شود. در برخی موارد، با صفر یا چند مورد از رشته ای که در داخل پرانتز قرار گرفته بود مطابقت دارد. در برخی دیگر، با توجه به کاراکتر "*" با عبارت محصور شده در پرانتز مطابقت دارد.

\{ایکس,y\} مربوط به آخرین ( آینده) حداقل بلوک رخ می دهد ایکسو نه بیشتر yیک بار. برای مثال، "a\(3،5\)" با "aaa"، "aaaa" یا "aaaaa" مطابقت دارد. بر خلاف سایر عملگرها، این یکی (در نحو سنتی) به یک بک اسلش نیاز دارد.
.* تعیین هر تعداد از هر کاراکتر بین دو قسمت از یک عبارت منظم.

متاکراکترها به ما کمک می کنند تا از مسابقات مختلف استفاده کنیم. اما چگونه می‌توانیم یک متاکاراکتر را به عنوان یک کاراکتر منظم، یعنی نماد [ (براکت) به معنای یک کروشه نشان دهیم؟ فقط:

  • باید قبل از ( سپر) متاکاراکتر (. * + \ ? ( )) بک اسلش. مثلا \. یا \[

برای ساده کردن تعریف برخی از مجموعه شخصیت ها، آنها به اصطلاح ترکیب شدند. کلاس ها و دسته های شخصیت ها. POSIX اعلان کلاس‌ها و دسته‌های کاراکتر خاصی را استاندارد کرده است، همانطور که در جدول زیر نشان داده شده است:

کلاس POSIX به طور مشابه تعیین
[:بالا:] کاراکترهای بزرگ
[:lower:] کاراکترهای کوچک
[:alpha:] حروف بزرگ و کوچک
[:alnum:] اعداد، حروف بزرگ و کوچک
[: رقم:] شماره
[:xdigit:] ارقام هگزادسیمال
[:punct:] [.,!?:…] علائم نگارشی
[:جای خالی:] [\t] فضا و TAB
[:فضا:] [\t\n\r\f\v] رد شدن از کاراکترها
[:cntrl:] شخصیت های کنترل
[:graph:] [^\t\n\r\f\v] نمادهای مهر
[:چاپ:] [^\t\n\r\f\v] نمادها را مهر و موم کنید و از نمادها بگذرید

در regex چنین چیزی وجود دارد:

حرص و طمع

من سعی خواهم کرد تا آنجا که ممکن است آن را واضح توصیف کنم. فرض کنید می خواهیم همه چیز را پیدا کنیم تگ های HTMLدر برخی از متن ها پس از بومی سازی مشکل، می خواهیم مقادیر موجود بین آن را پیدا کنیم< и >، همراه با همین براکت ها. اما می دانیم که تگ ها طول های متفاوتی دارند و خود حداقل 50 تگ وجود دارد. فهرست کردن همه آنها، محصور کردن آنها در متاسامبول ها، کاری بسیار وقت گیر است. اما می دانیم که یک عبارت داریم.* (ستاره نقطه)، که هر تعداد از هر کاراکتر در خط را مشخص می کند. با استفاده از این عبارت سعی می کنیم در متن پیدا کنیم (

بنابراین، نحوه ایجاد RAID سطح 10/50 در یک کنترلر LSI MegaRAID (همچنین مربوط به: Intel SRCU42x، Intel SRCS16):

) همه مقادیر بین< и >. در نتیجه، ENTIRE خط با این عبارت مطابقت خواهد داشت. چرا، زیرا regex حریص است و سعی می کند هر تعداد کاراکتر را بین آنها ثبت کند< и >، به ترتیب کل خط شروع می شود < p>پس...و پایان دادن ...> متعلق به این قانون خواهد بود!

امیدوارم این مثال روشن کند که طمع چیست. برای رهایی از این حرص و طمع می توانید مسیر زیر را طی کنید:

  • نمادها را در نظر بگیرید نهمطابق با الگوی مورد نظر (به عنوان مثال:<[^>]*> برای مورد فوق)
  • با اضافه کردن یک تعریف از کمیت به عنوان غیر حریص، از شر طمع خلاص شوید:
    • *؟ - معادل "نه حریص" ("تنبل") *
    • +؟ - معادل "نه حریص" ("تنبل") +
    • (ن،)؟ - معادل "طمع نیست" ("تنبل") (n،)
    • .*؟ - معادل «طمع نیست» («تنبل»).*

من می خواهم به همه موارد بالا اضافه کنم نحو عبارت منظم توسعه یافته:

عبارات منظم در POSIX شبیه به نحو سنتی یونیکس هستند، اما با اضافه کردن برخی متاکاراکترها:

به علاوهنشان میدهد که قبلینماد یا گروهممکن است تکرار شود یک یا چند بار. برخلاف ستاره، حداقل یک تکرار لازم است.

علامت سوالمیکند قبلینماد یا گروه اختیاری است. به عبارت دیگر، در خط مربوطه آن ممکن است غایب یا حضور داشته باشدصاف یکییک بار.

نوار عمودیجایگزین های عبارت منظم را جدا می کند. یک کاراکتر دو گزینه را مشخص می کند، اما می تواند تعداد بیشتری از آنها وجود داشته باشد، فقط از نوارهای عمودی بیشتری استفاده کنید. باید به خاطر داشت که این اپراتور از حداکثر استفاده می کند بخش احتمالیاصطلاحات. به همین دلیل، عملگر جایگزین بیشتر در داخل پرانتز استفاده می شود.

استفاده از بک اسلش نیز لغو شده است: \(…\) تبدیل به (…) و \(…\) می شود (…).

برای پایان دادن به پست، چند نمونه از استفاده از regex را می‌آورم:

$ cat text1 1 سیب 2 گلابی 3 موز $ grep p text1 1 سیب 2 گلابی $ grep "pp*" text1 1 سیب 2 گلابی $ cat text1 | grep "l\|n" 1 سیب 3 موز $ echo -e "در اینجا یک\n* را پیدا کنید" | grep "\*" * در اینجا $ grep "pl\?.*r" text1 # p، در خطوطی که r 2 pear $ grep "a.." وجود دارد text1 # خطوط با a به دنبال حداقل 2 کاراکتر 1 سیب 3 موز $ grep "" text1 # جستجو برای خطوطی که شامل 3 یا p 1 سیب 2 گلابی 3 موز $ echo -e "پیدا کردن یک\n* اینجا\nsomewhere." | grep "[.*]" * اینجا جایی..name]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # جایگزین a با A در تمام خطوط که بعد از a می آید a یا بعد از p می آید p 1 سیب 2 گلابی 3 bAnAnA *\./ LAST WORD./g" اول. A LAST WORD. این آخرین کلمه است.

با احترام، مک سیم!

عبارات منظم بسیار هستند ابزار قدرتمندبرای جستجوی متن بر اساس الگو، پردازش و تغییر رشته ها، که می تواند برای حل بسیاری از مشکلات استفاده شود. در اینجا موارد اصلی وجود دارد:

  • بررسی ورودی متن؛
  • جستجو و جایگزینی متن در یک فایل؛
  • تغییر نام دسته ای فایل ها؛
  • تعامل با سرویس هایی مانند آپاچی؛
  • بررسی یک رشته برای مطابقت با یک الگو.

این دور از ذهن است لیست کامل، عبارات منظم به شما امکان می دهد کارهای بیشتری انجام دهید. اما برای کاربران جدید ممکن است خیلی پیچیده به نظر برسند، زیرا از زبان خاصی برای ایجاد آنها استفاده می کنند. اما با توجه به قابلیت های ارائه شده، هر مدیر سیستم باید عبارات منظم لینوکس را بداند و بتواند از آن استفاده کند.

در این مقاله، عبارات معمولی bash را برای مبتدیان بررسی می کنیم تا بتوانید تمام ویژگی های این ابزار را درک کنید.

دو نوع کاراکتر وجود دارد که می توان در عبارات منظم استفاده کرد:

  • حروف معمولی؛
  • متا شخصیت ها

کاراکترهای رایج حروف، اعداد و علائم نگارشی هستند که هر رشته را تشکیل می دهند. همه متون از حروف تشکیل شده اند و می توانید از آنها در عبارات منظم برای یافتن موقعیت مورد نظر در متن استفاده کنید.

فراکاراکترها چیز دیگری هستند، آنها هستند که به عبارات منظم قدرت خود را می دهند. با متاکاراکترها می توانید خیلی بیشتر از جستجوی یک کاراکتر واحد انجام دهید. می توانید ترکیبی از نمادها را جستجو کنید، از تعداد پویا نمادها استفاده کنید و محدوده ها را انتخاب کنید. همه کاراکترهای ویژه را می توان به دو نوع تقسیم کرد: کاراکترهای جایگزین که جایگزین کاراکترهای معمولی می شوند یا عملگرهایی که نشان می دهند چند بار می توان یک کاراکتر را تکرار کرد. سینتکس عبارت منظم به شکل زیر خواهد بود:

کاراکتر_ منظم کاراکتر_اپراتور ویژه

شخصیت_جایگزین_خاص کاراکتر_اپراتور ویژه

  • \ - کاراکترهای ویژه حروف الفبا با علامت بک اسلش شروع می شوند و همچنین در صورت نیاز به استفاده از یک کاراکتر خاص در قالب هر علامت نقطه گذاری استفاده می شود.
  • ^ - شروع خط را نشان می دهد.
  • $ - پایان خط را نشان می دهد.
  • * - نشان می دهد که کاراکتر قبلی ممکن است 0 بار یا بیشتر تکرار شود.
  • + - نشان می دهد که کاراکتر قبلی باید یک یا چند بار تکرار شود.
  • ? - کاراکتر قبلی می تواند صفر یا یک بار رخ دهد.
  • (ن)- نشان می دهد که چند بار (n) کاراکتر قبلی باید تکرار شود.
  • (N,n)- کاراکتر قبلی را می توان از N تا n بار تکرار کرد.
  • . - هر کاراکتری به جز خوراک خط.
  • - هر کاراکتر مشخص شده در پرانتز؛
  • x|y- نماد x یا نماد y؛
  • [^az]- هر کاراکتری به جز آنهایی که در پرانتز مشخص شده اند.
  • - هر کاراکتری از محدوده مشخص شده؛
  • [^a-z]- هر شخصیتی که در محدوده نیست.
  • \b- مرز یک کلمه را با فاصله نشان می دهد.
  • \ B- به این معنی است که کاراکتر باید داخل یک کلمه باشد، برای مثال، ux با uxb یا tuxedo مطابقت دارد، اما با لینوکس مطابقت ندارد.
  • \d- به این معنی است که نماد یک عدد است.
  • \ D- نماد غیر دیجیتال؛
  • \n- کاراکتر خوراک خط.
  • \s- یکی از کاراکترهای فاصله، فاصله، تب، و غیره.
  • \S- هر کاراکتری به جز فضا؛
  • \ t- کاراکتر تب؛
  • \ v- کاراکتر زبانه عمودی؛
  • \w- هر کاراکتر الفبایی، از جمله خط زیر.
  • \ W- هر کاراکتر الفبایی، به جز خط زیر.
  • \uXXX- نماد Unicdoe

مهم است که توجه داشته باشید که باید قبل از حروف الفبای خاص از یک اسلش استفاده کنید تا نشان دهد که یک کاراکتر خاص بعد از آن قرار می گیرد. عکس آن نیز صادق است، اگر می خواهید از یک کاراکتر خاص استفاده کنید که بدون اسلش به عنوان یک کاراکتر معمولی استفاده می شود، باید یک اسلش اضافه کنید.

به عنوان مثال، شما می خواهید خط 1+ 2=3 را در متن پیدا کنید. اگر از این رشته به عنوان یک عبارت منظم استفاده کنید، چیزی پیدا نخواهید کرد، زیرا سیستم علامت مثبت را به عنوان یک کاراکتر خاص تفسیر می کند که نشان می دهد واحد قبلی باید یک یا چند بار تکرار شود. بنابراین باید از آن فرار کرد: 1 \+ 2 = 3. بدون فرار، عبارت منظم ما فقط با رشته 11=3 یا 111=3 و غیره مطابقت دارد. نیازی به خط زدن در مقابل برابر نیست، زیرا کاراکتر خاصی نیست.

نمونه هایی از استفاده از عبارات منظم

اکنون که ما اصول اولیه را پوشش دادیم و می‌دانید که همه چیز چگونه کار می‌کند، تنها چیزی که باقی می‌ماند این است که دانشی را که در مورد عبارات منظم لینوکس grep به دست آورده‌اید در عمل ادغام کنید. دو کاراکتر ویژه بسیار مفید ^ و $ هستند که شروع و پایان یک خط را نشان می دهند. به عنوان مثال، ما می خواهیم همه کاربرانی را که نام آنها با s شروع می شود در سیستم خود ثبت کنیم. سپس می توانید از یک عبارت منظم استفاده کنید "^s". می توانید از دستور egrep استفاده کنید:

egrep "^s" /etc/passwd

اگر بخواهیم خطوط را بر اساس آخرین کاراکتر در خط انتخاب کنیم، می توانیم از $ برای این کار استفاده کنیم. به عنوان مثال، بیایید همه کاربران سیستم را انتخاب کنیم، بدون پوسته، رکوردهای مربوط به چنین کاربرانی به false ختم می شوند:

egrep "false$" /etc/passwd

برای نمایش نام های کاربری که با s یا d شروع می شوند، از این عبارت استفاده کنید:

egrep "^" /etc/passwd

همین نتیجه را می توان با استفاده از نماد "|" به دست آورد. گزینه اول برای محدوده ها مناسب تر است و گزینه دوم بیشتر برای معمولی یا/یا استفاده می شود:

egrep "^" /etc/passwd

حالا بیایید همه کاربرانی که نامشان سه کاراکتر نباشد را انتخاب کنیم. نام کاربری با دو نقطه به پایان می رسد. می توان گفت که می تواند حاوی هر کاراکتر الفبایی باشد که باید سه بار قبل از دو نقطه تکرار شود:

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

نتیجه گیری

در این مقاله به عبارات منظم لینوکس پرداختیم، اما این فقط اصول اولیه بود. اگر کمی عمیق تر بگردید، متوجه خواهید شد که با این ابزار می توانید کارهای بسیار جالب تری انجام دهید. وقت گذاشتن برای تسلط بر عبارات منظم قطعا ارزشش را دارد.

برای نتیجه گیری، یک سخنرانی از Yandex در مورد عبارات منظم:



 


خواندن:



HTC Sync Manager: نحوه استفاده، مکان دانلود، حل مشکل

HTC Sync Manager: نحوه استفاده، مکان دانلود، حل مشکل

HTC Sync ابزاری برای اتصال گوشی های هوشمند HTC به کامپیوتر، تبادل داده ها و همگام سازی داده ها بین آنهاست. این برنامه روی...

Xperia Z3 و Xperia Z3 Compact: بررسی و مقایسه مرورگر وب یک برنامه نرم افزاری برای دسترسی و مشاهده اطلاعات در اینترنت است.

Xperia Z3 و Xperia Z3 Compact: بررسی و مقایسه مرورگر وب یک برنامه نرم افزاری برای دسترسی و مشاهده اطلاعات در اینترنت است.

نوشتن این مقایسه منو به دلیل چنین سؤال مکرری در مورد اینکه چه چیزی را انتخاب کنید - Sony Xperia Z3 یا Xperia Z3 Compact ایجاد شد؟ بیشتر اوقات ...

تعرفه های جدید Kyivstar اتصال در دسترس نیست

تعرفه های جدید Kyivstar اتصال در دسترس نیست

شرکت Kievtsar به مشترکین خود اتصال به بسته های تعرفه ای مختلف را به صورت قراردادی ارائه می دهد. از جمله مزایای فراوان این ...

اینترنت تلفن فلای کار نمی کند

اینترنت تلفن فلای کار نمی کند

دستورالعمل ها دریابید - آیا امکان اتصال به اینترنت در مدل گوشی شما وجود دارد؟ این را می توانید در لیست مشخصات فنی پیدا کنید ...

فید-تصویر RSS