مرحباً بك بمدونتنا

Our Company Logo

لماذا يُعتبر لينكس أكثر أمانا من أي نظام تشغيل آخر؟

شاهد المقال

Securityقبل أن نخوض في التفاصيل عليك أن تتذكّر بأنه لا يوجد نظام تشغيل آمن بشكل تامّ، كما أن بعض العوامل قد تعتمد على مستخدم النظام نفسه، ولكن يزخر لينكس بالعديد من المزايا التي تجعله يحمي ويقي نفسه بشكل أكبر من الاختراق والبرمجيات الخبيثة، أكثر من المنافسين اﻵخرين، وسنتطرق إلى سرد هذه المزايا:

(1) امتيازات الحسابات

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

(2) الوعي اللينكساوي

مستخدمو لينكس أكثر وعيًا من غيرهم بشأن ضوابط اﻷمن والحماية وأكثر دراية فنية بهذه اﻷمور، ولعل السبب في ذلك يرجع إلى اهتمامهم بذلك وأيضا السمعة التي يحظى بها لينكس في هذا المجال التي اجتذبت المستخدمين إليه، بالمقابل فإن  بعض مستخدمي اﻷنظمة الأخرى قد لا يُبالون بفتح أي مرفق رسالة بريد إلكتروني غير موثوقة، أو تحميل ملف مشكوك فيه من أحد المواقع، كما لا ننسَ أن الكراكات مستخدمة على نطاق واسع في ويندوز، اﻷمر الذي يزيد الطين بلّة.

(3) التنوع البيئي

في لينكس توجد الكثير من البيئات والتوزيعات المختلفة مثل: Debian, Ubuntu, Gentoo, إلخ…، والكثير من أنظمة إدارة الحزم المختلفة (packages Management) والعديد من الـShells، والتنوع الشديد في النظام وكثرة التغيّر فيه بشكل دوري، اﻷمر الذي يُصعّب على الفيروسات التأقلم مع هذا التنوع، وبالتالي فهو يُعتبر هدفًا صعب التحديد. إنّ هذا التنوع غير موجود في بنية ويندوز، اﻷمر الذي يجعل الفيروس ينتقل عبر العديد من المستخدمين.

(4) نظام التدقيق في لينكس

في لينكس يمكننا مراجعة ومعرفة عمليات الوصول إلى المختلفة إلى الملفات واستدعاءات النظام من خلال سجّل اﻷحداث (log events)؛ لذلك فإذا كان هنالك أيّ شخص يحاول التجسس على أمن ملفات النظام فإنه يمكن مراجعة الخروقات اﻷمنية من قِبل المسؤول باﻹضافة إلى معرفة محاولات تسجيل الدخول الفاشلة والخروقات اﻷمنية اﻷخرى التي يتم تسجيلها على القرص والتي يمكن أن يراجعها المسؤول في وقت لاحق.

(5) مفتوح المصدر وتحديثات باستمرار

عندما يكون الكود مفتوحا للمطورين، فإن هذا يجعل عملية اكتشاف المشاكل والثغرات أسرع وأكثر سهولة، والذي من شأنه إصدار تحديثات سريعة للنظام، على عكس اﻷنظمة اﻷخرى التي تحدد شركاتها موعدا مجدولا ﻹصدار التحديثات مما يؤدي إلى بقاء المشكلة لمدة متأخرة وقد تتفشى خلال تلك الفترة، أي أنه ليس فوريًا.

(6) عدد مستخدمين أقل

إن حجم الجمهور الذي يستعمل لينكس أقل كثيرا من ويندوز وماكنتوش، وهذا ما يجعله أقل استهدافًا منهم.

(7) IPtables

إن برنامج iptables المُرفق افتراضيا مع نظام لينكس، وهو الجدار الناري الافتراضي في لينكس، يتمتع بقوة عالية جدًا، مُفعّل افتراضيًا، وهو يقوم بتطبيق العديد من مبادئ وقواعد اﻷمان الهامّة لحماية النظام من اﻷخطار، ويمكنك فتح وإغلاق المنافذ (ports) المطلوبة. إنه أحد عوامل قوة أمان لينكس الواضحة.

كيفية تحزيم وتوزيع تطبيقات بايثون

شاهد المقال
إنّ كل مكتبات بايثون (مثل حزم التّطبيقات application packages) التي نقوم بتنزيلها باستخدام مدير الحزم package manager (مثل pip) يتمّ توزيعها باستخدام أداة مساعدة مُخصصة لهذا العمل، تقوم هذه الأدوات المساعدة بإنشاء توزيعات بايثون Python distributions والتي هي أساسا عبارة عن ملفات أرشيف مرقمة بإصدار ومضغوطة، تحتوي هذه الملفّات على جميع العناصر المتعلقة بما يتم توزيعه، مثل ملفات المصادر source files وملفات الموارد resource files.
بيثون package.thumb.png.438cd403af1da58
سنقوم في هذا الدرس بالتحدث عن الأدوات الضرورية للتوزيع، وسنتطرق إلى الخطوات الأساسية التي تسمح لنا بحزم المكتبات المفيدة الخاصة بنا، الوحدات modules، أو حتى التطبيقات applications والتي ستكون مفيدة لنا عند توزيع المشروع الخاص بنا على خادوم أو مشاركته على الإنترنت.

توزيعات وحزم بايثون

حتى ولو كنا قد عملنا قليلًا فقط مع بايثون، فنحن متآلفون مع مفهوم استخدام مدير الحزم (مثل pip ،easy_install) لتنزيل الوحدات والمكتبات (مثل هياكل تطوير التطبيقات application development frameworks) والتي يتم بعدها استيرادها واستخدامها لإنشاء واحدة جديدة.
تقوم أدوات إدارة الحِزَم هذه -والتي تعمل محليا- بالاتصال إلى مصدر بعيد source (مثل دليل حزم بايثون Python Package Index – PyPI) وتنفيذ الإجراء المطلوب (كالبحث والتنصيب).
تتكوّن طريقة توزيع تطبيق ما من تغليف الدليل directory الخاص به ببعض الملفّات الضّروريّة (مع القليل من الملفّات المُوصى بها)، تحديد العناصر المرتبطة (كالموارد resources والاعتماديات dependencies، إلخ) وإصدارها أو استخدامها في مكان آخر ببساطة.
ملاحظة: نشجعك بشدة على العمل على بيئات افتراضيّة لعزل تنزيلات بايثون، الوحدات والتطبيقات التي تعمل عليها.

1. حزم بايثون

الحزمة في بايثون هي تقنيا عبارة عن دليل قابل للاستيراد (باستخدام init__.py__ ) يحتوي على ملفات المصادر (كالوحدات)، ولا يجب الخلط بينها وبين حزم نظام التشغيل والتي هي تقنيًّا تطبيقات فعلية (مثل حزمة Debian)، ومع ذلك يجب أن نُلاحظ أنّ توزيعات بايثون في الواقع تدعى أيضًا بالحزم.
مثال على بنية الحِزمة:
حزمة 
 | 
 | - __init__ . الحمر

2. تطبيقات بايثون

على الرّغم من أنّه يُمكننا اعتبار أي شيء في بايثون كتطبيق وذلك ابتداء من ملف واحد وحتى مئات الملفات المُبعثرة عبر الحزم المُختلفة، فإنّ التطبيق في أغلب الحالات الواقعيّة يتكوّن من العديد من الوحدات والبعض من الاستيرادات الخارجيّة (من المكتبات).
مثال على بنية التّطبيق:
اسم التطبيق
 | 
| - __init__ . الحمر
 | - amodule . الحمر
 | - anothermod . الحمر
 | __ الاختبارات
 |      | 
|      | - __init__ . الحمر
 |      | -  .. 
|      | -  . 
|  ..

3. مكتبات وأدوات توزيع بايثون

نظرا لطبيعة شعبية لغة بايثون ووجود كميّة وافرة من مكتبات وتطبيقات الطرف الثالث third-party المكتوبة لأجلها فقد كان من الضّروري دوما إيجاد طريقة مُوحّدة وأبسط لتوزيعها، تُوجد العديد من المكتبات والأدوات المختلفة المُستخدمة لإنشاء توزيعات بايثون.
تمّ إنشاء مجموعة الأدوات المساعدة لتوزيع بايثون والتي تدعى distutils من أجل التعامل مع مهام التوزيع.

4. دليل حزم بايثون (Python Package Index (PyPI

دليل حزم بايثون أو PyPI هو مستودع مركزي (على الإنترنت Online) للمشاريع (توزيعات بايثون)، حيث تستخدم أدوات إدارة الحِزم مثل pip هذا المستودع من أجل استضافة، إيجاد وتثبيت الحِزَم.

البدء

فلنقم في البداية بإنشاء تطبيق بايثون بسيط وعام باستخدام إطار العمل المصغّر flask (إنشاء البنية) والذي يُمكننا لاحقًا تحزيمه.
التطبيق عبارة عن تطبيق ويب بسيط جدا، ﻷن الهدف من الدرس هو كيفية التحزيم وليس التطبيق في حد ذاته.

إنشاء بنية التطبيق

نهدف إلى إنشاء مثال يشابه معظم مشاريع العالم الحقيقي، ولهذا من الأفضل أن نتخيّل حالة تحتوي على وحدات.
بُنية المثال:
/ MyApplication 
|-- run . py
  |-- config . py
  | __ / app
       |-- __init__ . py
       |--  / module_one
           |-- __init__ . py
           |-- controllers . py
           |-- models . py                
       | __ / templates
           |-- module_one
               |-- hello . html
       | __ / static 
     | __ .. 
     | __ .

1. إنشاء المجلدات:

/ MyApplication 
|-- run . py
  |-- config . py
  | __ / app
       |-- __init__ . py
       |--  / module_one
           |-- __init__ . py
           |-- controllers . py
           |-- models . py                
       | __ / templates
           |-- module_one
               |-- hello . html
       | __ / static 
     | __ .. 
     | __ .

2. تعديل الملف run.py باستخدام برنامج nano:

نانو ~ / MyApplication / المدى . الحمر
نضع المحتويات التّالية بداخله:
# تشغيل خادم اختبار. 
من التطبيق استيراد التطبيق
التطبيق . تشغيل ( التصحيح = صحيح )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

3. تعديل الملف config.py باستخدام برنامج nano:

نانو ~ / MyApplication / التكوين . الحمر
نضع المحتويات التّالية بداخله:
DEBUG =  صحيح 
THREADS_PER_PAGE =  4 
CSRF_ENABLED       =  صحيح 
CSRF_SESSION_KEY =  "سرية"
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

4. تعديل الملف app/init.py باستخدام برنامج nano:

نانو ~ / MyApplication / التطبيق / __init__ . الحمر
نضع المحتويات التّالية بداخله:
من قارورة استيراد  قارورة ، ل render_template

التطبيق =  قارورة ( __name__ ) 
التطبيق . التكوين . from_object ( "التكوين" )

من التطبيق . module_one . التحكم استيراد module_one
التطبيق . register_blueprint ( module_one )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

5. تعديل الملف app/module_one/controllers.py باستخدام برنامج nano:

نانو التطبيق / module_one / التحكم . الحمر
نضع المحتويات التّالية بداخله:
من قارورة استيراد  مخطط ، طلب ، ل render_template

module_one =  مخطط ( "المصادقة" ، __name__ ، url_prefix = "/ المصادقة" )

module_one . الطريق ( "/ مرحبا" ) 
مواطنه مرحبا (): 
    عودة ل render_template ( "module_one / hello.html" )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

6. تعديل الملف app/templates/module_one/hello.html باستخدام برنامج nano:

نانو التطبيق / قوالب / module_one / مرحبا . أتش تي أم أل
نضع المحتويات التّالية بداخله:
<DOCTYPE  HTML > 
<أتش تي أم أل  لانج = "EN" > 
<رئيس> 
    <العنوان> {٪ كتلة٪ لقب} موقعي {٪ endblock٪} </ عنوان>
    {٪ كتلة المغلق٪}
    {٪} كتل٪ نهاية
    <ميتا  اسم = "إطار العرض"  محتوى = "العرض = جهاز العرض، الأولي على نطاق و= 1.0" > 
 </ head> 
<body>
    مرحبا بالعالم!
</ body> 
</ HTML>
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

البدء بتوزيع وحزم التطبيق

بعد إنشاء بنية التطبيق المثالية لموقع ويب يستخدم flask، نستطيع المتابعة بالقيام بالخطوة الأولى في إعداد التوزيعة.

1. تبديل بنية المجلد

من أجل حَزْم تطبيقنا بشكل جيّد نحتاج للقيام ببعض الإضافات لبُنية مجلّدنا.

 
     
     
الاعداد توزيع ملف 
| - اقرأني . TXT    # لي على ملف اقرأ 
| - MANIFEST . في  # ملف البيان توزيع 
| - التغيرات . TXT السجل # التغييرات
فلنقم بتبديل بنية المجلد لإنشاء الملفات الضروريّة:
لمس ~ / MyApplication / الإعداد . الحمر
لمس ~ / MyApplication / اقرأني . الحمر
لمس ~ / MyApplication / MANIFEST . الحمر
لمس ~ / MyApplication / التغيرات . الحمر
ام     ~ / MyApplication / المدى . الحمر ~ / MyApplication / بن / المدى

2. إنشاء الملف setup.py

نانو ~ / MyApplication / الإعداد . الحمر
نضع المحتويات التّالية بداخله:
من distutils . الأساسية استيراد الإعداد

الإعداد ( 
# اسم التطبيق: 
اسم = "MyApplication" ،

# رقم الإصدار (الأولي): 
نسخة = "0.1.0" ،

# تفاصيل مؤلف التطبيق: 
المؤلف = "اسم اللقب" ، 
للمؤلف author_email = "name@addr.ess" ،

# الحزم 
الحزم = [ "التطبيق" 

# تشمل ملفات إضافية في حزمة 
include_package_data = صحيح ،

# تفاصيل 
URL = "http://pypi.python.org/pypi/MyApplication_v010/" ،

# 
# رخصة = "ترخيص. txt"، 
وصف = "المفيد الاشياء المتعلقة منشفة." ،

# long_description = المفتوحة ( "README.TXT"). قراءة ()،

# حزم التابعة (توزيعات) 
install_requires = [ 
    "القارورة" ، 

)
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

3. إنشاء الملف MANIFEST.in

إن كنا نحتاج إلى شحن دلائل إضافية (ثابتة static أو قوالب templates) يجب علينا التصريح عنها فيmanifest لكي يتمّ حَزْمها، سنقوم بفعل هذا في MANIFEST.in.
نانو ~ / MyApplication / MANIFEST . في
نضع المحتويات التّالية بداخله:
عودي - تشمل التطبيق / القوالب * 
عودي - تشمل التطبيق / ثابت  *
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.
هذا هو كل ما نحتاجه ، الآن حِزمة توزيعة بايثون جاهزة ليتمّ تثبيتها وشحنها.

4. ملفات إضافية

يجب دومًا أن نتذكّر أنّه من أجل الحصول على توزيعة كاملة يجب أن يكون الملف/الدليل محتويًا على الملفّات التالية ومربوطًا بها:
  • README.TXT
  • MANIFEST.in
  • ترخيص. txt

التعامل مع التطبيق الجاهز للتوزيع

بعد أن انتهينا من إنشاء تطبيقنا ومن ثم أجرينا التبديلات الضرورية لبنية الملف لتحضيره لبناء توزيعة لا تحتوي على أيّة أخطاء، نستطيع الآن البدء بالمرور على عمليّات الحَزْم.

1. كيف نقوم بإنشاء ملف التوزيع

من أجل توليد نسخة ملف التوزيع، نقوم بتنفيذ الأمر التالي:
مؤتمر نزع السلاح      ~ / MyApplication 
الإعداد الثعبان . sdist amp؛ نسخ
سيذهب هذا الأمر إلى إعداداتنا، يطبع العمليات التي يتمّ تنفيذها ويُوَلِّد ملف أرشيف tar داخل الدليل الجديدdiet، مشابهًا لما يلي:
# @ الجذر اسم المضيف: ~ / MyApplication # ليرة سورية حي 
# MyApplication-0.1.0.tar.gz
ملاحظة: بما أنّنا لم نقم بتأهيل جميع المجلدات الفرعية (مثل static) وتعاملنا مع ملفات إضافية (مثلREADME.txt)، فقد نحصل على بعض التحذيرات أثناء عمليّة الإنشاء.

2. كيفية تثبيت التطبيق

يستطيع الآخرون من الآن فصاعدًا تثبيت واستخدام التّطبيق باستخدام ملف setup.py الذي أنشأناه.
من أجل تثبيت التطبيق نقوم بتنفيذ الأوامر التالية:
الإعداد الثعبان . PY تثبيت
إن كان هذا التثبيت من أجل التطوير وأردنا تثبيت المُتطلّبات سنقوم بتنفيذ ما يلي:
الإعداد الثعبان . PY تطوير

3. كيفية مشاركة التطبيق

إن أردنا مشاركة الشيفرة على دليل حِزَم بايثون، نستطيع فعل ذلك عن طريق بدء الإجراء register كما يلي:
الثعبان الإعداد . الحمر السجل
نستطيع إكمال هذا الإجراء عبر اتّباع التّعليمات التي تظهر على الشّاشة.
وإن كنّا نملك تسجيل دخول مسجل registered login من أجل الرفع Upload فقط نستطيع استخدام الأمر التالي:
الثعبان الإعداد . sdist تحميل الحمر

4. كيفية إنشاء حزم من الإصدارات الجديدة للتطبيق

  1. نقوم بتحرير الملف setup.py عن طريق مُحرّر نصوص (مثل nano) وتعيين رقم الإصدار الجديد "version="0.1.1.
  2. نقوم بتحرير الملف CHANGES.txt لنعكس التغييرات.
  3. نقوم بإجراء التّعديلات الضّروريّة على الملفين LICENSE.txt و README.txt.
  4. رفع الشّيفرة بعد الخطوة السّابقة.
ترجمة -وبتصرف- للمقال  كيفية توضيب وتوزيع التطبيقات بيثون لصاحبه OS Tezer.
حقوق الصورة البارزة: Designed by Freepik.



كيفية استخدام لغة AWK للتعامل مع النصوص في لينكس

شاهد المقال
تتّبع الأدوات المساعدة في لينِكس فلسفة Unix من ناحية تصميمها عادةً، حيث يُوصى بأن تكون الأدوات صغيرة، أن تستخدم ملفّات نص مُجرَّد plain text للدخل input والخَرْج output، وأن تعمل بالأسلوب التركيبي modular manner، ونمتلك بسبب هذا الإرث legacy وظيفة رائعة لمعالجة النّصوص مع أدوات مثل sed وawk.
AWK-linux.thumb.png.4e2533c16d36d3a0a36d
سنناقش في هذا الدّرس awk، والتي هي لغة برمجة ومُعالِج نصوص على حدٍّ سواء يُمكن استخدامها للتعامل مع بيانات النّصوص بطرق مفيدة جدًّا، سنناقش هذا على Ubuntu 12.04 VPS ولكن ينبغي أن يعمل بنفس الطريقة على أي نظام لينِكس حديث.

الصياغة الأساسية Basic Syntax

يتم تضمين الأمر awk افتراضيًّا في جميع أنظمة لينِكس الحديثة، لذا لن نحتاج إلى تثبيته لكي نبدأ باستخدامه.
يكون awk مفيدًا أكثر عند التعامل مع ملفات نصيّة مُنسَّقة بطريقة متوقعة، فعلى سبيل المثال يكون ممتازًا في تحليل parsing والتعامل مع البيانات المجدولة، فهو يعمل على الأسطر سطرًا تلو الآخر وبالتكرار عبر كامل الملف.
يستخدم awk افتراضيًّا الفواصل whitespaces (المسافات spaces، tabs، إلخ) للفصل بين الحقول، ولحسن الحظ تستخدم معظم ملفّات الإعدادات على نظام لينِكس هذه الصّيغة.
الصيغة الأساسيّة لأمر awk هي:
AWK '/ search_pattern / {action_to_take_on_matches. another_action. } ' file_to_parse
نستطيع إمّا إزالة قسم البحث search أو قسم الإجراء action من أي أمر awk، إنّ الإجراء الافتراضي الذي يتم اتخاذه إن لم نقم بكتابة القسم “action” هو الطباعة “print”، والذي يقوم ببساطة بطباعة كافّة الأسطر الموافقة.
إن لم نقم بكتابة القسم “search” يُنفِّذ awk الإجراء المُدرَج في كل سطر.
أمّا إن قمنا بكتابتهما معًا فيستخدم awk قسم البحث search ليقرّر إذا ما كان السّطر الحالي يعكس النمط pattern المطلوب، ومن ثمّ يُنفِّذ الإجراءات على الأمور المُوافِقة له.

استخدامات بسيطة

نستطيع استخدام awk في أبسط أشكاله مثل cat ليطبع ببساطة جميع أسطر ملف نصّي على الشّاشة.
فلنطبع ملف fstab لخادومنا، والذي يعرض أنظمة الملفّات filesystems التي يعرفها:
AWK '{الطباعة}'  / الخ / fstab
# / الخ / fstab: ثابتة معلومات نظام الملفات. 
# 
# استخدام "blkid" لطباعة المعرف الفريد عالميا ل 
# الجهاز، هذا يمكن أن تستخدم مع UUID = باعتبارها وسيلة أكثر قوة لتسمية الأجهزة 
# يعمل حتى إذا تم إضافة أقراص وإزالتها. انظر fstab (5). 
# 
# 
بروك / بروك بروك nodev ، noexec ، nosuid 0  0 
# / كان على / ديف / vda1 أثناء التثبيت 
UUID = b96601ba - 7d51 - 4c5f - bfe2 - 63815708aabd  / noatime EXT4 ، أخطاء = الفرس البديل - ريال عماني 0  1
لا يفيدنا هذا كثيرًا، فلنجرّب قدرات awk في ترشيح filtering البحث:
AWK '/ UUID /'  / الخ / fstab
# الجهاز، هذا يمكن أن تستخدم مع UUID = باعتبارها وسيلة أكثر قوة على سبيل المثال أجهزة 
UUID = b96601ba - 7d51 - 4c5f - bfe2 - 63815708aabd  / noatime EXT4 ، أخطاء = الفرس البديل - ريال عماني 0  1
وكما نرى يطبع awk الآن الأسطر التي تحتوي "UUID" فقط، بإمكاننا التخلّص من سطر التعليق comment غير المهم عن طريق تحديد أنّ "UUID" يجب أن تتواجد في بداية السّطر:
AWK '/ ^ UUID /'  / الخ / fstab
UUID = b96601ba - 7d51 - 4c5f - bfe2 - 63815708aabd  / noatime EXT4 ، أخطاء = الفرس البديل - ريال عماني 0  1
نستطيع بشكل مشابه استخدام قسم الإجراء action لتحديد أي قطع من المعلومات نريد طباعتها، على سبيل المثال لطباعة العمود الأول فقط نستطيع كتابة:
AWK '/ ^ UUID / {طباعة $ 1؛}  / الخ / fstab
UUID = b96601ba - 7d51 - 4c5f - bfe2 - 63815708aabd
يمكننا الرجوع لكل عمود (لأنّها مفصولة بفراغ بينها) عن طريق متغيرات variables مرتبطة برقم عمودها، على سبيل المثال نستطيع الرجوع للعمود الأول بواسطة المتغير 1$، والرجوع لكامل السّطر بواسطة المتغير 0$.

متغيرات awk الداخلية والتنسيق الموسع Expanded Format

يستخدم awk بعض المتغيّرات الدّاخليّة internal variables لتعيين قطع معيّنة من المعلومات بينما يقوم بمعالجة الملف.
إنّ المتغيّرات الدّاخليّة التي يستخدمها awk هي:
  • FILENAME: يُرجِع ملف الدّخل input الحالي.
  • FNR: يُرجِع عدد التسجيلات record الحاليّة نسبة لملف الدّخل الحالي، على سبيل المثال إن كُنّا نملك ملفّين للدخل فسيخبرنا هذا المتغيّر بعدد التسجيلات لكل ملف بدلًا من أن يخبرنا بالمجموع الكلّي.
  • FS: فاصل الحقل الحالي المُستخدَم للدلالة على كل حقل في التسجيل، يتم تعيينه افتراضيًّا إلى مسافة whitespace.
  • NF: عدد الحقول في التسجيلات الحاليّة.
  • NR: عدد التسجيلات الحاليّة.
  • OFS: فاصل الحقل للبيانات المُخرَجة، يتم تعيينه افتراضيًّا إلى مسافة whitespace.
  • ORS: فاصل التّسجيلات للبيانات المُخرَجة، وهو بشكل افتراضي سطر جديد.
  • RS: فاصل التّسجيلات المُستخدَم لتمييز التّسجيلات المنفصلة في ملف الدّخل، وهو بشكل افتراضي سطر جديد.
نستطيع تغيير قيم هذه المتغيّرات بحسب رغبتنا لتوافِق احتياجات ملفّاتنا، نقوم بذلك عادةً خلال طور التهيئة لمعالجة awk.
يقودنا هذا إلى مفهوم هام آخر، إنّ صياغة awk مُعقَّدة أكثر بقليل ممّا شاهدناه في البداية، حيث توجد أيضًا كُتَل blocks اختياريّة BEGIN وEND والتي يُمكن أن تحتوي على أوامر ليتم تنفيذها قبل وبعد معالجة الملف على التوالي.
يجعل هذا من صيغتنا المُوسَّعة تبدو مشابهة لما يلي:
AWK "BEGIN {العمل؛ }
/ بحث / {العمل؛ }
END {العمل؛ } ' input_file
إنّ الكلمات المفتاحيّة BEGIN وEND هي في الواقع مجرّد مجموعات مُحدّدة من الشّروط conditions تمامًا مثل مُعامِلات parameters البحث، فهي تتوافق مع الشّروط: قبل معالجة المستند وبعد معالجته.
ويعني هذا أنّه بإمكاننا تغيير بعض المتغيّرات الداخليّة في القسم BEGIN، فعلى سبيل المثال الملفetc/passwd/ مفصول بواسطة نقطتين (:) بدلًا من مسافة، وإن أردنا طباعة العمود الأول من هذا الملف نستطيع كتابة ما يلي:
سودو AWK "BEGIN {FS =" "؛ }
{طباعة $ 1؛ } '  / الخ / باسود
جذر
الخفي
بن
تميز الكلية
مزامنة
ألعاب
رجل
. . .
نستطيع استخدام الكُتَل BEGIN وEND لطباعة معلومات بسيطة حول الحقول التي نطبعها:
سودو AWK "BEGIN {FS =" "؛ طباعة "العضو \ ر \ tUID \ ر \ tGID \ ر \ ثوم \ ر \ tShell \ ن --------------". }
{طباعة $ 1، "\ ر \ ر"، $ 3، "\ ر \ ر"، $ 4، "\ ر \ ر"، $ 6، "\ ر \ ر"، $ 7؛}
END {طباعة "--------- \ nFile الكامل"} '  / الخ / باسود
العضو        UID دائرة المخابرات العامة     الرئيسية        شل 
-------------- 
الجذر          0    0      / الجذر       / بن / باش
الخفي        1    1      / البيرة / sbin   / بن / ش
بن           2    2      / بن        / بن / ش
تميز الكلية           3    3      / ​​ديف        / بن / ش
تزامن          4    65534  / بن        / بن / متزامنة
 .  .  . 
--------- 
ملف  كامل
بإمكاننا كما نرى تنسيق الأشياء بشكل أنيق من خلال الاستفادة من بعض ميّزات awk.
جميع الأقسام المُوسّعة اختياريّة، وفي الواقع القسم action الرئيسي بذاته اختياري إن تمّ تعريف قسم آخر، نستطيع أن نفعل أشياء من هذا القبيل كما يلي:
AWK "BEGIN {طباعة" يمكننا استخدام AWK مثل الأمر echo ". }
نحن يمكن استخدام AWK مثل الأمر echo

البحث في الحقول والتعابير المركبة في awk

قُمنا في أحد الأمثلة السّابقة بطباعة السّطر الذي يبدأ بـ "UUID" من الملف etc/fstab/، وكان هذا سهلًا لأنّنا كُنّا نبحث عن بداية السّطر بأكمله.
ولكن ماذا لو أردنا معرفة إذا ما كان نمط البحث قد وافق بداية الحقل field بدلًا من ذلك؟
نستطيع إنشاء الملف favorite_food.txt الذي يضم قائمة تحوي رقم العناصر والأطعمة المفضّلة لمجموعة من الأصدقاء:
صدى "ساندي 1 جزرة
2 الوسابي لوقا
3 شطيرة بريان
4 سلطة ريان
5 السباغيتي جيسيكا "  > favorite_food . TXT
إن كُنّا نريد إيجاد جميع الأطعمة التي تبدأ بـ “sa” من هذا الملف فبإمكاننا البدء بتجربة شيء مشابه لما يلي:
AWK '/ سا /' favorite_food . TXT
1 الجزر الرملية
 2 الوسابي لوقا
 3 شطيرة بريان
 4 سلطة ريان
قمنا هنا بالمطابقة مع أي مثال عن “sa” في الكلمة، وهذا لا يستثني كلمات مثل " wasabi" والتي تحوي هذا النمط في منتصفها، أو "sandy" غير الموجودة في العمود الذي نريده، فنحن مهتمون فقط بالكلمات التي تبدأ بـ “sa” والموجودة في العمود الثاني.
بإمكاننا إخبار awk أن يُطابِق بداية العمود الثاني باستخدام هذا الأمر:
AWK '$ 2 ~ / ^ سا /' favorite_food . TXT
3 شطيرة بريان
 4 سلطة ريان
يسمح لنا هذا كما نرى بالبحث فقط في بداية العمود الثاني عن مُطابِق.
يُخبِر الحرف "^" بأن يُحدِّد awk بحثه في بداية الحقل، ويُحدِّد الجزء "~field_num" بأنّه يجب فقط النّظر إلى العمود الثاني.
يُمكننا بسهولة البحث عن الأشياء غير المُطابِقة بتضمين الحرف "!" قبل المَدّة tilde (~).
سيعيد هذا الأمر جميع الأسطر التي لا تملك طعامًا يبدأ بـ “sa”:
AWK '$ 2! ~ / ^ سا /' favorite_food . TXT
1 الجزر الرملية
 2 الوسابي لوقا
 5 السباغيتي جيسيكا
إن قرّرنا لاحقًا أنّنا فقط مهتمّون بالأسطر التي يكون فيها ما سبق صحيحًا ورقم العنصر أقل من 5، فنستطيع استخدام تعبير مُركَّب مثل هذا:
AWK '$ 2! ~ / ^ سا / && $ 1 <5 " favorite_food . TXT
يُقدِّم لنا هذا بعض الأشياء الجديدة، أوّلها هو القدرة على إضافة مُتطلّبات إضافيّة للسطر الذي نريد مُطابقته باستخدام العامل operator &&، نستطيع باستخدام هذا جمع عدد كيفي من الشّروط للسطر الذي نريد مُطابقته.
نستخدم هذا العامل لإضافة التحقّق من أنّ قيمة العمود الأوّل أقل من 5.

الخاتمة

يجب أن يكون لدينا الآن فكرة أساسيّة حول كيفيّة قيام awk بالتعامل مع تنسيق، وطباعة الملفّات النّصيّة بانتقائيّة، رغم ذلك فإنّ awk موضوع أكبر من هذا بكثير، وهو في الواقع لغة برمجة كاملة تحتوي على إسناد للمتغيّرات، بُنى التّحكّم control structures، دوال مُضمَّنة built-in functions، والمزيد من ذلك، ويُمكن استخدامه في scripts لتنسيق النصوص بطريقة مقروءة بسهولة.
ولتعلّم المزيد حول كيفيّة العمل مع awk تحقّق من الموارد الكبيرة له على الإنترنت، واقرأ عن gawk وهو إصدار GNU من awk الموجود على توزيعات لينِكس الحديثة.
ترجمة -وبتصرف- ل كيفية استخدام لغة AWK إلى التلاعب النص في لينكس لصاحبه جوستين Ellingwood