أمر awk هو أداة قوية لمعالجة النصوص في أنظمة Unix/Linux تقوم بمسح النصوص سطرًا بسطر، وتقسيمها إلى حقول، وتنفيذ قواعد نمطية لتصفية البيانات وتحويلها وتلخيصها.
يتميز هذا البرنامج بقدرته الفائقة على تنفيذ أوامر سريعة ومختصرة لتحليل السجلات وملفات CSV ومخرجات النظام، مما يجعله أداة أساسية لمهندسي DevOps ومهندسي موثوقية المواقع (SRE) ومعالجة البيانات عبر سطر الأوامر. إذا كنت تعمل على خوادم Linux أو manage عند نشر التعليمات البرمجية، يُعد تعلم أمر awk أحد أهم المهارات التي يمكنك اكتسابها.
يشرح هذا الدليل المبسط للمبتدئين برنامج awk خطوة بخطوة مع أمثلة عملية، بدءًا من الطباعة البسيطة وصولًا إلى تحليل السجلات في بيئات واقعية. ستتعلم أيضًا نصائح يستخدمها المحترفون يوميًا في بيئات الاستضافة والحوسبة السحابية.
ما هو أمر awk؟
awk عبارة عن نظام يعتمد على الأنماط لغة المعالجة متوفرة في معظم الأنظمة الشبيهة بنظام يونكس (لينكس، ماك أو إس، بي إس دي).

سميت هذه الأداة نسبةً إلى مبتكريها (آهو، واينبرغر، كيرنيغان)، وهي تقرأ المدخلات سطرًا سطرًا (سجلات)، وتقسم كل سطر إلى حقول، وتنفذ إجراءات عند تطابق الأنماط. إنها مثالية لاستخراج الأعمدة، وتصفية الصفوف، وحساب المجاميع، وإنشاء تقارير سريعة.
على عكس sed أو grep، فإن awk يفهم "الأعمدة" بشكل أصلي ويدعم المتغيرات والمصفوفات والشروط والوظائف بقوة كافية لاستبدال البرامج النصية الصغيرة مع الحفاظ على خفة الوزن والسرعة.
بناء جملة awk وأساسياته
بنية نمط العمل
في جوهرها، برامج awk قائمة بقواعد النمط { الإجراء }. يُنفّذ awk الإجراء فقط للأسطر التي يتطابق فيها النمط. في حال عدم وجود نمط، يُنفّذ الإجراء لجميع الأسطر. في حال عدم وجود إجراء، يكون الوضع الافتراضي هو طباعة الأسطر المطابقة.
awk 'pattern { action }' file
awk '{ print $0 }' file # print every line (default action shown explicitly)
awk '/error/' file # print lines matching regex "error"
الحقول والسجلات والفواصل
يقوم برنامج awk بتقسيم كل سطر (سجل) يمكن تقسيم الحقول باستخدام فاصل. افتراضيًا، يكون فاصل الحقول (FS) أي مسافة بيضاء. يمكن الوصول إلى الحقول كـ $1، $2، ...، والسطر بأكمله كـ $0. يمكنك تغيير FS باستخدام -F أو داخل كتلة BEGIN.
# space-separated
awk '{ print $1, $3 }' data.txt
# comma-separated (CSV-like)
awk -F, '{ print $1, $3 }' data.csv
# set output field separator for pretty printing
awk -F, 'BEGIN{ OFS="\t" } { print $1, $3 }' data.csv
متغيرات مدمجة مفيدة
الميزات المدمجة الشائعة التي ستستخدمها طوال الوقت:
- NR: رقم السجل (السطر) الحالي
- FNR: رقم السجل الحالي في الملف الحالي
- نف: عدد الحقول في السطر الحالي
- FS/OFS: فاصل حقول الإدخال/الإخراج
- RS/ORS: فاصل سجلات الإدخال/الإخراج
- $ 0: السطر بأكمله؛ $1..$NF: الحقول
# print line number and first field
awk '{ print NR, $1 }' file
# print last field of each line
awk '{ print $NF }' file
البدء: أمثلة أساسية على لغة awk
طباعة الأعمدة وإعادة ترتيبها
# Reorder fields 3 and 1; add a dash between
awk '{ print $3 "-" $1 }' access.log
# Print specific columns from top output (skip header)
top -b -n1 | awk 'NR>7 { print $1, $9, $12 }'
تصفية الصفوف حسب القيمة أو التعبير النمطي
# Lines where 3rd field equals "FAILED"
awk '$3=="FAILED"' audit.log
# Requests returning 500 status code in Nginx access log (status is $9 or $8 depending on format)
awk '$9==500' /var/log/nginx/access.log
# Regex match: case-insensitive search for "timeout"
awk 'tolower($0) ~ /timeout/' app.log
حساب المجاميع والمتوسطات والحد الأدنى/الأقصى
# Sum the 2nd column
awk '{ sum += $2 } END { print sum }' metrics.txt
# Average of column 4 (skip lines starting with #)
awk '$0 !~ /^#/ { n++; total += $4 } END { if (n>0) print total/n }' data.txt
# Track min and max
awk 'NR==1{min=max=$2} { if($2<min)min=$2; if($2>max)max=$2 } END{ print "min",min,"max",max }' stats.txt
حساب القيم الفريدة والتكرارات
تُسهّل المصفوفات الترابطية عملية التجميع.
# Count requests per IP (IP assumed to be $1)
awk '{ hits[$1]++ } END { for (ip in hits) print hits[ip], ip }' access.log | sort -nr | head
العمل مع ملفات CSV والفواصل المخصصة
لملفات CSV البسيطة (بدون فواصل بين علامتي اقتباس)يعمل الخيار -F. بالنسبة لملفات CSV الأكثر تعقيدًا، يمكن أن تساعد أداة FPAT في gawk على مطابقة الحقول كرموز بدلاً من تقسيمها باستخدام الفواصل.
# Basic CSV, print columns 1 and 3
awk -F, 'BEGIN{OFS=","} {print $1, $3}' users.csv
# gawk: handle commas inside quotes (basic FPAT pattern)
gawk 'BEGIN{ FPAT = "([^,]*)|(\"[^\"]+\")"; OFS="," } { print $1, $3 }' users.csv
استخدم كتل BEGIN و END
يتم تنفيذ الأمر BEGIN قبل قراءة المدخلات؛ يتم تشغيل الأمر END بعد معالجة جميع الأسطر، وهو مفيد للعناوين والملخصات وتعيين FS/OFS مرة واحدة.
awk 'BEGIN{ print "User,Count" } { c[$1]++ } END{ for (u in c) print u, c[u] }' log.txt
حالات استخدام عملية في العالم الحقيقي
تحليل سجلات خادم الويب (Apache/Nginx)
تستخدم فرق العمليات بشكل روتيني أداة awk لـ استكشاف أخطاء حركة البيانات والأداء والأمان وإصلاحها. تفترض الأمثلة استخدام تنسيق سجل موحد شائع؛ عدّل أرقام الحقول لتتوافق مع التنسيق الفعلي لديك.
# Top 10 IPs by request volume
awk '{ ip=$1; hits[ip]++ } END{ for(ip in hits) print hits[ip], ip }' access.log | sort -nr | head -10
# Top 10 requested URLs (path often $7)
awk '{ path=$7; c[path]++ } END{ for(p in c) print c[p], p }' access.log | sort -nr | head -10
# Status code distribution (status often $9)
awk '{ sc=$9; c[sc]++ } END{ for(s in c) print s, c[s] }' access.log | sort -k1,1
# Total bytes sent (bytes often $10)
awk '$10 ~ /^[0-9]+$/ { bytes += $10 } END { print "Total bytes:", bytes }' access.log
قم بتوجيه مخرجات awk إلى عملية الفرز، استخدم الأمر uniq، أو انتقل إلى قسم التقارير السريعة. يمكنك دمجه مع grep لتصفية التواريخ أو المضيفين الافتراضيين مسبقًا.
مراقبة مقاييس النظام والتطبيق
# CPU usage from mpstat: average user+system
mpstat 1 5 | awk '/Average/ { print "CPU %usr+%sys:", $3 + $5 }'
# Memory usage from /proc/meminfo
awk '/MemTotal/ {t=$2} /MemAvailable/ {a=$2} END{ printf "Mem Used: %.2f%%\n", (t-a)/t*100 }' /proc/meminfo
# Slow queries over 2s in application log (assuming duration is field 6 in seconds)
awk '$6+0 > 2 { print }' app.log
البيانات النظيفة وتحويلها
# Normalize case and trim extra spaces
awk '{ gsub(/^ +| +$/,""); $0=tolower($0); print }' raw.txt
# Replace delimiter: tabs to commas
awk 'BEGIN{ OFS=","; FS="\t" } { print $1,$2,$3 }' input.tsv > output.csv
دمج awk مع أدوات سطر الأوامر الأخرى
يتألق برنامج awk في خطوط الأنابيب. يُكمّل هذا البرنامج أدوات grep (للتصفية المسبقة)، وsort (للترتيب)، وuniq (لإزالة التكرارات)، وsed (لاستبدال النصوص). استخدم كل أداة في مجال تخصصها للحفاظ على أوامر قصيرة وسهلة القراءة.
تقنيات awk المتقدمة
التجميع والدمج حسب المفاتيح
# Revenue per customer (customer_id in $1, amount in $3)
awk -F, '{ rev[$1] += $3 } END { for (id in rev) printf "%s,%0.2f\n", id, rev[id] }' sales.csv | sort -t, -k2,2nr | head
أنماط النطاق ومعالجة الملفات المتعددة
تتطابق أنماط النطاق من من حالة إلى أخرى؛ يتم إعادة تعيين FNR لكل ملف على حدة، بينما NR يكون عامًا عبر جميع الملفات.
# Print lines between markers
awk '/BEGIN_REPORT/,/END_REPORT/' app.log
# Compare corresponding lines across files
awk 'FNR==NR { a[$1]=$2; next } { print $0, a[$1] }' left.txt right.txt
الدوال، والشروط، والمصفوفات
# Derive buckets with if/else and functions
awk '{
score=$2
if (score>=90) grade="A"
else if (score>=80) grade="B"
else grade="C"
print toupper($1), grade, length($1)
}' grades.txt
نصائح حول الأداء وسهولة الحمل
- أفضل الأنماط البسيطة واستخدام عدد قليل من استدعاءات gsub على الملفات الضخمة.
- استخدم المقارنات العددية (على سبيل المثال، $3+0 >= 100) لتجنب دلالات السلسلة النصية.
- ضبط FS/OFS مرة واحدة في BEGIN من أجل الاتساق.
- بالنسبة للبيانات الضخمة جدًا، يتم إرسال البيانات إلى فرز خارجي لترتيب البيانات بشكل مكثف.
- التزم بـ POSIX awk لضمان سهولة النقل؛ استخدم ميزات gawk (FPAT، asort) عند الحاجة.
المخاطر الشائعة وأفضل الممارسات
- نقلا عن: ضع برامج awk بين علامتي اقتباس مفردتين لمنع الصدفة من توسيع الأحرف. تأكد من استخدام علامة الهروب (الهروب) بعناية عند استخدام علامات الاقتباس المفردة.
- أرقام الحقول: تختلف تنسيقات السجلات؛ تحقق من العمود الذي يحتوي على الحالة أو المسار أو البايتات في بيئتك.
- تعقيد ملف CSV: تتضمن ملفات CSV الحقيقية فواصل مقتبسة وأسطر جديدة؛ وللحصول على ملفات CSV قوية، فكر في استخدام gawk مع FPAT أو أدوات متخصصة مثل Miller.
- موقع: قد يختلف ترتيب الأحرف وتحويلها حسب اللغة. اضبط LC_ALL=C للحصول على سلوك متوقع.
- الاختبار: ابدأ بعينة صغيرة (رأس) وأضف الشروط تدريجياً.
awk مقابل sed مقابل grep: متى يُستخدم كل منهما
- استخدم grep للعثور على خطوط تتطابق مع نمط معين (تصفية سريعة).
- استخدم sed للاستبدال أو قم بتحرير النص في مكانه (محرر البث المباشر).
- استخدم awk لتحليل الحقول، حساب القيم، وتجميعها، وتلخيصها (المعالجة المنظمة).
استخدم الأمر grep لتضييق نطاق الإدخالاستخدم awk للحساب، و sed لتنظيف المخرجات. هذه العقلية التي تركز على خط الأنابيب أولاً تحافظ على كفاءة سطور الأوامر وسهولة صيانتها.
كيف تساعد أداة awk فرق الاستضافة وفرق DevOps
بدءًا من رصد عناوين IP المسيئة وصولًا إلى تحديد حجم الارتفاعات المفاجئة في استخدام خوادم 5xx، يتيح لك awk تحويل السجلات الخام إلى إجابات في ثوانٍ دون الحاجة إلى أدوات معقدة. في بيئات الاستضافة، تُسرّع هذه السرعة الاستجابة للحوادث، وتخطيط السعة، وتحسين الأداء، خاصةً عندما SSHتم إدخالها إلى خوادم الإنتاج ذات الموارد المحدودة.
At YouStableالخاص بنا أو manageاستضافة و VPS غالباً ما يطلب العملاء إمكانية مراقبة عملية دون الحاجة إلى بنى معقدة. يوفر برنامج awk، إلى جانب أدوات لينكس القياسية، رؤية فورية.
إذا كنت ترغب في المراقبة الاستباقية، ومجموعات الويب المحسّنة، والدعم العملي الذي يتحدث لغتك، فإن فريقنا يمكنه مساعدتك في تطبيق هذه التقنيات على نطاق واسع.
عبارات مختصرة عملية أكثر يمكنك إعادة استخدامها
# Remove duplicate lines while keeping first occurrence
awk '!seen[$0]++' file.txt
# Show lines with more than N fields (e.g., malformed)
awk 'NF > 10' data.txt
# Add header to computed report
awk 'BEGIN{print "status,count"} {c[$9]++} END{for(s in c) print s "," c[s]}' access.log
# Extract date (first field) and count per day
awk '{ d=$1; gsub(/\[|\]/,"",d); day=substr(d,1,11); hits[day]++ } END{ for (k in hits) print hits[k], k }' access.log | sort -nr
الأسئلة الشائعة
ما هو استخدام أمر awk في نظام لينكس؟
awk هي لغة لمعالجة النصوص يُستخدم هذا البرنامج لمسح الملفات سطرًا سطرًا، وتقسيم الأسطر إلى حقول، وتطبيق قواعد معالجة الأنماط. كما يُستخدم لاستخراج الأعمدة، وتصفية الصفوف، وحساب الإحصائيات، وإنشاء التقارير، وتحويل البيانات، لا سيما من السجلات وملفات CSV ومخرجات الأوامر.
كيف يمكنني طباعة أعمدة محددة باستخدام awk؟
استخدم $1، $2، ... للإشارة إلى الحقول. بالنسبة لملفات CSV، استخدم الخيار -F، ويمكنك اختيارياً استخدام OFS للإخراج. مثال: الأمر awk -F, 'BEGIN{OFS=”,”} {print $1,$3}' file.csv يطبع العمودين الأول والثالث كمخرجات مفصولة بفواصل.
ما الفرق بين NR و FNR في awk؟
NR هو الخط الإجمالي يُحسب عدد الأسطر في جميع ملفات الإدخال، ويستمر في الازدياد. يُمثل FNR عدد الأسطر في الملف الحالي، ويعود إلى 1 عند بدء awk ملفًا جديدًا. استخدم نمط FNR==NR لإنشاء خرائط بحث من الملف الأول، ثم عالج الملف الثاني.
هل يستطيع برنامج awk التعامل مع ملفات CSV المعقدة التي تحتوي على فواصل بين علامتي اقتباس؟
أساسيات awk مع يُعاني الخيار -F من مشاكل عند احتواء الحقول على فواصل داخل علامات اقتباس. يُحسّن gawk هذا الأمر باستخدام FPAT لتعريف الحقول كرموز. وللحصول على ملفات CSV قوية تمامًا (علامات اقتباس مُهرّبة، أسطر جديدة)، يُنصح باستخدام أدوات مُخصصة مثل Miller أو xsv.
أيهما أفضل: awk أم sed أم grep؟
إنهم يحلون مشاكل مختلفةتُستخدم أداة grep للبحث، وأداة sed لتحرير البيانات، وأداة awk للتحليل والحساب. أما بالنسبة للتحليل المُهيكل (الأعمدة، والتجميع، والمجاميع)، فإن awk هي الأنسب. يُنصح بدمج هذه الأدوات في مسارات مُتكاملة للحصول على أوامر أكثر كفاءة وسهولة في القراءة.
إتقان أمر awk ستؤتي هذه الأمثلة ثمارها سريعًا في أي بيئة عمل لينكس، أو ديف أوبس، أو استضافة. احتفظ بهذه الأمثلة في متناول يدك، وقم بتكييفها مع تنسيقات سجلاتك، وستتمكن من تحويل النصوص الخام إلى رؤى قابلة للتنفيذ في ثوانٍ.