آموزش خط فرمان لینوکس – قسمت ششم
من محمدرضا هستم. دوستِ مجید :)
مدتی بود که با مجید تصمیم گرفته بودیم توی این قسمت از سایت "روشنیهای راه" (ترجمهی درسهای آموزش خط فرمان لینوکس و انتشارشون) با مجید همکاری کنم. این اولین پست من توی این قسمت از سایت هست و امیدوارم که از این به بعد همون طور که مجید هم قبلا گفته بود بتونیم این قسمت از سایتِ "روشنی ها ی راه" رو با نظم بهتری کامل کنیم. ما رو از نظراتتون محروم نکنید.
قبل از اینکه شروع کنیم به خوندن درس جدید دوست دارم این نکته رو بگم که من اصلا با فوت و فن ترجمهی متون که یک کار تخصصی هست آشنایی ندارم. برای همین تنها سعی میکنم که درسهایی رو که اینجا هستند با بیان خودم منتقل کنم به سایت روشنیها.
بیشتر از این سرتون رو درد نمیارم. در درس جدید آموزش خط فرمان لینوکس نشون داده شده که چه جوری می تونیم ورودی دستورات خط فرمان رو از یک فایل یا از یک دستور دیگه بگیریم و به همین شکل خروجی رو به یک فایل یا یک دستور دیگر بفرستیم. در حالت معمولی ورودی از صفحه کلید گرفته می شود و خروجی به صفحه نمایش فرستاده می شود.
این هم از قسمتِ ششمِ آموزش خط فرمان لینوکس. واقعا نکات جالبی داره. از دست ندینش:
I/O Redirection
در این درس شما با یک ویژگی قدرتمند به نام input/output redirection آشنا خواهید شد که در بسیاری از برنامههای خط فرمان استفاده میشه. همان طورکه میدونید خیلی از دستورات، خروجیشون رو بر روی صفحهی نمایش چاپ میکنند. مثل دستور ls که محتویات شاخهی جاری رو بر روی صفحهی نمایش نشون میده. اما نشان دادن خروجی دستور بر روی صفحهی نمایش تنها گزینه برای نمایش خروجی نیست؛ بلکه با استفاده از یک سری علامتها (کاراکترها) شما میتونید این خروجیها را به یک فایل، یک دستگاه و حتی به ورودی دستورات دیگه ارسال کنید.
خروجی استاندارد
بیشتر برنامههای خط فرمان که نتایجشان را روی صفحهی نمایش نشان میدهند، این کار را با فرستادن نتایجِ دستور به یک facility به نام "خروجی استاندارد" انجام میدهند. به طور پیش فرض خروجی استاندارد، نتایج دستور اجرا شده را به صفحهی نمایش برنامه انتقال میدهد. برای اینکه این محتویات را به درون یک فایل دلخواه هدایت کنید، میتوانید از “
[me@linuxbox me]$ ls > file_list.txt
در مثال بالا دستور ls اجرا شده و نتایج آن درون فایل “file_list.txt” ذخیره میشود. از آن جا که نتایج دستور lsدر این مثال به درون فایل انتقال داده میشود، هیچ نتیجهای بر روی صفحهی نمایش نشان داده نخواهد شد. هر بار که دستور بالا را اجرا کنید محتویات تولید شده توسط دستور ls، از ابتدای فایل “file_list.txt” بازنویسی (overwritten) خواهد شد. اگر میخواهید در هنگام اجرای مجدد دستور، نتایج جدید به جای این که از ابتدای فایل نوشته شوند در ادامهی محتویات قبلی فایل قرار بگیرند (یا اصطلاحا append شوند) از “>>” به طوری که در مثال زیر آمده میتوانید استفاده کنید.
[me@linuxbox me]$ ls >> file_list.txt
با این دستور نتایج جدید به انتهای فایل افزوده میشوند. در نتیجه با هر بار اجرای دستور بالا فایل file_list.txt بزرگ و بزرگتر میشود. اگر فایل مورد نظر (در این مثال file_list.txt) وجود نداشته باشه، این فایل ساخته خواهد شد.
ورودی استاندارد
دستورهای زیادی هستند که قادر به گرفتن ورودی از یک facility که ورودی استاندارد نامیده میشود، هستند. به صورت پیش فرض، ورودی استاندارد محتویاتش را از صفحه کلید میگیرد. اما درست شبیه به خروجی استاندارد، این کار (یعنی گرفتنِ ورودی) میتواند به صورت غیر مستقیم انجام شود (redirect شود). برای این که ورودی را به شکل غیر مستقیم به جای دریافت از صفحه کلید از یک فایل بگیریم، کاراکتر “
[me@linuxbox me]$ sort
در مثال بالا از دستور sort برای پردازش محتویات فایل file_list.txt استفاده شده است. در این مثال، نتایج بر روی صفحهی نمایش نشان داده میشود. چون خروجی استاندارد در اینجا به درون یک فایل هدایت نشده. اگر میخواستیم خروجی فایل را به درون یک فایل دلخواه بفرستیم، کافی بود مثل زیر عمل میکردیم:
[me@linuxbox me]$ sort sorted_file_list.txt
همان طور که دیدید، یک دستور هم میتواند ورودیش رو به طور غیرمستقیم و از طریق یک فایل بگیرد و هم میتواند خروجیش را به جای این که در صفحهی نمایش نشان بدهد به درون یک فایل بفرستد. در نظر بگیرید که ترتیب استفاده از عملگر های مهم نیست. تنها چیزی که اهمیت دارد اینست که این عملگر ها باید بعد از آرگومانهای اختیاری و اجباری دستور قرار بگیرند.
Pipe ها
به طور قطع مفیدترین و قدرتمندترین کاری که با استفاده از I/O redirection میتوان انجام داد این است که چند دستور را توسط چیزی به اسم pipe (با استفاده از کاراکتر "|")به یکدیگر متصل کنیم. با استفاده از pipe ها خروجی یک دستور به ورودی دستور دیگر فرستاده میشود. در مثال زیر یک استفادهی جالب از این تکنیک نشان داده شده است:
[me@linuxbox me]$ ls -l | less
در مثال بالا خروجی دستور ls به less داده میشود. با استفاده از تکنیک “| less” می توان کاری کرد که خروجی هر دستور دلخواه، به نحوی در صفحهی نمایش ارایه شود که بتوان به صورت صفحه به صفحه آن را دید و با استفاده از کلیدهای جهت (arrow keys) بتوان در صفحههای مختلف گشت. این کار برای زمانی که خروجی یک دستور در بیشتر از یک صفحه جای میگیرد میتواند مفید باشد. در مثال بالا لیست فایلها به صورت صفحه به صفحه قابل نمایش است.
با اتصال دستورات به یکدیگر، کارهای جالبی میتوان انجام داد که در جدول زیر نمونه هایی از آن نشان داده شده است:
تعدادی مثال از اتصال دستورات به یکدیگر با استفاده از pipe
عملی که انجام میشود |
دستور |
10 تا از جدید ترین فایلها در شاخهی جاری را نمایش میدهد. |
ls -lt | head |
لیستی از شاخهها و این که چه مقدار فضا مصرف کردهاند را از بزرگ به کوچک نمایش میدهد. |
du | sort -nr |
تعداد فایل ها موجود در شاخهی جاری و تمام زیر شاخههایش را نمایش میدهد. |
یک دسته از برنامهها وجود دارند که شما می توانید به همراهِ pipe ها استفاده کنید و فیلتر نامیده میشوند. فیلترها ورودی استاندارد را می گیرند و عملیاتی روی آن انجام داده و نتیجه را به خروجی استاندارد میفرستند. به این صورت فیلترها میتوانند برای پردازش بر روی اطلاعات به شکل قدرتمندی استفاده شوند. در ادامه در جدول زیر تعدادی از برنامههای رایج را میبینید که میتوانند به عنوان فیلتر عمل کنند:
عملی که انجام میشود |
برنامه |
ورودی استاندارد را مرتب کرده و در خروجی استاندارد نمایش میدهد. |
|
یک جریان داده مرتب شده را از ورودی استاندارد گرفته، خطوط تکراری در این داده را حذف میکند و در خروجی استاندارد نمایش میدهد. (در واقع این اطمینان حاصل میشود که همهی خطوط منحصربهفرد هستند.) |
|
خطوطی را که از ورودی استاندارد می گیرد امتحان میکند و هر خطی که شامل یک الگوی کاراکتر خاص میباشد را به خروجی میفرستد. |
|
متن را از ورودی استاندارد میگیرد و متن را به صورت ساخت یافته (فرمت شده) به خروجی استاندارد میبرد. باید برای استفاده از آن پارامترهای مناسب را به طور کامل پاس کنید. |
|
متنی را که از ورودی استاندارد می گیرد به صورت صفحه هایی که شامل سربرگ، تهبرگ و فاصله های مناسب است، طوری تقسیم بندی می کند که برای چاپ شدن آماده باشد. |
|
تعداد محدودی از خطوط متنی را که از ورودی گرفته در خروجی نمایش می دهد. برای گرفتن هدرِ فایلها مفید میباشد. |
|
تعداد محدودیاز خطوط آخر در متن ووردی را به خروجی برده و نمایش میدهد. برای گرفتن آخرین رکوردهای ثبت شده در یک فایل گزارش (log file) مناسب میباشد. |
|
کارکتر های درون یک متن را (از یک ساختار به ساختار دیگر) ترجمه میکند. به طور مثال برای تبدیل کاراکترهای یک متن از حالت کوچک به بزرگ یا تغییر کاراکتر نشان دهندهی انتهای خط از یک نوع به نوع دیگر. (برای مثال تبدیل فایل متنیِDOS به یک فایل متنی به فرم Unix ) |
|
ویرایش یک جریان یا Stream. ترجمه های پیچیده تری نسبت به tr میتواند انجام دهد. |
|
یک زبان برنامه نویسی طراحی شده برای ساختن فیلتر ها. بسیار قدرتمند. (به همراه این برنامه یک دورهی آموزشی هم وجود دارد که سریعاً شما را برای کار با آن آماده میکند. ممکن است بر روی بعضی از سیستمها به طور پیشفرض نصب نشده باشد. /م) |
دو مثال کاربردی با استفاده از pipe
1- چاپ کردن از طریق خط فرمان
در لینوکس یک برنامه به نام lpr داریم که ورودی استاندارد را میگیرد و آن را به دستگاه چاپ میفرستد. این برنامه اغلب به همراهِ pipe و فیلترها استفاده میشود. به عنوان نمونه دو حالت مختلف در ادامه آورده شده است:
cat poorly_formatted_report.txt | fmt | pr | lpr
cat unsorted_list_with_dupes.txt | sort | uniq | pr | lpr
در مثال اول ابتدا ما با استفاده از catفایل را خوانده و با استفاده از pipe (کاراکتر |) خروجی cat را که محتویات فایل است به ورودی fmt فرستادهایم. fmt ورودی خود را به پاراگرافهای منظم و تر و تمیز تبدیل میکند و به خروجی استاندارد میفرستد. همانطور که میبینید این خروجی نیز با استفاده از pipe به pr فرستاده شدهاست. prنیز متنی را که به عنوان ورودی گرفته به صورت صفحه، صفحه مرتب میکند و به خروجی استانداردی که باز به وسیلهی pipe به ورودی lprفرستاده شده میفرستد. lprنیز ورودی خود را به چاپگر میفرستد.
در مثال دوم با یک فایل که حاویِ یک لیست نامرتب و دارای رکوردهای تکراری است کار میکند. ابتدا catمحتویات فایل را خوانده و به sortمیفرستد. متن فایل مرتب شده و خروجی sortبا استفاده از pipe به uniqوارد میشود که در آن رکوردهای تکراری حذف میشوند. سپس prو lprبه منظور چاپ کردن متن استفاده میشوند.
2- دیدنِ محتوای فایل های tar
گاهی ممکن است با نرمافزارهایی مواجه شوید که به صورت یک فایل gzipped tarدر اختیار شما قرار گرفتهاند. این نوع فایلها از نوع فایلهای بایگانی شده (فایل های آرشیوی که با tarدرست شدهاند) هستند که توسط gzip فشرده شدهاند. این فایلها از روی پسوندهای کلاسیکشان (.tar.gz یا .tgz) قابل تشخیص هستند. با استفاده از دستور زیر در خط فرمان لینوکس شما میتوانید شاخههای موجود در فایل مورد نظر را ببینید:
tar tzvf name_of_file.tar.gz | less