عبارات منظم 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: