0Pricing
DevOps Bootcamp · درس

الأنماط والنطاقات وكتل BEGIN وEND

رشّح السجلات باستخدام الأنماط الشرطية وأنشئ الرؤوس والإجماليات باستخدام كتل BEGIN وEND

الأنماط والنطاقات وكتل BEGIN وEND درس مجاني في DevOps Bootcamp على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في DevOps Bootcamp، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة DevOps Bootcamp 4 دروس في المجموع.

ما أنماط awk؟

في awk، النمط هو شرط يتحكم في تنفيذ كتلة الإجراء لسطر إدخال معين. والصيغة العامة هي:

awk 'pattern { action }' file

إذا طابق النمط السجل الحالي، يُنفذ الإجراء. وإذا لم يُحدد إجراء، يطبع awk السطر بأكمله افتراضيًا. ويمكن أن تكون الأنماط:

  • تعبيرات نمطية — /regex/
  • تعبيرات علائقية — $3 > 100
  • تعبيرات مركبة — $1 == "ERROR" && $4 > 500
  • أنماط نطاق — /start/,/end/
  • أنماط خاصة — BEGIN وEND

يُعد فهم الأنماط بوابة استخدام awk كمرشح قوي للبيانات، بدلًا من استخدامه لطباعة الأعمدة فحسب.

أنماط التعبيرات النمطية لتصفية الأسطر

أكثر أنواع الأنماط شيوعًا هو التعبير النمطي المحاط بشرطتين مائلتين. يختبر awk كل سطر مقابل التعبير النمطي، ولا ينفذ الإجراء إلا عند حدوث تطابق.

فيما يلي نرشح ملفًا بنمط /var/log/syslog لعرض الأسطر التي تحتوي على الكلمة ERROR فقط:

#!/usr/bin/env bash
# Simulate a log file and filter ERROR lines
log=$(cat <<'EOF'
2026-06-11 08:01:22 INFO  service started
2026-06-11 08:02:05 ERROR disk quota exceeded on /dev/sda1
2026-06-11 08:02:44 WARN  memory usage at 80%
2026-06-11 08:03:10 ERROR connection timeout to 10.0.0.5
2026-06-11 08:03:55 INFO  backup completed
EOF
)

echo "=== ERROR lines only ==="
echo "$log" | awk '/ERROR/ { print NR": "$0 }'

الأنماط المنفية والمركبة

أضف ! قبل نمط التعبير النمطي لعكسه، بحيث يطابق الأسطر التي لا تحتوي على النمط. ادمج عدة شروط باستخدام && (و) أو || (أو) للتحكم الدقيق.

  • !/DEBUG/ — تخطي أسطر تصحيح الأخطاء
  • $3 > 500 && $5 == "POST" — طلبات POST الكبيرة
  • /WARN/ || /ERROR/ — أي من درجتي الخطورة

يحلل المثال التالي سجل وصول مبسطًا ويطبع طلبات POST التي يتجاوز حجم استجابتها 1000 بايت فقط:

#!/usr/bin/env bash
access=$(cat <<'EOF'
10.0.0.1 GET  /api/ping     200  48
10.0.0.2 POST /api/upload   201  2048
10.0.0.3 GET  /api/users    200  512
10.0.0.4 POST /api/data     200  3500
10.0.0.5 POST /api/health   200  60
EOF
)

echo "Large POST requests (>1000 bytes):"
echo "$access" | awk '$2 == "POST" && $5 > 1000 { print $1, $3, "size="$5 }'

أنماط النطاق: /start/,/end/

يحدد نمط النطاق كتلة متتابعة من السجلات، بدءًا من السطر المطابق لـ /start/ وحتى السطر المطابق لـ /end/، مع تضمين السطرين. والصيغة هي:

awk '/start/,/end/ { action }' file

السلوكيات الأساسية التي ينبغي معرفتها:

  • يُفعّل النطاق عند أول سطر يطابق /start/، ويُعطّل بعد أول سطر لاحق يطابق /end/.
  • إذا لم يطابق أي سطر /end/، يظل النطاق فعالًا حتى نهاية الملف.
  • تُعالج النطاقات المتعددة غير المتداخلة في الملف نفسه كلٌّ على حدة.

يجعل ذلك أنماط النطاق مثالية لاستخراج الأقسام المحددة من ملفات الإعداد، أو السجلات التي تحتوي على عناوين فاصلة، أو التقارير متعددة الكتل.

استخراج الأقسام باستخدام أنماط النطاق

لنفترض وجود إعداد خادم يحتوي على عدة أقسام مسماة تفصل بينها عناوين من الشكل [section]. نريد الأسطر الموجودة داخل [database] فقط:

#!/usr/bin/env bash
config=$(cat <<'EOF'
[server]
host = 0.0.0.0
port = 8080

[database]
host = 127.0.0.1
port = 5432
name = appdb
user = admin

[cache]
host = 127.0.0.1
port = 6379
EOF
)

echo "=== [database] section ==="
echo "$config" | awk '/\[database\]/,/^\[/' \
  | awk 'NR > 1 && !/^\[/ && NF'

كتلة BEGIN

تُنفذ كتلة BEGIN مرة واحدة قبل قراءة أي إدخال. وهي مناسبة لما يلي:

  • طباعة عنوان التقرير
  • تهيئة المتغيرات والعدادات
  • ضبط فاصل الحقول (FS) أو المتغيرات المضمنة الأخرى
  • تشغيل برامج awk مستقلة لا تحتاج إلى إدخال

الصيغة:

awk 'BEGIN { setup } pattern { action }' file

يُعد ضبط FS داخل BEGIN بديلًا واضحًا للراية -F، وهو مفيد خصوصًا عند كتابة برامج متعددة القواعد تكون فيها منطقية الفاصل داخل البرنامج النصي.

#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)

echo "$csv" | awk 'BEGIN {
  FS = ","
  printf "%-10s %-15s %10s\n", "Name", "Department", "Salary"
  print "--------------------------------------------"
}'

كتلة END

تُنفذ كتلة END مرة واحدة بعد معالجة السجل الأخير. وهي الموضع الطبيعي من أجل:

  • طباعة الإجماليات والمتوسطات والملخصات المتراكمة أثناء المعالجة
  • تفريغ ملفات الإخراج أو إغلاقها
  • طباعة أسطر التذييل للتقارير المنسقة

تظل المتغيرات التي ضُبطت أثناء القواعد الرئيسية ضمن النطاق داخل END أيضًا، وهذه هي آلية عمل الإجماليات التراكمية. يجمع المثال التالي قيم الرواتب من ملف CSV ويطبع الإجمالي في التذييل:

#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)

echo "$csv" | awk -F',' '
  { total += $3; count++ }
  END { printf "Employees: %d  Total payroll: $%d\n", count, total }
'

دمج BEGIN والقواعد وEND

تظهر القوة الحقيقية عند دمج الكتل الثلاث في برنامج awk واحد مستقل يطبع عنوانًا، ويعالج كل سجل، ويطبع ملخصًا. ويُعد هذا النمط أساس مسارات إعداد التقارير المعتمدة على shell.

فيما يلي مولد تقارير كامل يقرأ ملف CSV لطلبات الويب، ويطبع تفاصيل كل سطر، بالإضافة إلى العدد النهائي للطلبات التي تجاوزت ثانية واحدة:

#!/usr/bin/env bash
data=$(cat <<'EOF'
/api/ping,0.03
/api/users,1.45
/api/login,0.88
/api/upload,2.10
/api/health,0.02
/api/report,1.73
EOF
)

echo "$data" | awk -F',' '
BEGIN {
  printf "%-20s %10s %s\n", "Endpoint", "Latency(s)", "Status"
  print "--------------------------------------"
}
{
  status = ($2 > 1.0) ? "SLOW" : "OK"
  if (status == "SLOW") slow++
  printf "%-20s %10s %s\n", $1, $2, status
}
END {
  print "--------------------------------------"
  printf "Slow requests: %d / %d\n", slow, NR
}
'

استخدام BEGIN لضبط OFS وORS

يمكن ضبط متغيرين من متغيرات الإخراج كثيرًا ما يُغفل عنهما بسهولة داخل BEGIN:

  • OFS (فاصل حقول الإخراج) — يُدرج بين الحقول عند إعادة بناء سجل باستخدام $1=$1 أو عند استخدام print $1, $2
  • ORS (فاصل سجلات الإخراج) — يُضاف بعد كل استدعاء لـ print (القيمة الافتراضية هي \n)

يتيح ضبط OFS="," إعادة تنسيق TSV إلى CSV بتمرير واحد، دون دمج السلاسل النصية. ويؤدي تغيير ORS إلى "\n---\n" إلى إضافة فواصل بين السجلات تلقائيًا.

#!/usr/bin/env bash
# Convert whitespace-delimited data to CSV with a header
data=$(cat <<'EOF'
alice   engineering  95000
bob     marketing    72000
carol   engineering  105000
EOF
)

echo "$data" | awk 'BEGIN { OFS=","; print "name,dept,salary" }
{ $1=$1; print }'

نمط نطاق عملي: نوافذ حوادث السجل

تتألق أنماط النطاق في تحليل السجلات التشغيلية. ومن المهام الشائعة استخراج جميع أسطر السجل بين بداية حادثة ونهايتها، المحددتين برسائل مميزة مثل INCIDENT START وINCIDENT END.

في المثال التالي، يستخرج awk الأسطر الموجودة داخل نافذة الحادثة فقط، ويعد أحداث ERROR الواقعة ضمنها، جامعًا بين نمط نطاق ومجمّع وملخص END:

#!/usr/bin/env bash
log=$(cat <<'EOF'
08:00:01 INFO  Normal operation
08:01:00 INFO  INCIDENT START: disk pressure detected
08:01:05 ERROR write failed on /dev/sda1
08:01:09 ERROR inode table corruption
08:01:14 WARN  remounting read-only
08:01:22 INFO  INCIDENT END: disk replaced
08:02:00 INFO  Normal operation resumed
EOF
)

echo "$log" | awk '
/INCIDENT START/,/INCIDENT END/ {
  print
  if (/ERROR/) errors++
}
END { print "Errors during incident:", errors+0 }
'

تخطي أسطر الفواصل في النطاق

تتضمن أنماط النطاق افتراضيًا الأسطر التي تطابق /start/ و/end/ نفسها. ولتخطي سطري الفاصل والاحتفاظ بالمحتوى الموجود بينهما فقط، قيّد الإجراء بالنفي أو باستخدام متغير راية:

  • أسلوب النفي: /start/,/end/ { if (!/start/ && !/end/) print }
  • أسلوب الراية: اضبط متغيرًا يدويًا على 1 عند /start/ وعلى 0 عند /end/

يكون أسلوب الراية أكثر متانة عندما يحتمل ظهور نص الفاصل أيضًا ضمن محتوى النص:

#!/usr/bin/env bash
doc=$(cat <<'EOF'
## preamble
some intro text
## BEGIN_REPORT
row1: alpha 100
row2: beta  200
row3: gamma 150
## END_REPORT
## appendix
EOF
)

echo "$doc" | awk '
/## BEGIN_REPORT/ { capture=1; next }
/## END_REPORT/   { capture=0 }
capture           { print }
'

اختبار المعرفة: سلوك كتلة BEGIN

اختبر مدى فهمك لتفاعل كتلتي BEGIN وEND مع معالجة الإدخال في awk.

مراجعة الدرس: الأنماط والنطاقات وBEGIN/END

أتقنت في هذا الدرس أقوى ثلاث ميزات بنيوية في برامج awk:

  • الأنماط — تتحكم الأنماط النمطية (/ERROR/) والعلائقية ($3 > 1000) والمنفية (!/DEBUG/) والمركبة (&& و||) في السجلات التي تُشغّل إجراءً، دون الحاجة إلى عبارات if صريحة.
  • أنماط النطاق (/start/,/end/) — تحدد كتلًا متتابعة من السجلات، وهي مثالية لاستخراج نوافذ حوادث السجل وأقسام الإعداد ومقاطع التقارير. استخدم متغير راية (next + قيمة منطقية) عندما تحتاج إلى استبعاد أسطر الفواصل نفسها.
  • كتلة BEGIN — تُنفذ مرة واحدة قبل أي إدخال، وهي مثالية لضبط FS وOFS وORS، وتهيئة العدادات، وطباعة عناوين التقارير.
  • كتلة END — تُنفذ مرة واحدة بعد انتهاء الإدخال كله، وهي المكان المناسب لطباعة الإجماليات والمتوسطات والتذييلات باستخدام المتغيرات المتراكمة في القواعد الرئيسية.

تتيح لك هذه الميزات مجتمعةً كتابة برامج awk كاملة وموثقة ذاتيًا، تستوعب النص الخام وتنتج تقارير منظمة سهلة القراءة للبشر، وكل ذلك في مرحلة واحدة من مسار المعالجة دون ملفات مؤقتة أو أدوات خارجية.

الأسئلة الشائعة

هل درس «الأنماط والنطاقات وكتل BEGIN وEND» مجاني؟

نعم — نص درس «الأنماط والنطاقات وكتل BEGIN وEND» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة DevOps Bootcamp، انتقل إلى CoddyKit PRO. تتضمن دورة DevOps Bootcamp 4 دروس في المجموع.

ماذا ستتعلم في «الأنماط والنطاقات وكتل BEGIN وEND»؟

رشّح السجلات باستخدام الأنماط الشرطية وأنشئ الرؤوس والإجماليات باستخدام كتل BEGIN وEND تتمرن على DevOps Bootcamp مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ DevOps Bootcamp؟

لا تُشترط خبرة سابقة. DevOps Bootcamp على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الأنماط والنطاقات وكتل BEGIN وEND»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس DevOps Bootcamp هذا؟

نعم. كل درس في DevOps Bootcamp يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. السجلات والحقول والفواصل المخصّصة في awk
  2. الأنماط والنطاقات وكتل BEGIN وEND
  3. التجميع باستخدام مصفوفات awk والتصنيف
  4. دوال awk وتنسيق printf وإنشاء التقارير
← العودة إلى DevOps Bootcamp