در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
دستورfind
دستور find اولین دستوری است که به سراغش میرویم، از نامش معلوم است که برای جستجوی فایلها به کار میرود، حقیقتا دستور مفیدی است. این دستور آرگومانهای انتخابی، تستی و نوع عملکرد میپذیرد و نتیجه یک آرگومان میتواند روی پردازش آرگومانهای بعدی خود تاثیر بگذارد. بگذراید این دستور را با یک مثال شروع کنیم:
َ find- / name test -print
usr/bin/test/
َ
بسته به نوع نصب لینوکس شما، ممکن است فایلهای دیگری با نامtest هم پیدا بشوند. خب، همانطور که خودتان هم تابحال احتمالا حدس زدهاید، این دستور میگوید: از / شروع کن و بگرد و فایلی که نامش test است را پیدا کن و بعد اسم فایل را چاپ کن.
یک مشکل این است که این دستور از آن چیزی که ما انتظار داریم کندتر عمل میکند، چرا؟ اغلب ما روی سیستم خود، از فایل سیستمهای ویندوزی استفاده میکنیم یا از طریق شبکه (Samba Share) به فایل سیستمهای ویندوزی دسترسی داریم، این دستور تمام این موارد را میگردد، برای همین، کند عمل میکند. حالا اگر همین دستور را اینطور تکرار کنیم، دیگر فایلهای سیستم دیگر را نمیگردد و نتیجه بهطرز قابل توجهی سریعتر خواهد بود:
َ find /-mount -name test -print
معانی انتخابها(Options)
-depth(یعنی جستجوی محتویات دایرکتوری، پیش از خود دایرکتوری)
-maxdepths N(جستجو تاN سطح در دایرکتوری)
-mount (or -xdev)(دایرکتوریهای فایل سیستمهای دیگر را نگرد)
حالا برای آزمایش و تست، میتوانیم خیلی چیزها را برای تست به دستورfind بدهیم، توجه داشته باشید که نتیجه هر تست درست یا غلط است. وقتی جستجو در حال انجام است، هر فایلی که پیدا کند را مطالعه میکند و تمام تستها را، به ترتیب تعریف، روی آن انجام میدهد، در آن فایل، اگر تست مقدارfalse برگرداند، در این صورت جستجوگر مطالعه فایل را متوقف میکند و به کار خود ادامه میدهد؛ اگر نتیجه تست درست باشد، تست بعدی و تست بعدی، تا آخرین تست. تستهایی که در زیر آورده شدهاند، از پرکاربردترین تستها هستند. برای لیست کامل تستها به صفحه راهنمای دستور find مراجعه کنید.
-atime N(فایل آخرین بار درN روز قبل مورد دسترسی قرار گرفته)
-mtime N(فایل آخرین بار N روز قبل اصلاح شده)
-name pattern(اسم فایل، به همراه مسیرش بایستی با الگوی داده شده مطابقت داشته باشد)
-newer otherfile(فایل جدیدتر از فایل otherfile باشد)
-type C(نوع فایل از نوع C باشد، که C میتواند نوع خاصی باشد، مثلا dًبرای دایرکتوری یاf برای فایل معمولی)
-user username(فایل متعلق به کدام کاربر باشد)
شما میتوانید تستها را با عملگرها نیز مخلوط کنید. این کار دو فرم دارد، فرم کوتاه و فرم بلند که در زیر نشان داده شده است:
) ! -notتست را برعکس میکند)
-a -and(هر دو تست باید درست باشند)
-o -or(هر تست درست باشد، قبول است)
میتوانید با استفاده از پرانتز، اولویت تستها و عملگرها را تعیین کنید. اما چون پرانتزها برای shell معنی خاصی دارند، برای فرار از این موضوع باید از کاراکتر ُ استفاده کنید. ضمنا اگر از الگویی برای اسم فایل استفاده میکنید، باید از نقل قول استفاده کنید تا پوسته به جز انتقال آن به دستورfind گمان دیگری نکند:
find . -newer while2 -print$
برای تمرین و حالتهای مختلف، از صفحه راهنما استفاده کنید. بعد از اینکه توانستید حسابی مهارت خودتان در جستجوی فایلها را آببندی کنید، بیایید ببینیم چه کارهایی میشود با نتیجههای حاصل از جستجو کرد. باز هم بگویم که این جدولی که میبینید، فقط لیستی از پرکاربردترین کارهاست، صفحه راهنمای دستورات باید روی در یخچالتان باشد:
-exec command(دستوری را اجرا میکند توضیحات بعدی را بخوانید)
-ok command(درست مثل-exec ، جز اینکه قبل از اجرای هر فایل، از کاربر تاییدیه میگیرد)
-print(اسم فایل را چاپ میکند)
-ls(دستور -ls -dils را روی فایل جاری اجرا میکند)
دستور -exec و دستور -ok تا انتهای خط هر چه ببینند، پارامترهای خود در نظر میگیرند، تا به کاراکتر ُ برسند. یعنی برای اتمام پارامتردهی باید از ُ استفاده کرد.
همانطور که دیدید، دستور اول بسیار مفید بود. به سراغ دستور دوم میرویم:
دستورgrep
دستور بسیار مفید دیگری که به سراغش خواهیم رفت، دستورgrep است، نامی غیر متعارف که مخفف general regular expression parser است! برای جستجوی فایلهای سیستمتان از find استفاده میکنید، اما از grep برای جستجوی فایلها برای یافتن رشتهها استفاده میکنید. صد البته که میتوانgrep را به عنوان پارامتر به-exec دستور find پاس داد. شکل کلی دستور grep به این صورت است:
grep ]options[ PATTERN ]FILES[
اگر هیچ فایلی داده نشد، دستور ورودی استاندارد را میگردد. بیایید به انتخابهای اساسی دستورgrep نگاهی بیندازیم، دیگر نگویم که این انتخابها، انتخابهایی مفید و پرکاربرد است و راهنمای دستور را برای خواندن لیست کامل انتخابها ببینید:
-c(به جای چاپ نتایج، تعداد خطوطی که پیدا شده است را چاپ میکند)
-E(روشن کردنextended )
) -hتحت فا)
grep in words.txt$
When shall we three meet again. In thunder,
lightning, or in rain I come, Graymalkin!
$grep -c in words.txt words2.txt
2words.txt:
14.txt:2words
grep -c -v in words.txt words2.txt$
9words.txt:
16.txt:2words
همانطور که دیدید، استاد شدن در grep به نظر ساده میرسد. حالا وقت این است که به سراغ پایههای مبحث regular expressions یا عبارات قاعدهپذیر برویم، عباراتی که به کمک آن، میتوانیم الگوهای پیچیدهتر و کاربردیتر خلق کنیم. همانطور که گفته شد، عبارات قاعدهپذیر در لینوکس و بسیاری از زبانهای سورس باز (open source) به کار میرود میتوانید توی ادیتورvi و یا توی اسکریپت نویسی Perl از آنها استفاده کنید و مفاهیم پایهاش هم همه جا یکسان است. کارکردن با عبارات قاعدهپذیر یعنی پردازش کاراکترها به شیوهای که ما دلمان میخواهد، جدول زیر کاربرد چندتایی از کاراکترهای خاص را نشانمان میدهد:
حالا اگر دنبال این کاراکترهای معنی دار بودید، بایستی با یک ُ قبل از آنها، مشخص کنیم که منظورمان خود کاراکتر ّ یا $ است و نه نقش آنها. جداول کامل را میتوانید در بلاگ بیابید. در دستور grep یک انتخاب دیگر وجود دارد و آنهم -e استe . به معنای استفاده از عبارات گسترشیافته است.(extended expressions) درصورت مشخص شدن این انتخاب در grep، کاراکترهایی که الگوها را کنترل میکنند، و به عبارات قبلی اضافه میشوند، در جدول بعد آمده است.
کمی پیچیده بهنظر میرسد، اما اگر گام به گام و با هم جلو برویم، به آن صورت که دفعه اول به نظر میرسید، پیچیده نیست. آسانترین راه برای سر و کله زدن با عبارات قاعدهپذیر، امتحان کردن آن است:
1. بیایید اینطور شروع کنیم: با کاراکتر e جمله تمام شود. احتمالا حدس میزنید که باید از $ استفاده کرد. پس دستور ما یک چیزی شبیه این خواهد بود:
grep e$ words2.txt$
Art thou not, fatal vision, sensible
I see thee yet, in form as palpable
Nature seems dead, and wicked
dreams abuse
2. حالا بیایید فرض کنیم که میخواهیم کلمههایی را پیدا کنیم که با کاراکتر a تمام میشوند. برای اینکار، به الگویی نیاز داریم که جداساز کلمهها باشدspace) و(tab درست است؟ این الگو به صورت از پیش تعریف شده به این صورت است:
]:blank:[[]
$grep a]]:blank:[[ words2.txt
Is this a dagger which I see before me,
A dagger of the mind, a false creation,
Moves like a ghost. Thou sure and
firm-set earth ,
3. حالا بیاید دنبال کلمههای سه حرفی بگردیم که باTh شروع میشوند، چطور است؟ در این حالت، باید هم از]]:space:[[ برای جدا سازی کلمهها استفاده کرد و هم از . برای کاراکتر سوم. ببینیم:
$grep Th.]]:space:[[words2.txt
The handle toward my hand Come,
me clutch thee.
The curtain'd sleep;
”witchcraft celebrates
Thy very stones prate of my
whereabout,
4. دست آخر، از عبارات گسترش یافته استفاده میکنیم تا کلمههایی با حروف کوچیک پیدا کنیم که ده کاراکتر طول دارند. این کار را با مشخص کردن رنج کاراکترها ازz a- انجام میدهیم و مقدار تکرار 10 را به آن نسبت میدهیم:
$grep -E ]a-z[ُت01ُتwords2.txt
Proceeding from the heat
oppressed brain?-
And such an instrument I was to use.
The curtain'd sleep; ”
witchcraft celebrates
Thy very stones prate of
my whereabout,
فقط مدنظر داشته باشید که عباراتی که بحث شد، تنها از مهمترین و سادهترین مفاهیم عبارات قاعدهپذیر بودند. جدای خواندن مستندها و راهنماهای مرتبط با عبارات قاعدهپذیر که پیشنیاز یادگیری است، بهترین کار برای استفاده و استاد شدن در این عبارات، تجربه است. بلاگ لینوکس برای همه را ببینید، سعی کردهام کدها و آرشیو مطالب قبلی را آنجا هم قرار دهم.
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: