روش‌هایی برای جست‌وجو داخل فایل‌ها

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

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

 زمانی که می‌دانید دنبال چه چیزی می‌گردید

در برخی موارد همانطور که ذکر شد کاملا می‌دانید دنبال چه کلماتی هستید و یا ترکیب خاصی از کلمه مثلا پنج حرف اول آن را در خاطر دارید. در این زمان به راحتی می‌توانید از دستور گِرِپ «grep» استفاده کنید. در این دستور می‌توان اطلاعات و کلمات خاصی را بین چندین اطلاعات جست‌وجو کرده و به نمایش گذاشت. این دستور در مواقعی که بخواهید خروجی بزرگی که دستور خاصی ایجاد کرده و به کلمات و موارد خاصی محدود کنید؛ نیز به کار می‌رود. مثلا اگر می‌خواهید با دستوری اطلاعات بسته‌های نرم‌افزاری نصب شده را ببینید اما به دنبال این هستید که آیا مثلاً «GCC» نصب است یا نه؟ برای این کار شما فقط کافی است که دستور مورد نظر را نوشته و خروجی را با استفاده از  نویسه لوله «Pipe» به برنامه گِرِپ لوله‌کشی کنید. سپس اگر هر شرطی در گِرِپ به کار رفته باشد، گِرِپ خروجی را محدود خواهد کرد.

در این مثال ما از یک فایل متنی استفاده کرده‌ایم که «poem» نام دارد که محتوای آن از یک شعر انگلیسی تشکیل شده است، این فایل یک فایل متنی عادی و ساده است که بدون پسوند txt است. در سیستم‌عامل یونیکس و شبه‌یونیکس‌ها نیازی به نوشتن پسوند فایل نیست و نوع فایل در داخل خود فایل تعریف شده است. این‌جا چون فایل به صورت متن عادی است پس به عنوان یک متن عادی در نظر گرفته می‌شود. با این حال استفاده از پسوند در یونیکس نیز پشتیبانی می شود، اما لازم نیست نوشته شود. برخلاف ویندوز که حتما باید پسوند فایل را مشخص کنیم.

یکی از ساده‌ترین جست‌وجوها، جست‌وجو به دنبال کلمه‌ای خاص است که برای انجام آن از دستور زیر استفاده می‌شود. دستور زیر کلمه مورد نظر را در متن جست‌وجو می‌کند و کلماتی را که همانند آن هستند و یا در این کلمات چنین کلمه‌ای استفاده شده‌است را نمایش می‌دهد. مثلا اگر ما  «happ» را جست‌وجو کنیم؛ کلمات دیگری چون «happy» و «happiness» نمایش داده خواهد شد.

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

همچنین اگر بخواهیم دنبال کلمه خاصی بگردیم دستور فوق را با کلید «-w» همراه می‌کنیم. مثلا در مورد مثالی برای جست‌وجوی کلمه «hope»، به شکلی که دقیقا همین کلمه را برایمان پیدا کند؛ باید دستور را به شکل زیر به کار بریم.

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

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

با وجود در صورت استفاده از ZSH و برخی تنظیمات خاص برای رنگی کردن خط فرمان،  این جست‌وجو در داخل فایل‌هایی که در آنان کلمات فارسی وجود دارد؛ با کمی مشکل همراه خواهد بود. مثلا اگر در شعر فارسی همین دستور را به کار گیرید؛ خروجی به صورت منظم نبوده و به جای چینش از سمت راست. هر کلمه نوشته شده و سپس کلمه بعدی آن از سمت چپ چینش می‌شود. حتی برخی کلمات درست نوشته شده و برخی نامرتب نوشته شده که باعث گیجی می‌شود. به عنوان مثال دستور زیر را نوشته‌ایم تا در شعر زیبای موش و گربه عبید زاکانی به جست‌وجوی کلمه موش بگردیم.

خروجی آن کاملا آشفته و عجیب می‌نماید! با این حال موفق به یافتن کلمات درست شده است. در صورت مشاهده خروجی به شکل نامرتب، نگرانی به خود راه ندهید. اگر خروجی را از ترمینال رونویسی کرده کرده و در یک ویرایشگر متنی ساده مثل GEdit درج کنید، تمامی حروف در جای صحیح قرار خواهند گرفت.

همانطور که قابل مشاهده است؛ حتی اگر خروجی را دی محیطی مانند این‌جا نیز درج شود، خروجی کاملا مرتب و خوانا است. شکل زیر نشان‌دهنده حالت خروجی در ترمینال خواهد بود. مشکل اصلی زمانی است که می‌خواهد کلمه موش را به رنگ قرمز و به صورت ضخیم مشخص کند که شاید همین مورد خروجی را از نظم خارج کرده است.

persain-poemپیدا کردن اگوها در برخی موارد ممکن است به کاربرد ترفندهایی خاص نیاز داشته باشد. به عنوان مثال اگر بخواهیم در شکل بالا به دنبال کلمه‌ای خاص بگردید، تنها کلماتی نمایش داده می‌شوند که بزرگی و کوچکی آنها یکسان با کلمه مورد نظر برای جست‌وجو باشد. مثلا اگر من کلمه «bird» را در شعر فوق جست‌وجو کنم؛ خروجی خاصی مشاهده نخواهم کرد. به دلیل آنکه در متن چنین کلمه‌ای را نیافته است.

اما اگر همان کلمه را با حروف بزرگ بنویسم؛ خروجی مشابه زیر خواهد بود. به طور کلی دستور فوق به بزرگی و کوچکی حروف حساس است.

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

اگر بخواهیم دنبال جملاتی بگردیم که با کلمه‌ای خاص شروع شده‌اند می‌توانید از دستور به شکل زیر استفاده کنید. یعنی قل از کلمه یک هشتک «^» بنویسید.

خروجی دستور فوق به شکل زیر خواهد بود. که همگی جملات با «And» شروع شده‌اند.

اگر در شعر فارسی عبید زاکانی نیز به دنبال این هستیم که جملاتی که در اول آنان «گربه» است را بیابیم؛ باید از دستور مشابه استفاده کنیم.

تمامی خطوطی که در شعر موش و گربه با کلمه «گربه» آغاز شده‌اند از قرار زیر هستند.

اگر بخواهیم جملاتی را که در آخر آنان کلمه مورد جست‌وجو وجود دارد را در خروجی نمایش دهد؛ باید بعد از کلمه یک علامت دلار «$» قرار دهیم؛ مثلا در جست‌وجو برای جملات پایان یافته با «وش» دستور زیر را اجرا می‌کنیم.

مصراع یا خطوطی که با کلمه «وش» تمام شده‌اند دو خط اول یعنی خطوط زیر هستند.

اگر میخواهید جملاتی را که با حروف صدادار خاصی هستند را برایمان مشخص کند، می‌توانیم از دستور زیر استفاده کرد.

در دستور بالا تمامی جملاتی که از حروف صدادار مشخص شده بهره‌مند هستند را به خروجی دستور «head» لوله‌کشی می‌کند که در آنجا سه سطر بالایی نمایش داده خواهند شد.

دستور زیر کلماتی که با حروف صدادار AO و ao هستند را برایمان مشخص می‌کند.

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

برخی مواقع پیش می‌آید که می‌خواهید به دنبال رشته‌هایی باشید که از ۹ یا ۱۰ حرف تشکیل شده‌اند.

دستور بالا برای شعر مورد استفاده ما، خروجی زیر را تولید می‌کند. در برخی تنظیمات، ZSH یا BASH تمامی کلماتی که از ۹ یا ۱۰ حرف تشکیل شده‌اند را به رنگ قرمز مشخص می‌کنند.

برخی مواقع نیز پیش می‌آید که بخواهیم کلمه‌ای بلند با طوب بیشتر از کلمه وارد شده را که به وسیله کلمه کوچکتر دیگر ایجاد شده است را بیابیم. مثلا دنبال کلمات بلندی هستیم که در آنان کلمه «beaut» وجود داشته باشد.

خروجی دستور فوق به شکل زیر است که در آن کلمات بلندتر مشتق شده از «beaut» مانند «beauty» و «beautiful» را در فایل مذکور پیدا کرده است.

جست‌وجو در شعر بالا به اشکال مختلف باعث شد تا شما با نحوه استفاده از این دستور آشنا شوید. با وجود این استفاده از این دستور بسیار کاربردی تر از پیدا کردن چندین کلمه یا جمله از یک شعر کاربرد دارد. به عنوان نمونه شما می‌خواهید بدانید کارت گرافیکی سیستم شما چه مشخصاتی دارد برای این کار خروجی دستور «lspci -k» را به grep لوله‌کشی می‌کنیم.

خروجی دستور بالا برای سیستمی که در حال حاضر مشغول استفاده از آن هستم، دو کارت گرافیک زیر را نمایش می‌دهد.

در مثالی دیگر در فایل «pacman.log»، به دنبال اطلاعات مربوط به مثلا نصب و حذف و به‌روزرسانی بسته‌ای خاص گشت. دستور زیر تمامی اعمال مرتبط با بسته نرم‌افزاری DigiKam را نمایش خواهد داد.

کلمه کلیدی C و سپس عدد بعد از آن مشخص می‌کنند تا چند خط بعد از هر نتیجه را هم نمایش دهد که در دستور بالا فقط یک خط بیشتر نمایش داده خواهد شد. توجه کنید که این خطوط بعد و قبل از نتیجه به یک اندازه اضافه می‌شود. یعنی اگر عدد یک را بنویسید یک خط قبل نتیجه و یک خط بعد نتیجه را نشان خواهد داد. اگر عدد دو را بنویسید نیز دو خط قبل و بعد هر نتیجه را نمایش خواهد داد تا نمای بهتری از اطلاعات داشته باشید که به نحوی می‌توان گفت اطلاعات را دسته‌بندی نیز خواهد کرد.

 زمانی که نمی‌دانید، می‌خواهید دقیقا دنبال چه چیزی بگردید

به طور قطع و یقین اگر برنامه نویس یک زبان برنامه نویسی مانند C و حتی پایتون بوده باشید در هنگام اجرا و یا کامپایل با خطای سهوی در Syntax و نوشتارها مواجه شده‌اید. معمولا این مفسرها یا مترجم‌های زبان برنامه نویسی اطلاعات کمی را در اختیار می‌گزارند که همراه با شماره خطی است که خطا در آن رخ داده است. به عنوان نمونه من قطعه کد زیر را به زبان C نوشته‌ام که دارای هشدار خاصی است.

سپس کدهای بالا را در فایلی با نامی دلخواه ذخیره و دستور زیر را برای کامپایل کد اجرا می‌کنیم.

در این هنگام , در صورت کامپایل خط بالا هشدار و خطای زیر نمایش داده خواهد شد.

حال و با فهمیدن هشدار فوق که معمولا می‌توان آن را نادیده گرفت باید آن خط را یافت.  برای یافتن هشدار فوق و رفع آن از دستور زیر استفاده می‌کنیم.

خروجی آن یک خط کد می‌باشد که شامل همان خط مورد نظر است که در دستور وارد کرده‌ایم.

در خط بالا کاملا مشخص است که از علامت نامناسبی به جای «** char»   استفاده کرده‌ام. پس نویسه «*cahr» را به نویسه درست پیشنهادی تغییر می‌دهم. حال اگر خطا به شکلی بود که باید چند خط قبل و بعد از خط قبلی یا خطوط قبلی نیز نمایش داده می‌شد. می‌توانستم از دستور زیر استفاده کنم.

خروجی دستور بالا به شکل زیر خواهد بود که خطوط ۲۲ و ۲۳ به همراه خطوط ۲۴ تا ۲۶ را هم نمایش خواهد داد.

خطای رخ داده نیز مرتبط با همان هشدار اول است که با مشاهده خط بعدی قابل فهم خواهد بود. با این حال می‌توان موارد بسیار جالتری را نیز با ابزار sed انجام دهید. مثلا در دستور زیر تمامی خطوطی که شامل حلقه  for هستند را با شکل ==> مشخص کرده‌ایم.

خروجی دستور بالا بر روی کد مذکور به شکل زیر خواهد بود.

همچنین برای مشخص کردن مثلا دستور printf نیز از دستور زیر استفاده می‌شود. که خروجی آن نیز همانند بالا خواهد بود به جز این مورد که برای هر printf آن علامت را نمایش خواهد داد. دستور فوق با اعمال حرف printf به جای for با خروجی زیر همراه است.

دستور:

خروجی:

آری، گشتن به دنبال سوزنی در انبار کاه همواره مشکل است؛ اطلاعات نیز همچون انباری کاه در هم تنیده و پیچیده شده‌اند مخصوصا در زمانی که اطلاعات شامل موارد بالا و گنگی باشد. مثلا پیدا کردن اطلاعاتی خاص از لاگ «Log» سیستم مرتبط با کاربری خاص که کاملا مشکل است. برای همین منظور است که استفاده از دستورات خظ فرمان با مولفه‌ها و ویژگی‌ها جالبی که دارند؛ همواره یکی از راه‌های جست‌وجو در فایل‌ها هستند. در این مطلب  به موارد ساده و ابتدایی پرداخته شد تا با دستور فوق آشنا شوید؛ پیددا کردن موارد پیچیده‌تر و سخت‌تر را نیز می‌توان با دستورات فوق انجام داد که ممکن است به اشکال دیگر و با مولفه‌های دیگر قابل انجام باشند. بنا براین با خواندن راهنمای دستورات گفته شده از طریق دستورات زیر خواهید توانست سطح دانش خود را برای استفاده از این ابزارها بالا برید.

در آخر اگر از سیستم‌عامل‌ها شبه یونیکس استفاده می‌کنید این دستورات در آن سیستم‌عامل نیز وجود خواهند داشت و محدود به گنو/لینوکس و مک نیستند. همنین اگر گوشی هوشمند اندرویدی شما روت شده است نیز فاقد خواهید بود تا با نصب ابزار بیزی‌باکس «busybox» دستورات فوق را اجرا کنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *