آموزشچگونه

آموزش خط فرمان: قسمت پنجاه و هشتم، فرمت خروجی

Print Friendly, PDF & Email

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

فرمان nl (شماره‌گذاری خطوط)

این فرمان، ابزاری ویژه برای انجام وظیفه ساده‌ای در نظر گرفته می‌شود. فرمان nl می‌تواند خطوط را شماره‌گذاری کند:

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

فرمان nl از مفهومی با نام Logical Pages (صفحات منطقی) در حین شماره‌گذاری پشتیبانی می‌کند. این ویژگی به فرمان nl این اجازه را می‌دهد تا در حین شماره‌گذاری، توالی شماره‌گذاری از ابتدا آغاز گردد. با استفاده از گزینه‌ها این قابلیت ایجاد می‌گردد. درواقع صفحات منطقی به هدر، بدنه و فوتر تقسیم می‌شوند. در هر کدام از این بخش‌ها امکان دارد که شماره‌گذاری ریست شده و از ابتدا آغاز گردد و یا یک استایل متفاوت اختصاص یابد.

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

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

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

از آن‌جایی که می‌خواهیم از فرمان nl بیشتر استفاده کنیم، مفید است که هدر، بدنه و فوتر را نشانه‌گذاری کنیم.

بدین منظور، این ویژگی را به اسکریپت sed که در دروس قبلی اجاد کرده بودیم، اضافه خواهیم کرد. با استفاده از ویرایشگر متنی، فایل مربوطه را تغییر داده و به‌صورت distros-nl.sed ذخیره می‌کنیم:

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

سپس گزارش خود را با ترکیب فرمان‌های sort، sed و nl ایجاد می‌کنیم:

در این گزارش، عنوان مشخص شده، هر ستون دارای نام مشخصی است و در پایان هم بخش فوتر گزارش نشان داده شده است.

فرمان fold (قرار دادن هر خط به اندازه تعیین شده)

فرمان fold (برگرفته از واژه folding به‌معنای تا کردن)، مربوط به پروسه شکستن خطوط متن با اندازه تعیین شده می‌باشد. فرمان fold نیز همانند سایر فرمان‌ها، یک یا چند فایل را به‌عنوان ورودی استاندارد قبول می‌کند. اگر fold را به جریان ساده متن ارسال کنیم، مشاهده خواهیم کرد که چگونه کار می‌کند:

در این‌جا فرمان fold را به‌صورت عملی می‌بینیم. جریان متنی که توسط echo ارسال شده به بخش‌هایی که با استفاده از گزینه –w کاراکتر ۱۲ را اختصاص داده شکسته شده است. اگر که هیچ طولی برای آن در نظر گرفته نشود، به‌صورت پیش‌فرض تعداد کاراکتر ۸۰ در نظر گرفته می‌شود. به یاد داشته باشید که خطوط، بدون در نظر گرفتن آن کلمات واحد شکسته می‌شوند؛ پس ممکن است، کلمات نیز شکسته شوند. گزینه –s موجب می‌شود تا فرمان fold خطوط را در آخرین فضای موجود ممکن بشکند.

پس با افزودن این گزینه، از شکستن کلمات جلوگیری می‌کنیم:

فرمان fmt (یک فرمت‌دهنده ساده متن)

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

به‌منظور شرح موضوع، به کمی متن نیاز داریم. متن زیر را از صفحه اطلاعات فرمان fmt کپی می‌کنیم. این متن، متنی توضیحی است و هیچ چیز خاصی ندارد. پرواضح است که هر متن دیگری را می‌توانید استفاده کنید:

سپس این متن را به درون فایل جدیدی با نام fmt-info.txt ایجاد می‌کنیم، کپی خواهیم کرد. در ادامه، فرض خواهیم کرد که قصد داریم طول هر ستون در متن، ۵۰ کاراکتر باشد. این کار را به کمک فرمان fmt و گزینه –w به‌صورت زیر انجام داده و خروجی را درون head پایپ می‌کنیم:

جدول زیر گزینه‌های موجود برای استفاده در فرمان fmt را نشان می‌دهد:

گزینه –p بسیار جالب است. با استفاده از آن می‌توانیم بخش‌های انتخاب شده فایل را فرمت‌دهی کنیم که این خطوط و بخش‌ها با کاراکتر خاصی مشخص شده‌اند. مثلا فرض کنید بسیاری از زبان‌های برنامه‌نویسی برای شروع کامنت، از کاراکتر # استفاده می‌کنند. در نتیجه می‌توان این بخش را با گزینه –p فرمت‌دهی کرد. بدین منظور فایلی را ایجاد می‌کنیم تا این قابلیت را نشان دهیم:

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

توجه داشته باشید که خطوط مجاور کامنت‌های سوم و چهارم به‌هم متصل شدند، در حالی که خطوط خالی و خطوطی که با کاراکتر مورد نظر # آغاز نمی‌شوند، تغییری پیدا نمی‌کنند.

فرمان pr (فرمت متن برای چاپ)

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

فرمان pr را با فرمت‌دهی فایل distros.txt (که در دروس قبلی ایجاد کردیم) به چند صفحه بسیار کوتاه، شرح می‌دهیم (در زیر، فقط دو صفحه اول نمایش داده شده است):

در این مثال، گزینه –l (برای اندازه خط) و گزینه –w (برای اندازه صفحه) را به‌کار گرفتیم. در ادامه، طول خطوط ۱۶ کاراکتر و طول صفحات ۶۵ کاراکتر تعیین شد. در نتیجه فرمان pr فایل distros.txt را به سه دسته تقسیم کرده و بالا و پایین صفحات را با فاصله خالی از هم جدا می‌کند.

فرمان printf (فرمت و چاپ داده)

برخلاف سایر فرمان‌هایی که بدان اشاره شد، فرمان printf را نمی‌توان به‌همراه Pipelineها استفاده کرد (چرا که ورودی استاندارد را قبول نمی‌کند). به همین خاطر کم‌تر (به‌صورت مستقیم) در خط فرمان به‌کار گرفته می‌شود و آن را بیش‌تر در فایل‌های اسکریپت استفاده می‌کنند.

درواقع فرمان printf (برگرفته از عبارت Print Formatted به‌معنای چاپ قالب‌بندی شده)، برای برنامه‌نویسان زبان C و Shell توسعه یافت و به تبع آن در بسیاری از زبان‌های برنامه‌نویسی پیاده‌سازی شد. این فرمان با این ساختار کار می‌کند:

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

یک مثال ساده:

ممکن است رشته فرمت، حاوی متن لیترال (مثل I formatted the string)، توالی‌های Escape (مانند \n و خط جدید) و همچنین کاراکتر شروع خط % نیز باشد. در مثال بالا %s استفاده شده تا رشته foo فرمت‌دهی شود و آن را در خط فرمان، نمایش دهیم. مثالی دیگر:

همان‌گونه که مشاهده می‌شود، %s توسط foo در خروجی خط فرمان، جایگزین شد. تبدیل s به‌منظور فرمت‌دهی داده رشته‌ای به‌کار گرفته می‌شود. مشخص‌کننده‌های دیگری برای انواع مختلف داده وجود دارد که در جدول زیر، قابل مشاهده هستند:

تاثیر هر کدام از این مشخص‌کننده‌های تبدیل را بر روی رشته ۳۸۰ در مثال زیر نشان می‌دهیم:

از آن‌جایی که شش مشخص‌کننده تبدیل قرار دادیم، بایستی ۶ آرگومان برای تبدیل نیز قرار دهیم. نتیج به‌دست آمده توسط هر مشخص‌کننده تاثیر آن را نشان می‌دهد. برخی اجزای اختیاری را می‌توان به مشخص‌کننده‌ها اضافه کرد.

یک مشخصه تبدیل کامل ممکن است شامل اجزای زیر باشد:

جدول زیر این اجزا را توضیح می‌دهد:

جدول زیر، شامل مثال‌هایی از فرمت‌های مختلف است:

با این‌که فرمان printf به‌جای آن‌که به‌صورت مستقیم در خط فرمان به‌کار گرفته شود، بیشتر در اسکریپت‌ها (غالبا برای فرمت‌دهی داده‌های جدولی) کاربرد دارد؛ ولی هنوز هم قادریم که نشان دهیم چگونه می‌توان از آن برای مشکلات مختلف فرمت‌ددهی استفاده کنیم.

در ابتدا برخی از فیلدها را به‌وسیله کاراکترهای Tab در خروجی نشان می‌دهیم:

با درج \t (توالی عبور برای کاراکتر Tab)، نتیجه دلخواه را دریافت می‌کنیم. حالا برخی شماره‌ها را با فرمتی واضح نمایش می‌دهیم:

این فرمان، تاثیر حداقل طول فیلد بر روی فضای فیلدها را یا این‌که چگونه صفحه وب کوچکی را فرمت‌دهی کنیم را نشان می‌دهد:

منبع: کتاب The Linux Command Line نوشته William E. Shotts

Related Articles

پاسخی بگذارید

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

Close