عبارات منظم regular expression

by Ahmed on ۲۳/۱۲/۱۳۸۹

به syntax های خاصی که الگوی متن موردنظر رو مشخص میکنه عبارات منظم یا regex یا regexp گفته میشود.

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

نکته : گرچه filename globbing و regular expression بسیار شبیه هم به نظر میرسند امابنیادن بسیار متفاوتند.

خوب برای شروع ، از نقطه بسیار ابتدایی استفاده میکنیم و این نقطه چیزی جز کار کردن با دستور grep نیست.

Grep برای جستجوی یک الگوی خاص از متن داخل یک فایل میگرده و هر خط که اون الگو رو داشته باشه چاپ میکنه.

برای مثال دستور زیر رو وارد میکنیم:

grep bash /etc/passwd

و خروجی به صورت زیر ظاهر میشه:

root:x:0:0:root:/root:/bin/bash

couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash

pesarkhobeee:x:1000:1000:Farid Ahmadian,,,:/home/pesarkhobeee:/bin/bash

lfs:x:1001:1001::/home/lfs:/bin/bash

همونطور که دیده میشه grep فقط خطوطی از فایل passwd رو چاپ کرد که شامل bash بودند.

در حالات عادی مصل مورد بالا شما فقط کافیه متن مورد نظر رو بدون هبچ کار خاصی بنویسید . اما وقتی متنتون شامل +, ., *, [, ],‌یا \ بشه باید کل متن رو داخل علامت نقل قول قرار بدین و قبل از این علائم خاص یک backslash بیارین . برای مثال:

• /tmp (scans for the literal string /tmp)

• “\[box\]” (scans for the literal string [box])

• “\*funny\*” (scans for the literal string *funny*)

• “ld\.so” (scans for the literal string ld.so)

تا اینجا ما با الگوهای خیلی ساده آشنا شدیم بیایید با الگوهای پیشرفته تر آشنا شویم:

. :

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

grep dev.sda /etc/fstab

# / was on /dev/sda3 during installation

# /home was on /dev/sda4 during installation

# swap was on /dev/sda7 during installation

/dev/sda5 /mnt/lfs ext3 defaults 1 2

همون طور که میبینید . در اینجا همان کاری را انجام میدهد که ؟ در glob

[] :

اگر ما بخواهیم کلماتی را محدود تر از . جستجو کنیم از [] استفاده میکنیم :

grep dev.sda[34] /etc/fstab

# / was on /dev/sda3 during installation

# /home was on /dev/sda4 during installation

[^]:

شما میتوانید کاری را که [] میکرد را با استفاده از [^] بر عکس کنید :

grep dev.sda[^34] /etc/fstab

# swap was on /dev/sda7 during installation

/dev/sda5 /mnt/lfs ext3 defaults 1 2

نکته : این بسیار مهم است که ما بدانیم علائم مورد بحث در [] معنای متفاوتی پیدا میکند ، برای مثال [.] همان معنایی را میدهد که ./ میدهد :

grep dev[.]sda /etc/fstab = grep “dev\.sda” /etc/fstab

* :

بعصی از متاکارارکتر ها باعث عوض شدن و گسترده تر شدن معنای کاراکتر قبل خود میشوند که در این بین * هم از ان نوع است . * به معنای این است که کاراکتر قبل از ان صفر یا بیشتر بار میتواند تکرار شود . به مثال های زیر دقت کنید :

• ab*c matches abbbbc but not abqc (if a glob, it would match both strings — can you

figure out why?)

• ab*c matches abc but not abbqbbc (again, if a glob, it would match both strings)

• ab*c matches ac but not cba (if a glob, ac would not be matched, nor would cba)

• b[cq]*e matches bqe and be (if a glob, it would match bqe but not be)

• b[cq]*e matches bccqqe but not bccc (if a glob, it would match the first but not the

second as well)

• b[cq]*e matches bqqcce but not cqe (if a glob, it would match the first but not the

second as well)

• b[cq]*e matches bbbeee (this would not be the case with a glob)

• .* will match any string. (if a glob, it would match any string starting with .)

• foo.* will match any string that begins with foo (if a glob, it would match any string

starting with the four literal characters foo..)

$ و ^ :

کاراکتر های ^ و $ برای مشخص کردن اول و اخر خطوط استفاده میشود .

با استفاده از ^ ما میتوانیم الگوی خود را از اول خط مشخص کنیم :

grep “^#” /etc/fstab

خط بالا نشان میدهد که من تمام خطوطی را که با # شروع میشوند میخواهم .

و خط زیر تمام خطوطی که با # شروع میشوند و با . تمام میشوند را نشان میدهند :

grep ‘^#.*\.$’ /etc/fstab

و در پایان یک استفاده عملی که از این امکان جذاب کردم اینجا مینویسم :

cat List_Zanjanhost_-NOVINFARD|grep ‘ [_a-zA-Z]*\.[_a-zA-Z]* ‘|cut -d ‘ ‘ -f9>list2

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

[email protected]

There are 4 comments in this article:

  1. ۳۰/۰۷/۱۳۹۰نقل و نبات شماره شانزده (tips & tricks) جایگزینی یک متن در تمام فایهل با بش اسکریپت - یک Freelancer آزاد says:

    [...] با کمی بش اسکریپت و عبارات منظم این کارو [...]

  2. ۴/۰۸/۱۳۹۰نقل و نبات شماره هفدهم (tips & tricks) عبارات منظم در php - یک Freelancer آزاد says:

    [...] کارو خیلی راحت میشه با عبارات منظم تو یه خط اینجام داد! و کد زیرو بهم [...]

  3. ۵/۱۰/۱۳۹۰sahar says:

    سلام.ببخشید ۱سوال داشتم.اگر بخواهیم با دستورgrepدنبال keyword های خاصی بگردیم تو یک فایل که اولشون با رقم شروع میشه چیکار باید کرد؟

  4. ۱۵/۱۰/۱۳۹۰فرید says:

    @sahar
    دستور زیر خط هایی رو که با عدد شروع میشه رو نشون میده
    grep ‘^[1-9]‘ filename
    و دستور زیر هم فکر کنم اگه تو خط کلمه ای با عدد شروع شده باشه یه بکشه بیرون
    grep ‘ [1-9].* ‘ filename

Write a comment: