منبع اصلی نوشتار زیر در این لینک قرار دارد

چگونه در شل اسکریپت یک فایل را خط به خط بخوانیم

یکی از رایجترین موارد در اسکریپت نویسی شل، خواندن خط به خط فایل و پرادزش محتوای آن است.خطوط هر فایلی شامل ستون هایی هستند که با یک یا چند فاصله ازهم جدا شده اند. توسط دو روش رایج ارایه شده در این مطلب چگونگی خواندن فایل و ذخیره یک یا چند ستون آن در یک یا چند متغیر و سپس پردازش لازم بر روی متغیر (های) ایجاد شده گفته خواهد شد. بطور مثال می خواهید لیست کاربران به همراه شناسه و دایرکتوری خانگی آنها را لیست کنید، برای این کار باید فایل etc/passwd/ را پردازش کرد. این فایل شامل 7 ستون که با : از هم جدا شده اند. نخست باید جدا کننده میان ستون ها را مشخص کنیم. در لینوکس متغیری به نام IFS است که جدا کننده را مشخص می کند و بطور پیشفرض شامل فضای خالی یا Space است.پس لازم است مقدار IFS را برابر : قرار دهیم. با دستور wc -l باید تعداد خطوط هر فایل را در متغیری ذخیره کنیم چون باید آنرا در حلقه for یا while برای مشخص کردن حد نهایی حلقه استفاده کنیم. با استفاده از حلقه فایل ها را خط به خط می خوانیم و ستون (های) مورد نظر را در متغیر ها ذخیره می کنیم. توجه داشته باشید استفاده بی مورد از متغیر ها باعث کند شدن اجرا می شود. پس تنها باید آن ستون هایی را که لازم داریم در متغیر ذخیره کنیم، چون هر متغیر در زمان ایجاد باید بخشی از حافظه را ذخیره کند که ایجاد زیاد متغیر باعث کند شدن پردازنده و مصرف بیش از حد حافظه می شود. (با استفاده از دو روش زیر هر خط فایل و هر ستون را می خوانیم ولی تنها آنهایی که لازم است را در متغیر ذخیره می کنیم.)

روش نخست موسوم به PIPED while-read loop

در این روش با استفاده از دستوری مانند cat محتوای فایل را خوانده و آنرا به حلقه while read ارسال می کنیم. در جلوی حلقه معادل با هر ستون یک متغیر تعریف می کنیم، دستور دستور read خط به خط فایل را خوانده و هر متغیر را با مقدار ستون معادل در هر خط مقدار دهی می کند. روند خواندن و مقدار دهی هر خط توسط حلقه while و تا زمانی که خطی برای خواندن وجود داشته باشد ادامه می یابد. زمانی که آخرین خط خوانده و پردازش شد، حلقه while اتمام می رسد.

در مثال زیر در خطوط 1 و 2، دو متغیر را که به ترتیب نام و مسیر فایل مورد نظر، و مقدار شمارنده را نگه می دارند. از متغیر COUNT برای ایجاد ردیف استفاده می کینم (یعنی به هر خط عددی انتساب می دهیم). در دستور سوم مطابق آنچه که گفته شد فایل را خوانده و آنرا به while read، ارسال می کنیم. دستور پنجم نیز متغیر ها را چاپ می کند. دستور چهارم نیز یک واحد به COUNT اضافه می کند.

اما اسکریپ بالا یک مشکل دارند و آن اینکه به دلیل مشخص نکردن کاراکتر جدا کننده در فایل توسط متغیر IFS تنها اولین متغیر مقدار دهی می شود (معادل با هر خط) و متغیر های بعدی خالی می مانند. IFS شامل کاراکتر جدا کننده که بطور پیش فرض Space یا Tab (فضای خالی) است. اگر فایلی جدا ککنده آن فضای خالی بود نیازی به مشخض کردن این متغیر در اسکریپت نیست. کد درست و کامل در شکل زیر آمده است که در آن IFS به مقدار : مشخص شده است.

روش دوم موسوم به Redirected “while-read” loop

این روش مشابه روش قبلی با این تفاوت که بجای خواندن فایل توسط دستور cat و ارسال آن به while read، فایل را بطور مستقیم توسط Redirect کردن آن به حلقه while و خواندن خط به خط توسط read و مقدار دهی متغیر های مربوطه، انجام می شود. Redirect کردن هم به این معنی که توسط نماد > خود حلقه while بطور مستقیم ورودی اش را از فایل می خواند. شرط پایان حلقه مانند روش قبل، خواندن آخرین خط از فایل است. شکل زیر ماشبه دستور اسکریپت بالا، اما با استفاده از روش دوم.



برچسب ها : , , , , , , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد