وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

دستور Grep در لینوکس

0 16
زمان لازم برای مطالعه: 7 دقیقه



Grep مخفف “Global Regular Expression Print” یکی از رایج ترین دستورات مورد استفاده در لینوکس است.

grep هست یک command-line ابزاری که یک رشته متن خاص را در یک یا چند فایل جستجو می کند. در هر خط از فایل به دنبال الگو می گردد و خطوطی را که با آن مطابقت دارند چاپ می کند. این یک ابزار قدرتمند برای جستجو و تجزیه و تحلیل حجم زیادی از داده های متنی به سرعت و کارآمد است. می‌توانید از این دستور برای جستجوی کلمات، عبارات یا عبارات خاص در فایل‌هایی با هر اندازه، از فایل‌های متنی کوچک گرفته تا فایل‌های گزارش بزرگ استفاده کنید. اگر هیچ فایلی مشخص نشده باشد، grep از ورودی استاندارد که معمولاً خروجی دستور دیگری است می خواند.

این مقاله روش استفاده از grep دستور با مثال های کاربردی و توضیحات مفصل از رایج ترین GNU grep گزینه ها.

grep دستور دستور

نحو برای grep دستور به شرح زیر است:

grep [OPTIONS] PATTERN [FILE...]

موارد داخل پرانتز اختیاری هستند.

  • OPTIONS – گزینه های صفر یا بیشتر Grep شامل a تعداد گزینه ها
    که رفتار آن را کنترل می کند.
  • PATTERN – الگوی جستجو
  • FILE – نام فایل ورودی صفر یا بیشتر.

برای اینکه بتوانید فایل را جستجو کنید، کاربری که دستور را اجرا می کند باید دسترسی خواندن به فایل داشته باشد.

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

ابتدایی ترین استفاده از grep دستور جستجو برای یک رشته (متن) در یک فایل است.

به عنوان مثال، برای پیدا کردن تمام خطوط حاوی رشته “bash” در /etc/passwd
فایل، دستور زیر را اجرا کنید:

grep bash /etc/passwd

خروجی چیزی شبیه به این خواهد بود:

root:x:0:0:root:/root:/bin/bash
rasanegar:x:1000:1000:rasanegar:/home/rasanegar:/bin/bash

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

grep "Gnome Display Manager" /etc/passwd

تطابق معکوس (استثنا)

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

به عنوان مثال، به print خطوطی که شامل رشته “nologin” نیستند که باید استفاده کنید:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
rasanegar:x:1000:1000:rasanegar:/home/rasanegar:/bin/bash

استفاده از Grep برای فیلتر کردن خروجی یک فرمان

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

به عنوان مثال، برای اینکه بفهمید کدام فرآیندها در حال اجرا هستند روی سیستم شما به عنوان کاربر www-data می توانید از موارد زیر استفاده کنید ps
دستور:

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

شما همچنین می توانید چندین لوله را به زنجیر بزنید روی فرمان همانطور که در خروجی بالا مشاهده می کنید، یک خط نیز حاوی عبارت است grep process. اگر می خواهید آن خط را از خروجی حذف کنید، می توانید آن را به دیگری منتقل کنید grep به عنوان مثال، همانطور که در زیر نشان داده شده است:

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

برای جستجوی بازگشتی یک الگو، فراخوانی کنید grep با -r گزینه (یا --recursive). وقتی از این گزینه استفاده می شود، grep تمام فایل‌های موجود در دایرکتوری مشخص شده، از جمله زیرشاخه‌های آن را جستجو می‌کند، و از سیم‌پیوندهایی که به صورت بازگشتی با آن‌ها مواجه می‌شوند، صرفنظر می‌کند. این به شما اجازه می دهد تا به راحتی در کل ساختار دایرکتوری خود جستجو کنید تا دقیقاً آنچه را که به دنبال آن هستید بیابید.

پیشنهاد می‌کنیم بخوانید:  روش نصب و استفاده از PHP Composer در CentOS 8

برای دنبال کردن همه پیوندهای نمادین به جای -r، استفاده کنید -R گزینه (یا --dereference-recursive).

در اینجا مثالی وجود دارد که روش جستجوی رشته را نشان می دهد rasanegar.com در تمام فایل های داخل /etc فهرست راهنما:

grep -r rasanegar.com /etc

خروجی شامل خطوط منطبق با پیشوند مسیر کامل فایل خواهد بود:

/etc/hosts:127.0.0.1 node2.rasanegar.com
/etc/nginx/sites-available/rasanegar.com:    server_name rasanegar.com   www.rasanegar.com;

اگر از -R گزینه، grep تمام پیوندهای نمادین را دنبال می کند:

grep -R rasanegar.com /etc

به خط آخر خروجی زیر توجه کنید. آن خط زمانی که چاپ نمی شود grep با احضار شده است -r زیرا فایل های داخل Nginx هستند sites-enabled دایرکتوری پیوندهای نمادین به فایل های پیکربندی در داخل هستند sites-available فهرست راهنما.

/etc/hosts:127.0.0.1 node2.rasanegar.com
/etc/nginx/sites-available/rasanegar.com:    server_name rasanegar.com   www.rasanegar.com;
/etc/nginx/sites-enabled/rasanegar.com:    server_name rasanegar.com   www.rasanegar.com;

نمایش فقط نام فایل

برای سرکوب پیش فرض grep خروجی و print فقط از نام فایل های حاوی الگوی همسان استفاده کنید -l ( یا --files-with-matches) گزینه.

دستور زیر تمام فایل هایی که به آن ختم می شوند را جستجو می کند .conf در دایرکتوری کاری فعلی و فقط نام فایل های حاوی رشته را نمایش دهید rasanegar.com:

grep -l rasanegar.com *.conf

خروجی چیزی شبیه به این خواهد بود:

tmux.conf
haproxy.conf

را -l پرچم معمولاً همراه با گزینه بازگشتی استفاده می شود -R:

grep -Rl rasanegar.com /tmp

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

برای نادیده گرفتن مورد هنگام جستجو، فراخوانی کنید grep با -i گزینه (یا --ignore-case).

به عنوان مثال، هنگام جستجو برای Zebra بدون هیچ گزینه ای، دستور زیر هیچ خروجی را نشان نمی دهد، یعنی خطوط منطبق وجود دارد:

grep Zebra /usr/share/words

اما اگر جستجوی بدون حساس به حروف بزرگ را با استفاده از -i گزینه، هر دو حروف بزرگ و کوچک مطابقت دارد:

grep -i Zebra /usr/share/words

در دستور بالا، “Zebra” با “zebra”، “ZEbrA” یا هر ترکیب دیگری از حروف بزرگ و کوچک برای آن رشته مطابقت دارد.

zebra
zebra's
zebras

کلمات کامل را جستجو کنید

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

به عنوان مثال، اگر رشته ” را جستجو کنیدgnu” grep با تمام خطوطی که حاوی “gnu” به عنوان یک رشته مستقل یا به عنوان بخشی از یک کلمه بزرگتر مانند “cygnus” یا “magnum”.

grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

برای برگرداندن تنها خطوطی که رشته مشخص شده یک کلمه کامل است (محصور شده توسط کاراکترهای غیر کلمه)، از -w ( یا --word-regexp) گزینه.

کاراکترهای کلمه شامل کاراکترهای الفبایی عددی (a-z، A-Z، و 0-9) و زیرخط (_). همه کاراکترهای دیگر به عنوان کاراکترهای غیر کلمه در نظر گرفته می شوند.

اگر دستور را با -w گزینه، grep فرمان فقط آن خطوطی را که در آن قرار دارند برمی گرداند gnu به عنوان یک کلمه جداگانه گنجانده شده است.

grep -w gnu /usr/share/words
gnu

نمایش اعداد خط

را -n ( یا --line-number) گزینه می گوید grep برای نمایش شماره خط تمام خطوطی که با یک الگوی داده شده مطابقت دارند. وقتی از این گزینه استفاده می شود، grep خطوط منطبق را با شماره خطوط متناظر آنها به عنوان پیشوند به خروجی استاندارد خروجی می دهد.

به عنوان مثال، برای نمایش خطوط از /etc/services فایل حاوی رشته bash با پیشوند شماره خط منطبق، می توانید از دستور زیر استفاده کنید:

grep -n 10000 /etc/services

خروجی زیر به ما نشان می دهد که مطابقت ها پیدا شده اند روی خطوط 10423 و 10424.

10423:ndmp            10000/tcp
10424:ndmp            10000/udp

تعداد مسابقات

به print تعداد خطوط مطابق با خروجی استاندارد، از -c ( یا --count) گزینه.

در مثال زیر، تعداد اکانت هایی که دارند را می شماریم /usr/bin/zsh به عنوان یک پوسته

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

حالت بی صدا

را -q (یا --quiet) می گوید grep در حالت ساکت اجرا شود و چیزی نمایش داده نشود روی خروجی استاندارد اگر مطابقت پیدا شود، فرمان با وضعیت خارج می شود 0. این در هنگام استفاده مفید است grep در اسکریپت‌های پوسته که می‌خواهید بررسی کنید که آیا یک فایل دارای رشته است یا خیر و بسته به آن عمل خاصی را انجام دهید روی نتیجه.

پیشنهاد می‌کنیم بخوانید:  Kerio Control 9.3.0 Build 3273

در اینجا یک مثال از استفاده است grep در حالت آرام به عنوان یک فرمان آزمایشی در if بیانیه :

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

بیان منظم پایه

GNU Grep دارای سه مجموعه ویژگی عبارت منظم است: Basic، Extended و Perl-compatible.

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

در زیر لیستی از متا کاراکترهای پرکاربرد آمده است:

  • استفاده کنید ^ نماد (caret) برای مطابقت با عبارت ابتدای یک خط. در مثال زیر رشته kangaroo فقط در صورتی مطابقت دارد که در ابتدای یک خط رخ دهد.

    grep "^kangaroo" file.txt
  • استفاده کنید $ نماد (دلار) برای مطابقت با عبارت انتهای یک خط. در مثال زیر رشته kangaroo فقط در صورتی مطابقت دارد که در انتهای یک خط رخ دهد.

    grep "kangaroo$" file.txt
  • استفاده کنید . نماد (دوره) برای مطابقت با هر کاراکتر. به عنوان مثال، برای مطابقت با هر چیزی که با آن شروع می شود kan، سپس دارای دو کاراکتر است و با رشته پایان می یابد roo، می توانید از الگوی زیر استفاده کنید:

    grep "kan..roo" file.txt
  • استفاده کنید [ ] (پرانتز) برای مطابقت با هر نویسه محصور در پرانتز. به عنوان مثال، برای پیدا کردن خطوطی که حاوی accept یا “accent، می توانید از الگوی زیر استفاده کنید:

    grep "acce[np]t" file.txt
  • استفاده کنید [^ ] برای مطابقت با هر کاراکتری که در داخل پرانتز قرار ندارد. الگوی زیر با هر ترکیبی از رشته های حاوی مطابقت دارد co(any_letter_except_l)a، مانند coca، cobalt، و غیره روی، اما با خطوط حاوی مطابقت نخواهد داشت cola،

    grep "co[^l]a" file.txt

برای فرار از معنای خاص کاراکتر بعدی، از عبارت استفاده کنید \ علامت (خلاصه)

عبارات منظم توسعه یافته

برای تفسیر الگو به عنوان یک عبارت منظم توسعه یافته، از عبارت استفاده کنید -E ( یا --extended-regexp) گزینه. عبارات منظم توسعه یافته شامل تمام متا کاراکترهای اصلی، همراه با متا کاراکترهای اضافی برای ایجاد الگوهای جستجوی پیچیده تر و قدرتمندتر می شود. در زیر چند نمونه آورده شده است:

  • همه آدرس‌های ایمیل را از یک فایل معین مطابقت داده و استخراج کنید:

    grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
  • همه آدرس های IP معتبر را از یک فایل مشخص مطابقت داده و استخراج کنید:

    grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

را -o گزینه استفاده می شود print فقط رشته منطبق

جستجوی رشته های متعدد (الگوها)

دو یا چند الگوی جستجو را می توان با استفاده از عملگر OR به هم متصل کرد |.

به صورت پیش فرض، grep الگو را به عنوان یک عبارت منظم اساسی که در آن متا کاراکترها مانند | معنای خاص خود را از دست می دهند و باید از نسخه های بک اسلش آنها استفاده شود.

در مثال زیر، ما در حال جستجوی همه موارد وقوع کلمات هستیم fatal، error، و critical در فایل خطای Log Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

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

grep -E 'fatal|error|critical' /var/log/nginx/error.log

به print تعداد مشخصی از خطوط قبل از تطبیق خطوط، استفاده از -B ( یا --before-context) گزینه.

به عنوان مثال، برای نمایش پنج خط زمینه اصلی قبل از تطبیق خطوط، باید از دستور زیر استفاده کنید:

grep -B 5 root /etc/passwd

به print تعداد مشخصی از خطوط پس از تطبیق خطوط، استفاده از -A ( یا --after-context) گزینه.

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

grep -A 5 root /etc/passwd

نتیجه

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

چیزهای بیشتری برای یادگیری در مورد Grep وجود دارد روی راهنمای کاربر Grep
page.

اگر سوال یا بازخوردی دارید، در کامنت بگذارید.

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

زمان انتشار: 1403-01-24 00:29:01

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید