یکی از ابزار شناخته شده جستجو روی سیستم های Unix که میتوان برای جستجوی هر چیزی، خواه یک فایل یا یک خط یا چندین خط از یک فایل، ابزار grep میباشد. این ابزار در کاربرد بسیار وسیع میباشد که با تعداد زیادی از آپشن ها همراه است به طول مثال جستجو با استفاده از پترن string یا پترن reg-ex یا reg-ex های برپایه perl و غیره.
به دلیل اینکه این دستور در کاربرد بسیار متغییر عمل میکند دارای انواع بیشماری از جمله grep, egrep (Extended GREP), fgrep (Fixed GREP), pgrep (Process GREP), rgrep (Recursive GREP) و غیره میباشد. اما این دستورات تفاوت های ناچیزی با grep اصلی دارند که آنها را متمایز ساخته و توسط برنامه نویسان متفاوت سیستم های لینوکسی برای تسک های خاص مورد استفاده قرار میگیرند.
نکته اصلی در اینجا تفاوت بین سه نوع اصلی grep, egrep و fgrep میباشد که باعث میشود کاربران لینوکسی یکی از آنها یا ورژن دیگری را با توجه به نیاز خود انتخاب کنند.
Meta-Character های خاص Grep
+ : برابر با یک یا چندین نمونه از کاراکتر قبلی
? : اغلب نمایشگر یک بار تکرار از کاراکتر قبل به طول مثال a? با a یا aa مچ خواهد شد.
) : آغاز عبارت جایگزین
( : پایان عبارت جایگزین
| : مچ شده با یکی از عبارات جدا شده توسط pip به صورت مثال "cde(a|b)" با bcde یا acde مچ خواهد شد.
} : این متا کاراکتر نمایشگر آغاز از یک رنج مشخص شده میباشد. به طول مثال "a{2}" با aa در فایل مچ خواهد شد. (هر جای a دو بار تکرار شده باشد)
{ : این متا کاراکتر نمایشگر پایان یک رنج مشخص شده میباشد.
تفاوت های بین Grep, Egrep و Fgrep
یکسری از تفاوت های بین Grep, Egrep و Fgrep میتواند همانند زیر مشخص شود. برای این مجموعه از مثالها ما فایل زیر (mohammad.txt) را در نظر میگیریم و عملیات را روی آن اجرا میکنیم.
دستور Grep
grep یا Global Regular Expression Print یک برنامه اصلی برای جستجو روی سیستم های Unix میباشد. که میتوان هر نوع از string را روی فایل یا لیستی از فایل ها یا حتی خروجی هر دستوری جستجو کرد.
همچنین پیشنهاد میشود مقاله زیر را مطالعه کنید.
12 مثال عملی از دستور Grep در Linux
دستور grep همچنین جدای از string های نرمال Regular Expression های ابتدایی را به عنوان پترن جستجو استفاده میکند. در Basic Regular Expression ها (BRE) در حقیت متا کاراکترهایی مانند '{','}','(',')','|','+','?' معنی خودشان را از دست میدهند و با عنوان کاراکترهای نرمال string رفتار میکنند و باید از آنها صرف نظر کرد اگر که بخواهیم به عنوان کاراکترهای خاص رفتار کنند.
همچنین پیشنهاد میشود مطالعه کنید.
11 دستور پیشرفته Grep روی کلاس های Character و عبارات Bracket
همچنین دستور grep از الگوریتم Boyer-Moore برای سرچ سریع هر string یا regular expression استفاده میکنند.
زمانیکه دستور بدون صرف نظر از '(' ')' و '|' اجرا میشود و سپس یک string کامل به طور مثال “(f|g)ile” را در فایل جستجو میکند سپس به جای اینکه به عنوان بخشی از استرینگ رفتار کند و در فایل به دنبال کلمه های "file" یا "gile" میگردد.
دستور Egrep
Egrep یا Grep -E ورژن دیگری از grep یا Extended grep میباشد. این ورژن از grep زمانیکه برای سرچ یک پترن Regular Expresion مورد استفاده قرار میگیرد بسیار سریع و موثر است از آنجایی که با متا دیتاها همانطور که هستند رفتار میکند و همانند grep آنها را به عنوان string در نظر نمیگیرد و علاوه بر این شما از بار مسئولیت صرف نظر کردن آنها همانند آنچه در grep رخ میدهد آزاد هستید. این ابزار از ERE یا مجموعه ی Extended Regular Expression استفاده میکند.
در دستور egrep حتی اگر شما از متا کاراکترها صرف نظر نکنید این دستور همانند کاراکترهای خاص با آنها رفتار میکند و معنای خاص آنها را در نظر میگیرد و با آنها به عنوان بخشی از string رفتار نمیکند.
در مثال بالا egrep هنگامی که meta-character ها صرف نظر نشده باشند دنبال رشته "file" میگردد و این به معنای استفاده ی درست از این کاراکتر هاست اما زمانیکه این کاراکتر ها صرف نظر شوند در نتیجه egrep با آنها به عنوان بخشی از string رفتار میکند و به دنبال string کامل “(f|g)ile” در فایل میگردد.
دستور Fgrep
دستور Fgrep یا Fixed Grep یا grep -F ورژن دیگری از دستور grep است که در جستجوی کل یک رشته به جای regular expression سریع تر است زیرا این ابزار نه regular expression ها و نه meta-charachter ها را تشخیص نمیدهد. برای جستجوی هر string مستقیم باید این ورژن از grep انتخاب و مورد استفاده قرار گیرد.
fgrep به دنبال یک string کامل میگردد و حتی کاراکترهای خاص را به عنوان بخشی از regular expression تشخیص نمیدهد، خواه صرف نظر شده باشند یا نشده باشند.
زمانیکه meta-character ها صرف نظر نشده باشند این دستور به جستجوی string کامل “(f|g)ile” در فایل میپردازد و زمانیکه متا کاراکترها صرف نظر شده باشند دستور fgrep برای همه کاراکترهای “\(f\|g\)ile” در فایل را جستجو میکند.
همچنین توصیه میشود مطالعه کنید :
دستور awk در لینوکس برای جستجو و فیلتر کردن عبارات، کلمه و ... (بخش اول)
10 دستور مفید برای Chaining Operators در لینوکس
نتیجه :
در موارد مطرح شده در بالا تفاوت بین grep, egrep و fgrep بیان کردیم. جدای از تفاوت آنها در مجموعه regular expression مورد استفاده و سرعت اجرا بقیه پارامترهای کامند لاینی برای هر سه ورژن مذکور grep, egrep و fgrep یکسان میباشند و حتی توصیه میشود به جای egrep یا fgrep از grep -E یا grep -F استفاده کنید.
اگر شما هر گونه تفاوت دیگری بین این سه ورژن از grep میدانید با ما به اشتراک بگذارید.
به دلیل اینکه این دستور در کاربرد بسیار متغییر عمل میکند دارای انواع بیشماری از جمله grep, egrep (Extended GREP), fgrep (Fixed GREP), pgrep (Process GREP), rgrep (Recursive GREP) و غیره میباشد. اما این دستورات تفاوت های ناچیزی با grep اصلی دارند که آنها را متمایز ساخته و توسط برنامه نویسان متفاوت سیستم های لینوکسی برای تسک های خاص مورد استفاده قرار میگیرند.
نکته اصلی در اینجا تفاوت بین سه نوع اصلی grep, egrep و fgrep میباشد که باعث میشود کاربران لینوکسی یکی از آنها یا ورژن دیگری را با توجه به نیاز خود انتخاب کنند.
Meta-Character های خاص Grep
+ : برابر با یک یا چندین نمونه از کاراکتر قبلی
? : اغلب نمایشگر یک بار تکرار از کاراکتر قبل به طول مثال a? با a یا aa مچ خواهد شد.
) : آغاز عبارت جایگزین
( : پایان عبارت جایگزین
| : مچ شده با یکی از عبارات جدا شده توسط pip به صورت مثال "cde(a|b)" با bcde یا acde مچ خواهد شد.
} : این متا کاراکتر نمایشگر آغاز از یک رنج مشخص شده میباشد. به طول مثال "a{2}" با aa در فایل مچ خواهد شد. (هر جای a دو بار تکرار شده باشد)
{ : این متا کاراکتر نمایشگر پایان یک رنج مشخص شده میباشد.
تفاوت های بین Grep, Egrep و Fgrep
یکسری از تفاوت های بین Grep, Egrep و Fgrep میتواند همانند زیر مشخص شود. برای این مجموعه از مثالها ما فایل زیر (mohammad.txt) را در نظر میگیریم و عملیات را روی آن اجرا میکنیم.
کد:
grep is a command that can be used on unix-like systems. it searches for any string in list of strings or file. It is very fast. (f|g)ile
دستور Grep
grep یا Global Regular Expression Print یک برنامه اصلی برای جستجو روی سیستم های Unix میباشد. که میتوان هر نوع از string را روی فایل یا لیستی از فایل ها یا حتی خروجی هر دستوری جستجو کرد.
همچنین پیشنهاد میشود مقاله زیر را مطالعه کنید.
12 مثال عملی از دستور Grep در Linux
دستور grep همچنین جدای از string های نرمال Regular Expression های ابتدایی را به عنوان پترن جستجو استفاده میکند. در Basic Regular Expression ها (BRE) در حقیت متا کاراکترهایی مانند '{','}','(',')','|','+','?' معنی خودشان را از دست میدهند و با عنوان کاراکترهای نرمال string رفتار میکنند و باید از آنها صرف نظر کرد اگر که بخواهیم به عنوان کاراکترهای خاص رفتار کنند.
همچنین پیشنهاد میشود مطالعه کنید.
11 دستور پیشرفته Grep روی کلاس های Character و عبارات Bracket
همچنین دستور grep از الگوریتم Boyer-Moore برای سرچ سریع هر string یا regular expression استفاده میکنند.
کد PHP:
$ grep -C 0 '(f|g)ile' mohammad.txt
$ grep -C 0 '\(f\|g\)ile' mohammad.txt
زمانیکه دستور بدون صرف نظر از '(' ')' و '|' اجرا میشود و سپس یک string کامل به طور مثال “(f|g)ile” را در فایل جستجو میکند سپس به جای اینکه به عنوان بخشی از استرینگ رفتار کند و در فایل به دنبال کلمه های "file" یا "gile" میگردد.
دستور Egrep
Egrep یا Grep -E ورژن دیگری از grep یا Extended grep میباشد. این ورژن از grep زمانیکه برای سرچ یک پترن Regular Expresion مورد استفاده قرار میگیرد بسیار سریع و موثر است از آنجایی که با متا دیتاها همانطور که هستند رفتار میکند و همانند grep آنها را به عنوان string در نظر نمیگیرد و علاوه بر این شما از بار مسئولیت صرف نظر کردن آنها همانند آنچه در grep رخ میدهد آزاد هستید. این ابزار از ERE یا مجموعه ی Extended Regular Expression استفاده میکند.
در دستور egrep حتی اگر شما از متا کاراکترها صرف نظر نکنید این دستور همانند کاراکترهای خاص با آنها رفتار میکند و معنای خاص آنها را در نظر میگیرد و با آنها به عنوان بخشی از string رفتار نمیکند.
کد PHP:
$ egrep -C 0 '(f|g)ile' mohammad.txt
$ egrep -C 0 '\(f\|g\)ile' mohammad.txt
در مثال بالا egrep هنگامی که meta-character ها صرف نظر نشده باشند دنبال رشته "file" میگردد و این به معنای استفاده ی درست از این کاراکتر هاست اما زمانیکه این کاراکتر ها صرف نظر شوند در نتیجه egrep با آنها به عنوان بخشی از string رفتار میکند و به دنبال string کامل “(f|g)ile” در فایل میگردد.
دستور Fgrep
دستور Fgrep یا Fixed Grep یا grep -F ورژن دیگری از دستور grep است که در جستجوی کل یک رشته به جای regular expression سریع تر است زیرا این ابزار نه regular expression ها و نه meta-charachter ها را تشخیص نمیدهد. برای جستجوی هر string مستقیم باید این ورژن از grep انتخاب و مورد استفاده قرار گیرد.
fgrep به دنبال یک string کامل میگردد و حتی کاراکترهای خاص را به عنوان بخشی از regular expression تشخیص نمیدهد، خواه صرف نظر شده باشند یا نشده باشند.
کد PHP:
$ fgrep -C 0 '(f|g)ile' mohammad.txt
$ fgrep -C 0 '\(f\|g\)ile' mohammad.txt
زمانیکه meta-character ها صرف نظر نشده باشند این دستور به جستجوی string کامل “(f|g)ile” در فایل میپردازد و زمانیکه متا کاراکترها صرف نظر شده باشند دستور fgrep برای همه کاراکترهای “\(f\|g\)ile” در فایل را جستجو میکند.
همچنین توصیه میشود مطالعه کنید :
دستور awk در لینوکس برای جستجو و فیلتر کردن عبارات، کلمه و ... (بخش اول)
10 دستور مفید برای Chaining Operators در لینوکس
نتیجه :
در موارد مطرح شده در بالا تفاوت بین grep, egrep و fgrep بیان کردیم. جدای از تفاوت آنها در مجموعه regular expression مورد استفاده و سرعت اجرا بقیه پارامترهای کامند لاینی برای هر سه ورژن مذکور grep, egrep و fgrep یکسان میباشند و حتی توصیه میشود به جای egrep یا fgrep از grep -E یا grep -F استفاده کنید.
اگر شما هر گونه تفاوت دیگری بین این سه ورژن از grep میدانید با ما به اشتراک بگذارید.