دستور grep مخفف Global Regular Expression Print میباشد که یکی از دستورات پرکاربرد در سیستم های لینوکس / یونیکس میباشد. پس از مرور همه دستورات و مثالها، شما یاد خواهید گرفت که چگونه از grep برای جستجوی فایلها، پیدا کردن متن، الگو یا string خاص درون یک فایل در ترمینال لینوکس استفاده کنید.
همچنین توصیه میشود مطالعه کنید :
11 دستور پیشرفته grep در Linux
دستور grep در لینوکس برای جستجوی چندین پترن، کلمه، عبارت
تفاوت بین Egrep - Grep و Fgrep در لینوکس چیست؟
grep یک جستجو گر قدرتمند فایل میباشد که روی هر توزیع از لینوکس موجود است. اگر به هر دلیلی روی سیستم تان نصب نبود شما میتوانید آن را به آسانی و از طریق ابزار مدیریت پکیج yum روی RHEL/Centos/Fedora/Alma/Rocky و apt-get روی سیستم های Debian/Ubuntu/Mint نصب کنید :
در اینجا من نمونه های کاربردی و مفید از دستور grep برای شما توضیح میدهم :
1 - جستجو و پیدا کردن فایل ها
مثلا فرض کنید که روی سیستم خود ubuntu دارید و قصد دارید اسکریپت پایتون خود را تست کنید در اینترنت به دنبال منابع میگردید که متوجه میشوید دو ورژن متفاوت از پایتون موجود هستند و نمیدانید که پایتون موجود روی سیستم عامل شما که توسط اوبونتو نصب شده چه ورژنی است. به سادگی با اجرای دستور زیر میتوانید ورژن پایتون نصب شده روی سیستم تان رو متوجه شوید :
ابتدا دستور dpkg -l را اجرا میکنید که پکیج های deb.* موجود روی سیستم تان را لیست میکند سپس خروجی آن را به دستور grep -i python پایپ '|' مکنید که با این دستور در خروجی قبلی هر چیزی که در آن python دارد را فیلتر کرده و برای شما نمایش میدهد. آپشن i- به معنای این است که در جستجو حروف بزرگ و کوچک لحاظ نشود از آنجایی که دستور grep به حروف بزرگ و کوچک حساس (case-sensitive) میباشد. استفاده از آپشن i- یک عادت خوب است مگر اینکه شما دقیقا بخواهید به حروف کوچک یا بزرگ دقت شود.
2 - جستجو و فیلتر فایل ها
شما همچنین برای جستجو و فیلتر درون فایل های مجزا یا چندین فایل میتوانید از دستور grep استفاده کنید. بیایید سناریو زیر را در نظر بگیرید :
شما با سرور ویپ تان مشکلاتی دارید و با توجه به اینکه سوال خود را در انجمن های زیادی روی اینترنت قرار دادید فرد مهربانی به شما جواب میدهد و از شما میخواهد که محتوای فایل /etc/rtpengine/rtpengine.sample.conf را در پست قرار دهید. آیا به نظرتان راحتر نیست تا خط های کامند شده در فایل را حذف کنید تا برای فردی که میخواهد کمک کند و همچنین هر کس دیگری که بعدا پست شما را میخواند راحتر باشد شما میتوانید با اجرای دستور زیر خط های comment شده را در خروجی حذف کنید :
آپشن v- به grep میگوید که خروجی را برعکس کند یعنی به جای نمایش لاین های match با دستور مخالف آن عمل کنند و خطایی که با عبارت match نیستند را نمایش دهد که در دستور بالا در حقیقت خط های که "#" ندارند را نمایش میدهد.
3 - پیدا کردن تمام فایل های فقط mp3
دستور grep برای فیلتر کردن از stdout بسیار مفید است. مثلا در نظر بگیرید که یک پوشه کامل از فایل های موزیک و به فرمت های متفاوتی دارید شما میخواهید تمامی فایل های mp3.* از هنرمندی به نام moein پیدا کنید اما شما هیچ کدام از ترک های remixed را نمیخواهید با استفاده از دستور find و 2 بار پایپ '|' به دستور grep میتوانید به هدف خود برسید :
در این مثال با استفاده از دستور find تمامی فایل های با فرمت mp3 پیدا میشوند سپس با پایپ کردن به دستور grep -i تمامی فایل هایی که نام moein در آنها است فیلتر میشوند و با کمک پایپ دوم به دستور grep -vi تمامی فایل هایی که در ان عبارت remix نباشد برگردانده میشود.
4 - نمایش تعدادی از خط ها قبل و بعد از یک عبارت سرچ شده
آپشن های دیگری مانند A- و B- وجود دارند (آپشن A به معنی After و آپشن B به معنی Before میباشد) که به تعداد مشخص شده، خطهای قبل و بعد از عبارت جستجو شده را نمایش میدهد. در مثال زیر ما با استفاده از دستور ip addr show اینترفیس های شبکه مان را لیست کردیم. سپس با استفاده از دستور grep اینترفیس ens192 را در خروجی فیلتر کردیم و توسط آپشن A- و عدد 4 گفتم که تعداد 4 خط بعد از اینترفیس ens192 را در خروجی نمایش بده و در دستور دوم هم با استفاده از آپشن B- گفتیم که تعداد 4 خط قبل از اینترفیس ens192 را در خروجی فیلتر کند :
5 - نمایش تعدادی از خط ها در محدوده عبارت سرچ شده
آپشن C- شبیه به آپشن بالا میباشد با این تفاوت که به جای نمایش خط های قبل و یا خط های بعد از عبارت جستجو شده ما، خطوط را در 2 جهت را نمایش میدهد. مثلا دستور زیر 2 خط قبل و 2 خط بعد از عبارت جستجو شده ens192 را نمایش میدهد :
6 - شمارش تعداد match ها
مشابه به اینکه شما دستور grep را به دستوری مانند wc (شمارنده کلمه word count) پایپ '|' کنید. آپشنی در خود grep موجود است که میتواند همان عمل را برای شما انجام دهد :
7 - جستجوی فایل ها از طریق عبارت داده شده
آپشن n- یکی از مفید ترین گزینه ها برای فایل های debug مربوط به error های در حین compile میباشد. این گزینه شماره line مربوط به عبارت داده شده در فایل را نمایش میدهد :
8 - جستجوی یک عبارت در تمامی پوشه ها
اگر بخواهید عبارتی را در دایرکتوری جاری و همچنین تمامی subdirectories جستجو کنیم باید از آپشن r- برای جستجو به صورت recursively استفاده کنیم. با استفاده از این دستور عبارت ما در تمام دایرکتوری ها و دایرکتوری های زیر مجموعه آن جستجو خواهد شد :
9 - جستجو برای کل یک pattern (به صورت کامل)
با استفاده از آپشن w- در کامند grep میتوانیم برای کل یک pattern یا عبارت جستجو کنیم. به طور مثال استفاده از دستور زیر خطی که شامل pattern موجود در کوتیشن (") میباش را نمایش خواهد داد :
از طرف دیگر اگر کامند زیر را اجرا کنید هیچ جوابی به شما برنمیگرداند. چون دقیقا pattern با عبارت موجود در کوتیشن (") وجود ندارد :
10 - جستجوی یک عبارت در فایلی Gzipped شده
حالا بعضی از مشتقات grep را بررسی میکنیم. اول از zgrep شروع میکنیم که دستور شبیه به zcat میباشد و برای فایل های gzipped مورد استفاده قرار میگیرد. همانند grep آپشن های یکسانی دارد و به شیوه یکسان مورد استفاده قرار میگیرد :
11 - مطابقت عبارات منظم در فایل ها
egrep یکی از مشتقات دستور grep میباشد که در حقیقت اختصاری از Extended Global Regular میباشد. این دستور عبارت اضافه (meta-characters) همانند + ? | و () را تشخیص میدهد. egrep دستوری بسیار مفید برای جستجوی فایل های سورس و دیگر بخش های code میباشد. همچنین به جای آن میتوان از دستور grep -E استفاده نمود :
12 - جستجو برای یک عبارت ثابت (Fixed)
fgrep یک فایل یا لیستی از فایل ها را برای یک عبارت ثابت جستجو میکند که مشابه grep -F میباشد. یکی از رایج ترین شیوه های استفاده از دستور fgrep پاس دادن یک فایل از الگوها (pattern) به آن میباشد :
این مطلب نقطه شروعی بر دستور grep میباشد. اما همانطور که میدانید دستور grep قابلیت های بیشمار دیگری به منظور اهداف گوناگون را داراست. از grep میتوان در نوشتن cron job های قدرتمند همچنین shell script های بزرگ استفاده کرد. خلاق باشید و با مثال های دیگر این دستور در صفحه man آن کار کنید تا در مواقع ضرورت برای اهداف تان بتوانید به نحو احسنت از این دستور بتوانید استفاده کنید.
همچنین توصیه میشود مطالعه کنید :
دستور awk در لینوکس برای جستجو و فیلتر کردن عبارات، کلمه و ... (بخش اول)
10 دستور مفید برای Chaining Operators در لینوکس
موفق باشید
محمد هابیلی
همچنین توصیه میشود مطالعه کنید :
11 دستور پیشرفته grep در Linux
دستور grep در لینوکس برای جستجوی چندین پترن، کلمه، عبارت
تفاوت بین Egrep - Grep و Fgrep در لینوکس چیست؟
grep یک جستجو گر قدرتمند فایل میباشد که روی هر توزیع از لینوکس موجود است. اگر به هر دلیلی روی سیستم تان نصب نبود شما میتوانید آن را به آسانی و از طریق ابزار مدیریت پکیج yum روی RHEL/Centos/Fedora/Alma/Rocky و apt-get روی سیستم های Debian/Ubuntu/Mint نصب کنید :
کد PHP:
$ sudo apt-get install grep #Debian/Ubuntu
$ sudo yum install grep #RHEL/CentOS/Fedora
در اینجا من نمونه های کاربردی و مفید از دستور grep برای شما توضیح میدهم :
1 - جستجو و پیدا کردن فایل ها
مثلا فرض کنید که روی سیستم خود ubuntu دارید و قصد دارید اسکریپت پایتون خود را تست کنید در اینترنت به دنبال منابع میگردید که متوجه میشوید دو ورژن متفاوت از پایتون موجود هستند و نمیدانید که پایتون موجود روی سیستم عامل شما که توسط اوبونتو نصب شده چه ورژنی است. به سادگی با اجرای دستور زیر میتوانید ورژن پایتون نصب شده روی سیستم تان رو متوجه شوید :
کد PHP:
# dpkg -l | grep -i python
ابتدا دستور dpkg -l را اجرا میکنید که پکیج های deb.* موجود روی سیستم تان را لیست میکند سپس خروجی آن را به دستور grep -i python پایپ '|' مکنید که با این دستور در خروجی قبلی هر چیزی که در آن python دارد را فیلتر کرده و برای شما نمایش میدهد. آپشن i- به معنای این است که در جستجو حروف بزرگ و کوچک لحاظ نشود از آنجایی که دستور grep به حروف بزرگ و کوچک حساس (case-sensitive) میباشد. استفاده از آپشن i- یک عادت خوب است مگر اینکه شما دقیقا بخواهید به حروف کوچک یا بزرگ دقت شود.
2 - جستجو و فیلتر فایل ها
شما همچنین برای جستجو و فیلتر درون فایل های مجزا یا چندین فایل میتوانید از دستور grep استفاده کنید. بیایید سناریو زیر را در نظر بگیرید :
شما با سرور ویپ تان مشکلاتی دارید و با توجه به اینکه سوال خود را در انجمن های زیادی روی اینترنت قرار دادید فرد مهربانی به شما جواب میدهد و از شما میخواهد که محتوای فایل /etc/rtpengine/rtpengine.sample.conf را در پست قرار دهید. آیا به نظرتان راحتر نیست تا خط های کامند شده در فایل را حذف کنید تا برای فردی که میخواهد کمک کند و همچنین هر کس دیگری که بعدا پست شما را میخواند راحتر باشد شما میتوانید با اجرای دستور زیر خط های comment شده را در خروجی حذف کنید :
کد PHP:
# grep -v "#" /etc/rtpengine/rtpengine.sample.conf
آپشن v- به grep میگوید که خروجی را برعکس کند یعنی به جای نمایش لاین های match با دستور مخالف آن عمل کنند و خطایی که با عبارت match نیستند را نمایش دهد که در دستور بالا در حقیقت خط های که "#" ندارند را نمایش میدهد.
3 - پیدا کردن تمام فایل های فقط mp3
دستور grep برای فیلتر کردن از stdout بسیار مفید است. مثلا در نظر بگیرید که یک پوشه کامل از فایل های موزیک و به فرمت های متفاوتی دارید شما میخواهید تمامی فایل های mp3.* از هنرمندی به نام moein پیدا کنید اما شما هیچ کدام از ترک های remixed را نمیخواهید با استفاده از دستور find و 2 بار پایپ '|' به دستور grep میتوانید به هدف خود برسید :
کد PHP:
$ find . -name "*.mp3" | grep -i moein | grep -vi "remix"
در این مثال با استفاده از دستور find تمامی فایل های با فرمت mp3 پیدا میشوند سپس با پایپ کردن به دستور grep -i تمامی فایل هایی که نام moein در آنها است فیلتر میشوند و با کمک پایپ دوم به دستور grep -vi تمامی فایل هایی که در ان عبارت remix نباشد برگردانده میشود.
4 - نمایش تعدادی از خط ها قبل و بعد از یک عبارت سرچ شده
آپشن های دیگری مانند A- و B- وجود دارند (آپشن A به معنی After و آپشن B به معنی Before میباشد) که به تعداد مشخص شده، خطهای قبل و بعد از عبارت جستجو شده را نمایش میدهد. در مثال زیر ما با استفاده از دستور ip addr show اینترفیس های شبکه مان را لیست کردیم. سپس با استفاده از دستور grep اینترفیس ens192 را در خروجی فیلتر کردیم و توسط آپشن A- و عدد 4 گفتم که تعداد 4 خط بعد از اینترفیس ens192 را در خروجی نمایش بده و در دستور دوم هم با استفاده از آپشن B- گفتیم که تعداد 4 خط قبل از اینترفیس ens192 را در خروجی فیلتر کند :
کد PHP:
# ip addr show | grep -A 4 "ens192:"
# ip addr show | grep -B 4 "ens192:"
5 - نمایش تعدادی از خط ها در محدوده عبارت سرچ شده
آپشن C- شبیه به آپشن بالا میباشد با این تفاوت که به جای نمایش خط های قبل و یا خط های بعد از عبارت جستجو شده ما، خطوط را در 2 جهت را نمایش میدهد. مثلا دستور زیر 2 خط قبل و 2 خط بعد از عبارت جستجو شده ens192 را نمایش میدهد :
کد PHP:
# ip addr show | grep -C 2 "ens192:"
6 - شمارش تعداد match ها
مشابه به اینکه شما دستور grep را به دستوری مانند wc (شمارنده کلمه word count) پایپ '|' کنید. آپشنی در خود grep موجود است که میتواند همان عمل را برای شما انجام دهد :
کد PHP:
# cat /etc/rtpengine/rtpengine.sample.conf | grep -c interface
7
7 - جستجوی فایل ها از طریق عبارت داده شده
آپشن n- یکی از مفید ترین گزینه ها برای فایل های debug مربوط به error های در حین compile میباشد. این گزینه شماره line مربوط به عبارت داده شده در فایل را نمایش میدهد :
کد PHP:
# grep -n "interface" /etc/rtpengine/rtpengine.sample.conf
8 - جستجوی یک عبارت در تمامی پوشه ها
اگر بخواهید عبارتی را در دایرکتوری جاری و همچنین تمامی subdirectories جستجو کنیم باید از آپشن r- برای جستجو به صورت recursively استفاده کنیم. با استفاده از این دستور عبارت ما در تمام دایرکتوری ها و دایرکتوری های زیر مجموعه آن جستجو خواهد شد :
کد PHP:
# grep -r "listen-ng" *
9 - جستجو برای کل یک pattern (به صورت کامل)
با استفاده از آپشن w- در کامند grep میتوانیم برای کل یک pattern یا عبارت جستجو کنیم. به طور مثال استفاده از دستور زیر خطی که شامل pattern موجود در کوتیشن (") میباش را نمایش خواهد داد :
کد PHP:
# systemctl status rtpengine | grep -w "running"
Active: active (running) since Sun 2021-06-20 02:55:03 EDT; 1 weeks 1 days ago
از طرف دیگر اگر کامند زیر را اجرا کنید هیچ جوابی به شما برنمیگرداند. چون دقیقا pattern با عبارت موجود در کوتیشن (") وجود ندارد :
کد PHP:
# systemctl status rtpengine | grep -w "runn"
10 - جستجوی یک عبارت در فایلی Gzipped شده
حالا بعضی از مشتقات grep را بررسی میکنیم. اول از zgrep شروع میکنیم که دستور شبیه به zcat میباشد و برای فایل های gzipped مورد استفاده قرار میگیرد. همانند grep آپشن های یکسانی دارد و به شیوه یکسان مورد استفاده قرار میگیرد :
کد PHP:
# zgrep -i error /var/log/syslog.2.gz
11 - مطابقت عبارات منظم در فایل ها
egrep یکی از مشتقات دستور grep میباشد که در حقیقت اختصاری از Extended Global Regular میباشد. این دستور عبارت اضافه (meta-characters) همانند + ? | و () را تشخیص میدهد. egrep دستوری بسیار مفید برای جستجوی فایل های سورس و دیگر بخش های code میباشد. همچنین به جای آن میتوان از دستور grep -E استفاده نمود :
کد PHP:
# grep –E
12 - جستجو برای یک عبارت ثابت (Fixed)
fgrep یک فایل یا لیستی از فایل ها را برای یک عبارت ثابت جستجو میکند که مشابه grep -F میباشد. یکی از رایج ترین شیوه های استفاده از دستور fgrep پاس دادن یک فایل از الگوها (pattern) به آن میباشد :
کد PHP:
fgrep –f file_full_of_patterns.txt file_to_search.txt
این مطلب نقطه شروعی بر دستور grep میباشد. اما همانطور که میدانید دستور grep قابلیت های بیشمار دیگری به منظور اهداف گوناگون را داراست. از grep میتوان در نوشتن cron job های قدرتمند همچنین shell script های بزرگ استفاده کرد. خلاق باشید و با مثال های دیگر این دستور در صفحه man آن کار کنید تا در مواقع ضرورت برای اهداف تان بتوانید به نحو احسنت از این دستور بتوانید استفاده کنید.
همچنین توصیه میشود مطالعه کنید :
دستور awk در لینوکس برای جستجو و فیلتر کردن عبارات، کلمه و ... (بخش اول)
10 دستور مفید برای Chaining Operators در لینوکس
موفق باشید
محمد هابیلی