دستور awk یکی از ابزارهای قدرتمند پردازش متن در لینوکس است که با استفاده از الگوها، شرایط و اعمال مشخص، فایلها را فیلتر و دستکاری میکند. این دستور کاربردهای متنوعی دارد و امکان استخراج دادههای خاص از لاگها، فایلهای پیکربندی یا هر فایل متنی دیگر را ساده میکند.
در ادامه چند روش متداول برای فیلتر کردن متن با استفاده از awk معرفی میشود، از جستوجوی عبارات منظم تا انتخاب خطها، فیلتر عددی و بیشتر.
۱. جستوجوی متن با استفاده از عبارات منظم (Regex)
عبارات منظم ابزار قدرتمندی برای جستوجوی الگوهای ساده و پیچیده هستند و با awk میتوان آنها را روی فایلهای متنی در کسری از ثانیه اجرا کرد.
دستور پایه به این شکل است:
awk '/pattern/ {print}' filename
بهعنوان مثال، برای چاپ تمام خطوطی که شامل کلمه error هستند:
awk '/error/ {print}' syslog.log
همچنین میتوان خطوطی را پیدا کرد که با INFO یا WARN شروع میشوند:
awk '/^(INFO|WARN)/ {print}' syslog.log
با استفاده از عملگر ~ نیز میتوان فیلتر دقیقتری روی فیلدها انجام داد، مثلاً جستوجوی کلمه ERROR فقط در فیلد سوم:
awk '$3 ~ /ERROR/ {print}' system.log
در صورت نیاز به جستوجوی بدون حساسیت به حروف بزرگ و کوچک میتوان از تابع tolower() استفاده کرد:
awk 'tolower($0) ~ /error/ {print}' mixed_case.log
۲. انتخاب خطوط بر اساس شماره خط، طول، تعداد فیلد یا آخرین فیلد
awk دارای متغیرهای داخلی مانند NR (شماره خط)، NF (تعداد فیلدها)، $NF (آخرین فیلد) و تابع length() است.
نمایش ۱۰ خط اول:
awk 'NR <= 10 {print}' largefile.txt
نمایش خطوط زوج:
awk 'NR % 2 == 0 {print}' file.txt
نمایش خطوطی با طول بیشتر از ۸۰ کاراکتر:
awk 'length($0) > 80 {print}' code.py
نمایش فقط خطوطی که ۵ فیلد دارند (مثلاً در CSV):
awk 'NF == 5 {print}' customer_data.csv
نمایش خطوطی که آخرین فیلد آنها COMPLETED باشد:
awk '$NF == "COMPLETED" {print}' task_list.txt
۳. مقایسه و فیلتر مقادیر عددی
awk مقادیر عددی را تشخیص میدهد و امکان مقایسه مستقیم فراهم میشود.
نمایش دانشآموزانی که نمره آنها بالای ۸۰ است:
awk -F, '$2 > 80 {print $1, $2}' scores.csv
حذف علامت درصد از فیلد چهارم و بررسی مقادیر بالای ۷۵:
awk '{gsub(/%/, "", $4); if($4 > 75) print}' performance.txt
نمایش رکوردهایی که مقدار ستون سوم آنها بین ۵۰۰ تا ۲۰۰۰ است:
awk -F, '$3 > 500 && $3 < 2000 {print}' sales.csv
نمایش حسابهایی که وضعیت آنها ACTIVE یا PENDING است و بالانس بالای ۱۰۰۰ دارند:
awk -F, '($2 == "ACTIVE" || $2 == "PENDING") && $3 > 1000' accounts.csv
۴. گرفتن محدودهای از خطوط بین دو الگوی مشخص
awk میتواند خطوط بین دو الگو را چاپ کند:
awk '/start_pattern/,/end_pattern/' filename
برای حذف خطوط حاوی الگوهای شروع و پایان و نمایش فقط محتوای بین آنها:
awk '/BEGIN/{flag=1; next} /END/{flag=0} flag' logfile.txt
یا چاپ بلاکهای خطا تا خط خالی بعدی:
awk '/ERROR:/,/^$/ {print}' application.log
۵. حذف دادههای ناخواسته یا تکراری
برای حذف خطوطی که شامل DEBUG هستند:
awk '!/DEBUG/' application.log
برای حذف خطوط خالی یا کامنتها (شروعشده با #):
awk '!/^#/ && NF > 0 {print}' config.ini
برای حذف رکوردهای تکراری بر اساس فیلد سوم (ایمیل):
awk '!seen[$3]++ {print}' contact_list.csv
۶. بازچینی و قالببندی مجدد متن
برای انتخاب فقط ستون دوم و پنجم در یک CSV:
awk -F, '{print $2, $5}' sales.csv
برای تغییر جداکننده خروجی به |:
awk '{print $1 "|" $3}' data.txt
برای چاپ ایمیل و سپس نام، با حذف ردیف هدر:
awk -F, 'NR > 1 {print $3, "->", $1, $2}' contacts.csv
اضافه کردن هدر سفارشی در خروجی:
awk 'BEGIN {print "Name,Email"} {print $1 "," $2}' data.txt
دستور awk در پردازش متن ساختاریافته فوقالعاده قدرتمند است. هرچه الگوی دادهها منظمتر باشد، خروجی دقیقتر و کارآمدتر خواهد بود. ترکیب این فیلترها با ابزارهای دیگر لینوکس از طریق pipe میتواند جریانهای پردازش متن بسیار قدرتمند و انعطافپذیری ایجاد کند.















