از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
دستور Grep در لینوکس
سرفصلهای مطلب
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
تمام فایلهای موجود در دایرکتوری مشخص شده، از جمله زیرشاخههای آن را جستجو میکند، و از سیمپیوندهایی که به صورت بازگشتی با آنها مواجه میشوند، صرفنظر میکند. این به شما اجازه می دهد تا به راحتی در کل ساختار دایرکتوری خود جستجو کنید تا دقیقاً آنچه را که به دنبال آن هستید بیابید.
برای دنبال کردن همه پیوندهای نمادین به جای -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 expression
grep -c '/usr/bin/zsh' /etc/passwd
4
حالت بی صدا
را -q
(یا --quiet
) می گوید grep
در حالت ساکت اجرا شود و چیزی نمایش داده نشود روی خروجی استاندارد اگر مطابقت پیدا شود، فرمان با وضعیت خارج می شود 0
. این در هنگام استفاده مفید است grep
در اسکریپتهای پوسته که میخواهید بررسی کنید که آیا یک فایل دارای رشته است یا خیر و بسته به آن عمل خاصی را انجام دهید روی نتیجه.
در اینجا یک مثال از استفاده است 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.
اگر سوال یا بازخوردی دارید، در کامنت بگذارید.
terminal
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1403-01-24 00:29:01