الأنماط والنطاقات وكتل BEGIN وEND
رشّح السجلات باستخدام الأنماط الشرطية وأنشئ الرؤوس والإجماليات باستخدام كتل BEGIN وEND
الأنماط والنطاقات وكتل BEGIN وEND درس مجاني في Linux Command Line & Bash Scripting Mastery على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Linux Command Line & Bash Scripting Mastery، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Linux Command Line & Bash Scripting Mastery 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) وفتح باقي دورة Linux Command Line & Bash Scripting Mastery، انتقل إلى CoddyKit PRO. تتضمن دورة Linux Command Line & Bash Scripting Mastery 4 دروس في المجموع.
ماذا ستتعلم في «الأنماط والنطاقات وكتل BEGIN وEND»؟
رشّح السجلات باستخدام الأنماط الشرطية وأنشئ الرؤوس والإجماليات باستخدام كتل BEGIN وEND تتمرن على Linux Command Line & Bash Scripting Mastery مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Linux Command Line & Bash Scripting Mastery؟
لا تُشترط خبرة سابقة. Linux Command Line & Bash Scripting Mastery على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الأنماط والنطاقات وكتل BEGIN وEND»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Linux Command Line & Bash Scripting Mastery هذا؟
نعم. كل درس في Linux Command Line & Bash Scripting Mastery يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- السجلات والحقول والفواصل المخصّصة في awk
- الأنماط والنطاقات وكتل BEGIN وEND
- التجميع باستخدام مصفوفات awk والتصنيف
- دوال awk وتنسيق printf وإنشاء التقارير