آموزشچگونه

آموزش خط فرمان: قسمت پنجاه و چهارم، پردازش متن (Text Processing)

Print Friendly, PDF & Email

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

در این درس و درس‌های بعدی برنامه‌های زیادی را به‌منظور پردازش متن بررسی خواهیم کرد.

این فرمان‌ها عبارت خواهند بود ازcat ، sort، uniq، cut، paste، join، comm، diff، patch،  tr، sed و aspell.

اپلیکیشن‌‌های متن

تا بدین‌جا  درباره برخی از ویرایشگرهای متن، مانند nano و vim آموختیم و به‌وسیله آن‌ها برخی فایل‌های پیکربندی را دستکاری کردیم و برخی از فرمان‌ها را اجرا نمودیم؛ اما اینجا پایان کار نیست. موارد زیاد دیگری هستند که با متن ارتباط دارند.

اسناد (Documents)

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

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

صفحات وب (Web Pages)

رایج‌ترین نوع اسناد الکترونیک، صفحات وب هستند. صفحات وب اسناد متنی هستند که به‌وسیله استانداردهای HTML و یا XML نوشته شده‌اند که زبان‌های نشانه‌گذاری برای توصیف فرمت صفحات وب هستند. همچنین از اسنادی با فرمت CSS می‌توان به‌منظور تغییر ظاهر این صفحات و نمایش تصویری آن‌ها استفاده کرد که این اسناد نیز متنی هستند.

ایمیل

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

خروجی پرینتر

در سیستم‌های یونیکس‌محور، خروجی که به یک پرینتر ارسال می‌گرد، به‌صورت متن ساده ارسال می‌گردد و یا اگر صفحه دارای محتوای گرافیکی باشد، محتوای گرافیکی تبدیل به متن (با فرمت متنی تحت عنوان PostScript) شده و سپس به برنامه‌ای که نقاط گرافیکی را برای چاپ ایجاد می‌کند، ارسال می‌شود.

کد منبع (Source Code) برنامه‌ها

بسیاری از برنامه‌های خط فرمان که در سیستم‌های یونیکس وجود دارند، از این جهت ایجاد شده‌اند تا مدیریت سیستم و توسعه نرم‌افزار را پشتیبانی کنند و برنامه‌های پردازش متن نیز مستثنی نیستند.

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

فرمان cat (الحاق فایل‌ها و چاپ آن‌ها در خروجی استاندارد)

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

رایج‌ترین آن‌ها کاراکترهای tab (بر خلاف فاصله‌ها) و کاراکتر Return هستند. موقعیت رایجی دیگر، فایلی است که حاوی خطوط متن با فاصله‌های دنباله‌دار می‌باشد.

حال، یک فایل آزمایشی را با استفده از cat (به‌عنوان یم پردازشگر ابتدایی متن) ایجاد می‌کنیم. بدین منظور، فرمان cat را (در ادامه فایلی که خروجی را به درون آن می‌ریزیم) وارد می‌کنیم و سپس متن دلخواه خود را وارد کرده و در آخر متن، کلید Enter را فشرده تا خط به‌صورت صحیح پایان یابد. سپس برای این‌که به cat بفهمانیم که فایل به پایان رسیده Ctrl+D را فشار می‌دهیم. در این مثال، ما یک کاراکتر tab در ابتدای متن به‌همراه تعدادی فاصله وارد کردیم.

سپس با استفاده از فرمان cat به همراه گزینه –A به‌منظور نمایش متن استفاده می‌کنیم:

همان‌طور که می‌بینیم، کاراکتر tab در متن مربوطه با استفاده از علامت ^I ارایه می‌شود. علاوه بر آن، می‌بینیم که علامت $ در پایان متن نمایان می‌شود، که دلیل آن، فشردن Enter است و بیانگر این است که خط به پایان رسیده و فاصاه انتهایی وجود دارد.

علاوه بر این، فرمان cat، دارای گزینه‌هایی برای تغییر متن نیز می‌باشد. دو مورد از برجسته‌ترین آن‌ها –n و –s هستند. گزینه –n خطوط را شماره‌گذاری می‌کند و گزینه –s مانع از خروج چندین خط خالی می‌شود. می‌توانیم به شیوه زیر آن را نمایش دهیم:

در این مثال، همان‌گونه که مشاهده می‌کنید، نسخه جدیدی از فایل foo.txt ایجاد کردیم که در بین خطوط آن، بیش از یک فاصله وجود دارد. سپس با استفاده از گزینه‌های –n و –s خطوط را شماره‌گذاری و فاصله‌های اضافی آن‌ها را برای نمایش، حذف نمودیم.

فرمان sort (به‌منظور مرتب‌سازی خطوط فایل‌های متنی)

فرمان sort محتوای ورودی استاندارد یا یکی از فایل‌هایی که در خط فرمان اختصاص یافته را مرتب می‌کند و نتایج را به استاندارد خروجی ارسال می‌نماید. با استفاده از همان تکنیکی که در فرمان cat استفاده کردیم، می‌توانیم پردازش ورودی استاندارد را به‌صورت مستقیم از صفحه‌کلید نشان دهیم:

مثال، گویای مطلب است. ابتدا فایل جدید foo.txt را با محتوای به‌هم ریخته خروف ایجاد کردیم. سپس با استفاده از فرمان cat نمایش عادی آن را نشان دادیم و در نهایت با استفاده از فرمان sort آن را به‌صورت مرتب شده نشان دادیم.

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

برای مثال اگر سه فایل متنی به‌صورت زیر داشته باشیم، می‌توانیم آن را به این‌گونه ادغام کنیم:

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

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

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

با استفاده از گزینه‌های –nr یک ترتیب عددی برعکس ایجاد می‌کنیم. بدین صورت که بزرگ‌ترین مقادیر در ابتدا نمایش داده می‌شوند. ولی اگر بخواهیم لیستی را بر اساس برخی مقادی پیدا شده درون خطوط مرتب کنیم، چه باید کرد؟

به‌عنوان مثال، نتیج به‌دست آمده از فرمان ls –l به‌صورت زیر است:

می‌توانیم با استفاده از sort این لیست را براساس اندازه فایل نیز مرتب کنیم (هر چند این کار با خود فرمان ls هم قابل انجام است):

بسیاری از استفاده‌های فرمان sort مستلزم پردازش داده‌های جدولی، مثل نتایج به‌دست آمده از فرمان ls در بالا است. اگر از واژگان پایگاه‌داده برای جدول بالا استفاده کنیم، می‌توانیم بگوییم که هر سطر یک رکورد است و هر رکورد شامل چندین فیلد (مانند مشخصه‌های فایل، تعداد لینک‌ها، اندازه فایل و …). اکنون فرمان sort قادر خواهد بود تا هر کدام از این فیلدها را پردازش کند.

در اصطلاح پایگاه‌داده، ما قادر هستیم که یک یا چند فیلد کلیدی را به‌منظور استفاده برای کلیدهای مرتب‌سازی تعیین کنیم. در مثال بالا، گزینه‌های –n و –r را به‌منظور مرتب‌سازی عددی برعکس اختصاص دادیم و با استفاده از –k 5 باعث شدیم که sort از پنج فیلد به‌عنوان کلیدی برای مرتب‌سازی استفاده کند.

گزینه –k بسیار جالب است و ویژگی‌های زیادی دارد، ولی ابتدا نیاز داریم ببینیم که sort چگونه فیلدها را تعریف می‌کند. فرض کنید یک فایل متنی ساده را که از یک خط که دارای نام نویسنده است، تشکیل شده است:

به‌طور پیش‌فرض، فرمان sort این خط را به این نحو می‌بیند که دو فیلد وجود دارد؛ اولین فیلد، حاوی کاراکترهای William و دومین فیلد حاوی کاراکترهای Shotts می‌باشد (توجه داشته باشید که فاصله میان آن‌ها نیز جز فیلد دوم است).

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

برای تمرین‌های بعدی، فایلی را ایجاد می‌کنیم که تاریخچه توزیع‌های رایج لینوکس را بین سال‌های ۲۰۰۶ تا ۲۰۰۸ نشان می‌دهد. هر خط دارای سه فیلد است: فیلد نام توزیع، فیلد شماره نسخه و فیلد تاریخ انتشار؛ که آن را به‌صورت زیر ایجاد خواهیم کرد:

سپس با استفاده از فرمان sort آن را مرتب می‌کنیم:

تقریبا کارد کرد! مشکل در مرتب کردن شماره نسخه فدورا است. از آن‌جایی که عدد ۱ در مجموعه کاراکترها، قبل از اعداد ۶ و ۷ و ۸ می‌آید؛ در نتیجه شماره ۱۰ نیز که دارای عدد ۱ است، پیش از موارد دیگر خواهد آمد، در صورتی‌که می‌بایست در آخر همه، لیست شود.

برای حل چنین مشکلی باید چندیم کلمه را مرتب کنیم. درواقع ما می‌خواهیم یک مرتب‌سازی الفبایی را بر رو فیلد اول و سپس یک مرتب‌سازی عددی را بر روی فیلد دوم انجام دهیم. فرمان sort به چندین نمونه از گزینه‌های –k اجازه کار می‌دهد. بنابراین چندین کلید sort را می‌توان اختصاص داد. در حقیقت ممکن است، یک کلید شامل محدوده‌ای از فیلدها باشد.

در ادامه مثالی از مرتب‌سازی با چندین کلید را مشاهده می‌کنید:

با وجود این‌که ما به دلیل روشن‌تر شدن مطلب از فرم طولانی گزینه –key استفاده کردیم، اما گزینه‌های -k 1,1 -k 2n نیز دقیقا همان کار را انجام می‌دهند.

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

در نمونه دوم از کلید، می‌خواهیم مرتب‌سازی عددی انجام شود. بنابراین گزینه –n را اضاف نمودیم که به معنای مرتب‌سازی عددی است. همان‌طور که می‌بینید، به‌جای –n مقدار ۲n را با گزینه ادغام کردیم.

فیلد سوم در لیست ما، حاوی تاریخ در فرمتی نامناسب برای مرتب‌سازی است. در کامپیوترها، تاریخ‌ها معمولا با فرمت YYYY-MM-DD قرار می‌گیرند تا مرتب‌سازی تقویمی آسان شود. حال چگونه این نوع فرمت (یعنی YYYY-MM-DD) مرتب شود؟

خوشبختانه فرمان sort راهی برای مرتب‌سازی فراهم می‌کند. گزینه key به مشخصه‌های فیلدها این اجازه را می‌دهد تا فیلدها را درون فیلدها تعریف کنیم:

با اختصاص -k 3.7 به فرمان sort از کلید مرتب‌سازی استفاده می‌شود که در کاراکتر هفتم درون فیلد سوم شروع شود که برای ما سال را نشان خواهد داد.

همینطور -k 3.1 و -k 3.4 ماه و روز را جدا کرده و مرتب می‌کند. علاوه بر آن، گزینه‌های –n و –r را اضافه کردیم تا مرتب‌سازی عددی به‌صورت معکوس انجام شود. گزینه –b نیز به‌منظور سرکوب کردن فاصله‌های آغازین اضافه شده است.

برخی از فایل‌ها از Tabها و فاصله‌ها، به‌منظور جداکننده استفاده نمی‌کنند. به‌عنوان مثال /etc/passwd را مشاهده کنید:

فیلدها در این فایل، با استفاده از کاراکتر (:) از هم جدا شده‌اند. بنابراین چگونه می‌توانیم این فایل‌ها را با استفاده از فیلد کلید جدا کنیم؟ فرمان sort گزینه –t را برای ما به ارمغان آورده تا از طریق آن بتوانیم کاراکتر جداکننده فیلدها را تعریف کنیم. برای مرتب‌سازی فایل passwd در فیلد هفتم، به‌صورت زیر عمل خواهیم کرد:

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

Related Articles

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

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

Close