خط فرمانگنو/لینوکس

فرمت خروجی

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

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

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

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

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

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

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

نشانه‌گذاریمفهوم
\:\:\:شروع عنوان logical-page
\:\:شروع بدنه logical-page
\:شروع فوتر logical-page

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

گزینهمعنا
-b styleتعیین شماره‌گذاری بدنه به استایل در حالیکه style یکی از موارد زیر است:
a شماره همه خطوط
t شماره فقط خطوط خالی. این گزینه پیشفرض است
pregexp شماره فقط خطوط منطبق با عبارت منظم regexp
-f styleتعیین شماره‌گذاری فوتر به style. پیشفرض n هست (هیچ‌کدام).
-h styleتعیین شماره‌گذاری هدر به style. پیشفرض n هست (هیچ‌کدام).
-i numberتعیین شماره‌گذاری صفحه افزایشی به شماره. پیشفرض 1 هست (هیچ‌کدام).
-n formatتعیین شماره‌گذاری فرمت به format در حالیکه format یکی از موارد زیر است:
ln چپ بدون صفر پیشین
rn راست بدون صفر پیشین. این مقدار پیشفرض است.
rz راست به همراه صفر پیشین
-pشماره‌گذاری صفحه را در ابتدای هر صفحه منطقی از ابتدا آغاز نکن.
-s stringاضافه کردن string به آخر هر شماره خط برای ایجاد جداکننده. پیشفرض یک کاراکتر تب می‌باشد.
-v numberتنظیم شماره خط اول از هر صفحه منطقی به number. پیشفرض 1 است.
-w widthتعیین طول فیلد شماره خط به width. پیشفرض 6 است.

مسلما خیلی خطوط را شماره‌گذاری نخواهیم کرد ولی می‌توانیم از فرمان 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 را نشان می‌دهد:

گزینهتوضیحات
-cپردازش در crown margin mode. این گزینه فرورفتگی دو خط اول پاراگراف را حفظ می‌کند. خطوط بعدی با فرورفتگی خط دوم تراز می‌شوند.
-p stringفرمت‌دهی فقط خطوطی که با string پیشوند شده‌اند. پس از فرمت‌دهی، محتویات string با هر خط از قبل فرمت‌دهی شده پیشوند می‌شوند. این گزینه را می‌توان برای فرمت‌دهی متن در ککامنت‌های کد منبع استفاده کرد. برای مثال هر زبان برنامه‌نویسی یا فایل پیکربندی که از کاراکتر # برای معین کردن یک کامنت استفاده می‌کند می‌تواند با تعیین -p '#' فرمت‌دهی تا کامنت‌ها فرمت‌دهی شوند.
-sSplit-only mode. در این مود، فقط به منظور تناسب با طول ستون تقسیم می‌شوند. خطوط برای پر کردن فضا متصل نخواهند شد. این مود برای فرمت‌دهی متن‌های مثل code زمانی که اتصال رضایت‌بخش نیست مفید خواهد بود.
-uانجام uniform spacing. این گزینه فرمت‌دهی سنتی را به متن اعمال می‌کند. به این معنی که یک فاصله بین کلمات و دو فاصله بین جملات اضافه می‌کند.
-w widthفرمت‌دهی متن به منظور تناسب به طول کاراکترهای یک ستون. مقدار پیشفرض 75 کاراکتر می‌باشد.

گزینه –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 به‌منظور فرمت‌دهی داده رشته‌ای به‌کار گرفته می‌شود. مشخص‌کننده‌های دیگری برای انواع مختلف داده وجود دارد که در جدول زیر، قابل مشاهده هستند:

مشخص‌کنندهتوضیحات
dفرمت یک شماره به عنوان یک شماره دسیمال صحیح
fفرمت‌دهی و خروجی یک شماره اعشاری
oفرمت یک عدد صحیح به عنوان یک عدد اوکتال
sفرمت یک رشته
xفرمت یک عدد صحیح به عنوان یک شماره هگزادسیمال با استفاده از حروف کوچک a-f
Xهمان x ولی استفاده از حروف بزرگ
%چاپ سمبول لیترال %

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

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

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

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

جزءتوضیحات
flagsپنج نوع فلگ یا همان پرچم مختلف وجود دارد:
# - استفاده از فرمت جایگزین برای خروجی. این بر اساس نوع داده متفاوت است.
صفر - لایه‌گذاری خروجی با صفر. به این معنا که فیلد با صفرهای اولیه پر می‌شود.
- (dash) - تراز به چپ خروجی. بصورت پیشفرض printf خروجی را تراز به راست می‌کند.
space - ایجاد یک فاصله پیشین برای شماره‌های مثبت
+ - نشانه‌گذاری شماره‌های مثبت. بصورت پیشفرض printf فقط شماره‌های منفی را نشانه‌گذاری می‌کند.
widthیک شماره که طول حداقلی فیلد را تعیین می‌کند.
.precisionبرای شماره‌های اعشاری، شماره رقم اعشار را در خروجی بعد از نقطه دسیمال مشخص می‌کند.

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

آرگومانفرمتنتیجهتوضیح
380"%d"380فرمت ساده یک عدد صحیح
380"%#x"0x17cعدد صحیح فرمت‌دهی شده به عنوان یک عدد هگزادسیمال با استفاده از فلگ جایگزین فرمت
380"%05d"00380عدد صحیح فرمت‌دهی شده با صفر پیشین و یک طول حداقلی پنج کاراکتری
380"%05.5f"380.00000عدد فرمت‌دهی شده به عنوان یک شماره اعشاری به همراه پنج رقم اعشاری
380"%010.5f"0380.00000افزایش طول کمینه فیلد به 10 که لایه‌گذاری را نمایان می‌کند
380"%+d"+380فلگ + یک عدد مثبت را نشانه‌گذاری می‌کند
380"%-d"380فلگ - فرمت‌دهی را به چپ تراز می‌کند.
abcdefghijk"%5s"abcedfghijkیک رشته که با طول کمینه فیلد فرمت‌دهی شده است
abcdefghijk"%.5s"abcdeبا اعمال اعشار به یک رشته باعث حذف آن می‌گردد

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

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

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

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

منبع: لینوکس‌سیزن نوشته فرشید نوتاش حقیقت

فرشید نوتاش حقیقت

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا