awk یک ابزار قدرتمند برای پردازش متن است که برای دستکاری دادهها و تولید گزارشهای فرمتبندی شده استفاده میشود.
این ابزار بهویژه برای استخراج اطلاعات خاص از فایلهای متنی، انجام محاسبات و تبدیل دادهها به فرمتهای مورد نظر مفید است.
awk در لینوکس:
awk [options] 'selection_criteria {action}' input-file > output-file
گزینههای awk:
– action: کدی که هنگام تطابق الگو اجرا میشود و در براکتهای {} قرار دارد.
– input_file: فایلی که باید پردازش شود.
– -f program-file: مشخص میکند که فایل حاوی کد برنامه AWK کدام است. این گزینه اجازه میدهد تا اسکریپتهای پیچیدهتر ذخیره و دوباره استفاده شوند.
– -F fs: جداکننده فیلد را به fs تنظیم میکند. بهطور پیشفرض، کاراکترهای فضای خالی به عنوان جداکننده فیلد استفاده میشوند. این گزینه امکان سفارشیسازی نحوه تقسیم دادههای ورودی به فیلدها را فراهم میکند.
مقدمات استفاده از دستور awk در لینوکس:
برای اینکه مثالهای آموزشی awk در لینوکس به درستی کار کنند، موارد زیر را فراهم کنید:
– یک سرور مجازی لینوکسی با توزیع سازگار (مانند اوبونتو، دبیان، سنتاواس).
– یک کاربر غیر ریشه با مجوزهای sudo.
مثالهای عملی از دستور awk در لینوکس:
توانایی دستور awk در مدیریت الگوها، فیلدها و رکوردها با دقت، آن را برای وظایفی از استخراج ساده دادهها تا تولید گزارشهای پیچیده بینظیر میکند.
۱. چاپ تمام خطوط:
awk '{ print }' data.txt
– این دستور تمام خطوط فایل data.txt را چاپ میکند.
۲. چاپ فیلدهای خاص:
awk '{ print $2, $4 }' data.txt
– این دستور فیلدهای دوم و چهارم هر خط را چاپ میکند.
۳. اضافه کردن یک سرصفحه:
awk 'BEGIN { print "Name Age City" } { print $1, $2, $3 }' data.txt
– این دستور یک سرصفحه ایجاد کرده و سپس سه فیلد اول هر خط را چاپ میکند.
۴. انجام محاسبات:
awk '{ sum += $3 } END { print "Total:", sum }' data.txt
– این دستور مجموع مقادیر موجود در فیلد سوم را محاسبه و چاپ میکند.
۵. چاپ شرطی:
awk '$3 > 30 { print $1, "is older than 30" }' data.txt
– این دستور خطوطی را که فیلد سوم آنها بزرگتر از ۳۰ است، فیلتر کرده و چاپ میکند.
۶. شمارش خطوط
awk 'END { print NR }' sample.txt
این دستور بهطور مؤثر تعداد کل خطوط فایل مشخصشده را شمارش کرده و نتیجه را نمایش میدهد.
توضیح:
– دستور awk با اسکریپت مشخصشده اجرا میشود.
– اسکریپت فایل sample.txt را خط به خط پردازش میکند.
– پس از پردازش تمام خطوط، بلوک END فعال میشود.
– درون بلوک END، مقدار NR که اکنون تعداد کل خطوط فایل را نگهداری میکند، چاپ میشود.
در حالی که بلوک END معمولاً برای این منظور استفاده میشود، شما همچنین میتوانید یک شمارنده را درون بلوک اصلی پردازش به کار ببرید:
awk '{ count++ } END { print count }' sample.txt
این روش شامل افزایش یک شمارنده برای هر خط و سپس چاپ شمارش نهایی در بلوک END است.
۷. یافتن الگوهای خاص
awk '/fruit/' fruits.txt
تواناییهای تطبیق الگوی awk قدرتمند است و اجازه جستجوهای پیچیده با استفاده از عبارات منظم را میدهد.
توضیح:
– این دستور awk بهطور مؤثر کلمه “fruit” را در فایل متنی به نام “fruits.txt” جستجو میکند. هر خطی که شامل کلمه “fruit” باشد، در کنسول چاپ خواهد شد.
– سادگی این دستور آن را به ابزاری چندمنظوره برای یافتن سریع متن خاص در فایلها تبدیل کرده است.
– `awk`: فراخوانی ابزار خط فرمان awk.
– `/fruit/`: این یک الگوی عبارت منظم است که در براکتهای مایل قرار دارد. مشخص میکند که ما به دنبال کلمه دقیق “fruit” هستیم.
– `fruits.txt`: نام فایل ورودی که باید پردازش شود.
۸. تطبیق ابتدای یک خط
awk '/^animal/' creatures.txt
توضیح:
– این دستور awk برای شناسایی و چاپ خطوطی از فایل “creatures.txt” طراحی شده است که با کلمه “animal” شروع میشوند.
– `awk`: فراخوانی ابزار خط فرمان awk.
– `/^animal/`: این یک الگوی عبارت منظم است که در براکتهای مایل قرار دارد.
– نماد caret (^) ابتدای یک خط را تطبیق میدهد.
– `animal` متن دقیقی است که بلافاصله پس از شروع خط باید پیدا شود.
– `creatures.txt`: مشخصکننده فایل ورودی که باید پردازش شود.
۹. استخراج فیلدهای خاص
awk '/^color/ { print $2 }' item_list.txt
توضیح:
– این دستور awk برای استخراج فیلد دوم از خطوطی که با کلمه “color” شروع میشوند، طراحی شده است.
– `awk`: فراخوانی ابزار خط فرمان awk.
– `/^color/`: این یک الگوی عبارت منظم است که خطوطی را که با کلمه “color” شروع میشوند، تطبیق میدهد.
– `{ print $2 }`: این بلوک عمل مشخص میکند که اگر الگو تطبیق یابد، فیلد دوم ($۲) خط باید چاپ شود.
– `item_list.txt`: مشخصکننده فایل ورودی که باید پردازش شود.
۱۰. ارسال خروجی دستور به awk
ls -l | awk '{ print $5 }'
توضیح:
این دستور نشاندهنده چگونگی ترکیب خروجی یک دستور شل (در اینجا، ls -l) با awk برای استخراج اطلاعات خاص است.
– `ls -l`: محتویات دایرکتوری فعلی را در فرمت طولانی لیست کرده و جزئیاتی درباره فایلها و دایرکتوریها، از جمله اندازه فایل، ارائه میدهد.
– `|`: کاراکتر لوله خروجی ls -l را به عنوان ورودی به دستور awk ارسال میکند.
– `awk ‘{ print $5 }’`: این اسکریپت awk ورودی را خط به خط پردازش میکند:
– `{ print $5 }`: فیلد پنجم هر خط ورودی را چاپ میکند که معادل اندازه فایل در خروجی استاندارد ls -l است.
۱۱. استفاده از اسکریپتهای خارجی awk
awk -f process_data.awk employee_data.txt
توضیح:
دستور اسکریپتنویسی awk نشاندهنده چگونگی اجرای یک اسکریپت awk ذخیرهشده در یک فایل جداگانه است.
– `awk`: فراخوانی ابزار خط فرمان awk.
– `-f process_data.awk`: مشخص میکند که برنامه awk باید از فایلی به نام process_data.awk خوانده شود.
– `employee_data.txt`: نشاندهنده فایل ورودی که باید پردازش شود.
۱۲. حذف خطوط خالی
awk 'NF > 0' data_file.txt
توضیح:
این دستور awk بهطور مؤثر خطوط خالی را از یک فایل متنی حذف میکند.
– `awk`: فراخوانی ابزار خط فرمان awk.
– `NF > 0`: این یک شرط است که بررسی میکند آیا تعداد فیلدها (NF) در رکورد فعلی بیشتر از صفر است یا خیر.
– `data_file.txt`: مشخصکننده فایل ورودی که باید پردازش شود.
متغیر NF یک متغیر داخلی در awk است که نمایانگر تعداد فیلدها در یک رکورد است. با استفاده از شرط NF > 0، ما خطوط بدون محتوا را فیلتر میکنیم.
این همه! حالا شما مهارتهای لازم برای استفاده از دستورات مختلف awk مانند چاپ تمام خطوط، چاپ ستونهای خاص، محاسبه مجموع، شمارش خطوط، تطبیق الگوها و عبارات منظم را دارید.
چگونه دستور awk در لینوکس کار میکند؟
awk ورودی را خط به خط اسکن میکند و الگوها را برای اجرای اقدامات مربوطه تطبیق میدهد. این اقدامات میتوانند شامل چاپ، محاسبات، دستکاری رشتهها و موارد دیگر باشند.
بهطور کلی، awk راهی انعطافپذیر برای استخراج، تبدیل و تحلیل دادهها از فایلهای متنی فراهم میکند.
مفاهیم اصلی در دستور awk در لینوکس
فیلدها
awk بهطور پیشفرض هر خط ورودی را با استفاده از فضای خالی به فیلدها تقسیم میکند. فیلدها از شماره ۱ شروع میشوند. $۰ به کل خط اشاره دارد.
متغیرهای داخلی
– **FS:** جداکننده فیلد (پیشفرض فضای خالی).
– **RS:** جداکننده رکورد (پیشفرض خط جدید).
– **OFS:** جداکننده فیلد خروجی (پیشفرض فضای خالی).
– **ORS:** جداکننده رکورد خروجی (پیشفرض خط جدید).
– **NF:** تعداد فیلدها در رکورد فعلی.
– **NR:** تعداد رکوردهای پردازششده تا کنون.
اقدامات
– **print:** چاپ عبارات مشخصشده.
– **عملگرهای حسابی:** +، -، *، /، %.
– **عملگرهای مقایسه:** ==، !=، <، >، <=، >=.
– **بیانیههای شرطی:** if، else.
– **حلقهها:** for، while.
– **توابع:** توابع تعریفشده توسط کاربر میتوانند ایجاد شوند.
چگونه از متغیرهای داخلی در دستور awk استفاده کنیم؟
دستور زیر استفاده از متغیرهای داخلی برای فرمتدهی و چاپ دادهها از یک فایل متنی را نشان میدهد:
awk '{ printf "%d - %s\n", NR, $2 }' flowers.txt
متغیرهای داخلی مانند NR اطلاعات ارزشمندی درباره دادههای پردازششده ارائه میدهند. تابع printf کنترل دقیقی بر فرمت خروجی ارائه میدهد.
چگونه اقدامات را در دستور awk در لینوکس ترکیب کنیم؟
برای ترکیب شرایط برای فیلتر کردن پیچیده:
awk '$1 == "red" && length($2) > 3 { print }' color_list.txt
این دستور awk نحوه ترکیب چندین شرط برای فیلتر کردن دادهها را بهطور مؤثر نشان میدهد.
توضیح:
– `awk`: فراخوانی ابزار خط فرمان awk.
– `$۱ == “red” && length($2) > 3`: این یک شرط ترکیبی است:
– `$۱ == “red”`: بررسی میکند که آیا فیلد اول دقیقاً “red” است.
– `&&`: عملگر منطقی AND که نیاز دارد هر دو شرط درست باشند.
– `length($2) > 3`: بررسی میکند که آیا طول فیلد دوم بیشتر از ۳ کاراکتر است.
– `{ print }`: اگر هر دو شرط برقرار باشد، کل خط چاپ میشود.
– `color_list.txt`: مشخصکننده فایل ورودی که باید پردازش شود.
توابع و نحو خاص awk چیست؟
توابع داخلی: length، substr، split، tolower، toupper، sprintf، match، sub، gsub و غیره.
**عملگرهای حسابی:** +، -، *، /، %
**عملگرهای مقایسه:** ==، !=، <، >، <=، >=
**عملگرهای منطقی:** &&، ||، !
**بیانیههای کنترل جریان:** if، else، while، for، break، continue
**عبارات منظم:** برای تطبیق الگوها درون فیلدها یا کل خطوط استفاده میشود.
موارد استفاده واقعی از دستور awk چیست؟
– **تحلیل لاگ:** استخراج اطلاعات خاص از فایلهای لاگ مانند پیامهای خطا یا آدرسهای IP.
– **پاکسازی دادهها:** حذف تکراریها یا استانداردسازی فرمتها.
– **تولید گزارش:** ایجاد گزارشهای خلاصه یا تحلیلهای آماری.
– **مدیریت CSV:** پردازش فایلهای CSV یا استخراج دادهها.
– **پردازش متن:** انجام وظایفی مانند شمارش کلمات یا جستجوی الگوها در فایلهای متنی.
موارد استفاده رایج از دستور awk در لینوکس چیست؟
– استخراج دادهها از فایلهای لاگ.
– تولید گزارشها.
– پاکسازی و تبدیل دادهها.
– تجزیه CSV یا سایر دادههای ساختاریافته.
– ایجاد فیلترهای متنی سفارشی.
چگونه از دستور awk برای یافتن تکراریها در یک فایل استفاده کنیم؟
میتوانید از awk برای یافتن تکراریها با ایجاد یک آرایه انجمنی استفاده کنید:
awk '!a[$0]++ { print $0 }' input_file
به عنوان مثال:
فرض کنید فایلی به نام data.txt با محتوای زیر دارید:
apple
banana
apple
orange
banana
بنابراین دستور بالا خروجی زیر را چاپ خواهد کرد:
apple
banana
orange
این روش برای یافتن تکراریها بر اساس کل خطوط مؤثر است.
نتیجهگیری
مثالهای توضیح دادهشده در این راهنما به شما کمک میکند تا دستور awk را در لینوکس بهعنوان یکی از دستورات لینوکس تسلط پیدا کنید و مهارتی ارزشمند برای خودکارسازی وظایف، تحلیل دادهها و بهینهسازی روند کار خود در محیط لینوکس کسب کنید.