مباحث پایه ای در grep


برنامه grep:

در بسیاری از موارد مدیران سیستم در سیستم عامل های کد باز مثل Unix و Linux با فایل های به اصطلاح log مواجه می شوند که برنامه های مورد نیاز شما ایجاد کرده اند و شامل اطلاعات خوب و مفیدی است ولی در این میان مشکلی وجود دارد که همه این فایل ها متنی بوده و شامل اطلاعاتی هم هست که شما به آنها نیازی ندارید و خواندن همه خطوط آن کار عقلانی نیست در این میان برنامه هایی وجود دارند که شما را در خواندن این مدل از فایل ها کمک می کند مثل برنامه grep که در این مقاله قصد داریم که با قابلیت های این برنامه بیشتر آشنا شوید.

دو حالت استفاده از فرمان grep:

دو راه برای جستجوی بخش مورد نظر شما با استفاده از grep وجود دارد در بخش اول از خود فرمان Grep به صورت مستقیم استفاده کنید و بعد از فرمان مورد نظر کلمه کلیدی جستجو را ذکرکنید و در مرحله بعد نام فایل را به آن اضافه کنید به صورت زیر:

#grep “BAD US” /var/log/messeges

Jun  ۸ ۱۸:۳۴:۳۰ localhost su: BAD SU d.mohammad to root on /dev/pts/0

Jun  ۸ ۱۸:۳۴:۳۶ localhost su: BAD SU d.mohammad to root on /dev/pts/0

Jun 11 08:35:05 localhost su: BAD SU admin to root on /dev/pts/0

Jun 17 14:26:10 localhost su: BAD SU admin to root on /dev/pts/1

Aug 10 03:55:49 localhost su: BAD SU admin to root on /dev/pts/0

فرمان بالا یک مثال عملی است از جستسجوی کاربرانی که قصد داشتن با استفاده از فرمان su به سطخ دسترسی کاربر root برسند و رمزعبور را اشتباه وارد کرده اند. به این نکته توجه کنید که باید حالت جستجو را در بین دو علامت “” قرار دهید.

اگر خروجی از فرمان اجرایی شما ایجاد نشد به این معناست که کلمه مورد نظر شما وجود دارند.

در حالت دوم شما می توانید به صورت غیر مستقیم از این برنامه استفاده کنید و از قابلیت پایپ یا همان | برای جستجو استفاده کنید معادل فرمان بالا در این روش به صورت زیر است:

# cat /var/log/messages | grep "BAD SU"

Jun  ۸ ۱۸:۳۴:۳۰ localhost su: BAD SU d.mohammad to root on /dev/pts/0

Jun  ۸ ۱۸:۳۴:۳۶ localhost su: BAD SU d.mohammad to root on /dev/pts/0

Jun 11 08:35:05 localhost su: BAD SU admin to root on /dev/pts/0

Jun 17 14:26:10 localhost su: BAD SU admin to root on /dev/pts/1

Aug 10 03:55:49 localhost su: BAD SU admin to root on /dev/pts/0

خروجی این دو فرمان شبیه به هم بود و فرق عمده ان در اجرا این است که از برنامه cat برای مشاهده محتوای فایل استفاده شده و خورجی آن با استفاده از قابلیت پایپ به عنوان ورودی به فرمان grep منتقل شده است.

نمایش خروجی بیش از یک صفحه:

 در بعضی از موارد  خروجی جستجوی شما شاید از اندازه صفحه نمایش شما بزرگتر باشد این مشکل با استفاده از فرمان های موجود در سیستم حل می شود برای این منظور شما می توانید از دو فرمان less و more با استفاده از پایپ استفاده کنید. البته این عمل در همه جا و برای همه فرمان هایی که خروجی آنها بزرگ است قابل اجراست به صورت زیر:

#grep “BAD US” /var/log/messeges | less

در برخی از موارد شما نیاز دارید که خروجی برنامه grep را به فایلی خاص منتقل کنید و بعد با استفاده از یک ویرایشگر متنی آن را باز کنید و با در یک فرمان اسکریپ نیاز دارید که فرمان های شما خروجی فایلی داشته باشند، این قاعده در shell نیز وجود دارد و شما می توانید با استفاده از علامت < این عمل را به صورت اجرا فرمان زیر انجام دهید:

#grep “BAD US” /var/log/messeges > BADSU

بعد از اجرای این فرمان خروجی برای شما نمایش داده نمی شود و مقادیر آن در فایل BADSU قرار می گیرد. اگر دوست دارید که گزارشات دیگری را هم به این فایل اضافه کنید از علامت << استفاده کنید که به اصطلاح append می شود به فایل مورد نظر.

جستجوی بیشتر با دو یا چند فرمان grep:

 شاید شما نیاز داشته باشید که هم زمان دو حالت را در یک فرمان مورد جستجو قرار دهید در این بخش شما قصد دارید که حلقه جستجو را تنگ تر کرده تا به نتیجه خاصی برسید برای مثال شما می خواهید در مثال قبلی فقط BAD SU کاربر admin برای شما نمایش داده شود برای این کار شما از دو فرمان grep پشت سر هم و قابلیت پایپ به صورت زیر استفاده کنید:

# cat /var/log/messages | grep "BAD SU" | grep “admin”

Jun 11 08:35:05 localhost su: BAD SU admin to root on /dev/pts/0

Jun 17 14:26:10 localhost su: BAD SU admin to root on /dev/pts/1

Aug 10 03:55:49 localhost su: BAD SU admin to root on /dev/pts/0

همان طور که مشاهده کردید با استفاده از دو grep جستجوی شما دقیق تر شده.

حالت بجز:

در یک سری از موارد نیاز بر این می شود که یک کلید جستجو را در خروجی خود حذف کنید برای مثال شما قصد دارید همه ورود به سیستم یک کاربر را مشاهده کنید بجز در مواردی که از ssh استفاده کرده اید، در فرمان اول شما همه روش های ورودی کاربر admin را مشاهده می کنید:

#cat /var/log/messages | grep admin

Jun  ۲ ۰۶:۴۷:۱۲ localhost su: admin to root on /dev/pts/0

Jun  ۳ ۱۳:۰۳:۳۱ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۱۱:۲۴:۵۷ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۱۱:۳۵:۰۵ localhost su: admin to root on /dev/pts/1

Jun  ۸ ۱۸:۳۱:۱۲ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۱۸:۳۳:۵۲ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۱۸:۴۷:۳۴ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۱۹:۰۵:۵۳ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۲۱:۱۹:۱۵ localhost su: admin to root on /dev/pts/0

Jun  ۸ ۲۱:۲۴:۱۷ localhost su: admin to root on /dev/pts/0

Jun  ۹ ۰۶:۵۲:۲۴ localhost su: admin to root on /dev/pts/0

Jun 10 06:18:34 localhost su: admin to root on /dev/pts/0

Jun 11 08:35:05 localhost su: BAD SU admin to root on /dev/pts/0

Jun 15 05:28:08 localhost su: admin to root on /dev/pts/0

Jun 15 07:19:19 localhost su: admin to root on /dev/pts/0

Jun 17 14:26:10 localhost su: BAD SU admin to root on /dev/pts/1

Jun 17 14:26:34 localhost su: admin to root on /dev/pts/1

Jun 24 08:13:24 localhost su: admin to root on /dev/pts/0

Jun 29 21:49:12 localhost sshd[23277]: error: PAM: authentication error for admin from 5.237.231.240

Aug 10 03:55:28 localhost su: admin to root on /dev/pts/0

Aug 10 03:55:49 localhost su: BAD SU admin to root on /dev/pts/0

Aug 10 03:55:55 localhost su: admin to root on /dev/pts/0

Aug 10 10:08:40 localhost su: admin to root on /dev/pts/0

حال من قصد دارم در این خروجی بخش ssh را حذف کنم و از سوییچ v- در فرمان به صورت زیر را اجرا کنید:

#root@localhost:/home/admin # cat /var/log/messages | grep admin | grep -v ssh

Jun ۲ ۰۶:۴۷:۱۲ localhost su: admin to root on /dev/pts/0

Jun ۳ ۱۳:۰۳:۳۱ localhost su: admin to root on /dev/pts/0

Jun ۸ ۱۱:۲۴:۵۷ localhost su: admin to root on /dev/pts/0

Jun ۸ ۱۱:۳۵:۰۵ localhost su: admin to root on /dev/pts/1

Jun ۸ ۱۸:۳۱:۱۲ localhost su: admin to root on /dev/pts/0

Jun ۸ ۱۸:۳۳:۵۲ localhost su: admin to root on /dev/pts/0

Jun ۸ ۱۸:۴۷:۳۴ localhost su: admin to root on /dev/pts/0

Jun ۸ ۱۹:۰۵:۵۳ localhost su: admin to root on /dev/pts/0

Jun ۸ ۲۱:۱۹:۱۵ localhost su: admin to root on /dev/pts/0

Jun ۸ ۲۱:۲۴:۱۷ localhost su: admin to root on /dev/pts/0

Jun ۹ ۰۶:۵۲:۲۴ localhost su: admin to root on /dev/pts/0

Jun 10 06:18:34 localhost su: admin to root on /dev/pts/0

Jun 11 08:35:05 localhost su: BAD SU admin to root on /dev/pts/0

Jun 15 05:28:08 localhost su: admin to root on /dev/pts/0

Jun 15 07:19:19 localhost su: admin to root on /dev/pts/0

Jun 17 14:26:10 localhost su: BAD SU admin to root on /dev/pts/1

Jun 17 14:26:34 localhost su: admin to root on /dev/pts/1

Jun 24 08:13:24 localhost su: admin to root on /dev/pts/0

Aug 10 03:55:28 localhost su: admin to root on /dev/pts/0

Aug 10 03:55:49 localhost su: BAD SU admin to root on /dev/pts/0

Aug 10 03:55:55 localhost su: admin to root on /dev/pts/0

Aug 10 10:08:40 localhost su: admin to root on /dev/pts/0

همان طور که مشاهده می کنید خط مربوط به ssh از خروجی برنامه حذف شد.

نکته: شایان ذکر است که فرمان های اجرا شده در این بخش فقط مربوط به سیستم است که با آن کار می کردم و خروجی آن برروی سیستم شما می تواند متفاوت باشد.