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

پیش از این، در مقاله‌ای با نام «دستور grep در لینوکس» به معرفی اجمالی این دستور پرداختیم؛ حال می‌خواهیم به صورت جزئی‌تری به این دستور بپردازیم.

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

 

 

این مطلب نیز ممکن است برای شما مفید باشد: دریافت basename نام فایل یا نام دایرکتوری در bash

 

جدا کردن کلمات و الگوها در جستجو

برای نمایش تنها خطوطی که با یک الگوی جستجو مطابقت ندارند، از گزینه v- یا invert-match- استفاده نمایید.

به عنوان مثال، برای چاپ خطوطی که حاوی رشته nologin نیستند، باید از دستور زیر استفاده کنید:

grep -wv nologin /etc/passwd
output:
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

گزینه w- به grep می‌گوید که تنها آن سطرهایی را برگرداند که رشته مشخص شده یک کلمه کامل است (توسط کاراکترهای non-word محصور شده است).

به طور پیش فرض، grep به حروف کوچک و بزرگ حساس است. این بدان معناست که کاراکترهای بزرگ و کوچک به صورت مجزا در نظر گرفته می‌شوند. برای نادیده گرفتن این مورد هنگام جستجو، grep را با گزینه i- فراخوانی کنید.

 

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

برای تعیین دو یا چند الگوی جستجو، از گزینه e- استفاده نمایید:

grep -wv -e jeyserver -e bash /etc/passwd

شما می‌توانید هر زمان که نیاز دارید از گزینه e- استفاده کنید.

گزینه‌ای که برای جدا کردن چندین الگوی جستجو تعریف شده است، کنار هم قرار دادن الگوها با استفاده از عملگر OR (یا |) است.

مثال زیر خطوطی را که حاوی رشته‌های nologin یا bash نیستند، چاپ می‌کند:

grep -wv 'nologin\|bash' /etc/passwd

 

grep در لینوکس از سه نوع ساختار regular expression ، شامل Basic ،Extended و Perl-compatible پشتیبانی می‌نماید. به طور پیش فرض، grep الگو را به عنوان یک Basic regular expression درک می‌کند که در آن متا کاراکترهایی مانند | معنای خاص خود را از دست می‌دهند و شما باید آن‌ها را به همراه کارکترهای مخصوص مانند backslash استفاده نمایید.

اگر از گزینه Extended regular expression یعنی E- استفاده می‌کنید، مشابه مثال زیر باید از عملگر | استفاده نمایید:

grep -Ewv 'nologin|bash' /etc/passwd

شما می‌توانید مطابقت‌های ممکن مختلفی را مشخص کنید که می‌توانند رشته‌های literal یا مجموعه‌های expression باشند. در مثال زیر، خطوطی را که در آن رشته games در ابتدای یک خط قرار دارد، جدا می‌کند:

grep -v "^games" file.txt

 

خروجی یک فرمان را می‌توان با grep از طریق کاراکتر | فیلتر کرد تا تنها خطوط منطبق با یک الگوی مشخص روی ترمینال چاپ شود.

به عنوان مثال، برای چاپ تمام فرآیندهای در حال اجرا در سیستم خود به جز مواردی که به عنوان کاربر root اجرا می‌شوند، شما می‌توانید خروجی دستور ps را بصورت زیر فیلتر نمایید:

ps -ef | grep -wv root

 

این مطلب نیز ممکن است برای شما مفید باشد: آشنایی با مجوزهای فایل لینوکس

 

جدا کردن دایرکتوری‌ها و فایل‌ها در جستجو

گاهی اوقات هنگام انجام یک جستجوی بازگشتی با گزینه‌های r- یا R-، ممکن است بخواهید دایرکتوری‌های خاصی را از نتیجه جستجو حذف کنید.

تفاوت اصلی بین گزینه‌های r- یا R- این است که وقتی grep با حروف بزرگ R فراخوانی می‌شود، تمام لینک‌های symbolic را دنبال می‌کند.

برای حذف دایرکتوری از جستجو، از گزینه exclude-dir-- استفاده نمایید. مسیر دایرکتوری حذف شده نسبت به دایرکتوری جستجو است.

مثال زیر نشان می‌دهد که چگونه می‌توان رشته linuxize را در تمام فایل‌های داخل /etc، بدون احتساب دایرکتوری /etc/pki جستجو کرد:

grep -R --exclude-dir=pki linuxize /etc

 

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

به عنوان مثال، برای یافتن فایل‌هایی که حاوی رشته gnu در سیستم لینوکس شما هستند، (جی سرور) به غیر از دایرکتوری‌های proc ،boot و sys، باید دستور زیر را اجرا نمایید:

grep -r --exclude-dir={proc,boot,sys} gnu /

هنگام استفاده از تطبیق wildcard، شما می‌توانید فایل‌هایی را که نام اصلی آن‌ها با GLOB مطابقت دارد، در گزینه --exclude مشخص کنید.

در مثال زیر، ما همه فایل‌های موجود در دایرکتوری کنونی را برای رشته linuxize جستجو می‌کنیم، به استثنای فایل‌هایی که به دایرکتوری png. و jpg. ختم می‌شوند:

grep -rl --exclude=*.{png,jpg} linuxize *

 

 

 

منبع:

linuxize