الفرق بين المراجعتين لصفحة: «Bash/examples using grep»
أسامه-دمراني (نقاش | مساهمات) إدخال 2.0 محتوى الفصل الأول |
أسامه-دمراني (نقاش | مساهمات) إدخال 2.1 إضافة محتوى من فصل أمثلة على grep |
||
سطر 10: | سطر 10: | ||
{| class="wikitable" | {| class="wikitable" | ||
!المعامل | !المعامل | ||
! | !التأثير | ||
|- | |- | ||
|<code>.</code> | |<code>.</code> | ||
سطر 60: | سطر 60: | ||
== الفرق بين التعبير النمطي الأساسي والممتد == | == الفرق بين التعبير النمطي الأساسي والممتد == | ||
تفقد المحارف الخاصة التالية معناها في التعابير النمطية الأساسية (Basic Regular Expression): <code>?</code> ، <code>+</code> ، <code>{</code> ، <code>|</code> ، <code>(</code> ، <code>)</code>، وتُستخدم نفس المحارف مسبوقة بشرطة مائلة خلفية بدلًا من ذلك <code>?\</code> , <code>+\</code> , <code>{\</code> , <code>|\</code> , <code>(\</code> , <code>)\</code>. انظر توثيق النظام لديك لترى أي الأوامر التي تستخدم التعابير النمطية تدعم التعابير الممتدة. | تفقد المحارف الخاصة التالية معناها في التعابير النمطية الأساسية (Basic Regular Expression): <code>?</code> ، <code>+</code> ، <code>{</code> ، <code>|</code> ، <code>(</code> ، <code>)</code>، وتُستخدم نفس المحارف مسبوقة بشرطة مائلة خلفية بدلًا من ذلك <code>?\</code> , <code>+\</code> , <code>{\</code> , <code>|\</code> , <code>(\</code> , <code>)\</code>. انظر توثيق النظام لديك لترى أي الأوامر التي تستخدم التعابير النمطية تدعم التعابير الممتدة. | ||
== أمر grep == | |||
يبحث أمر <code>grep</code> في ملفات المدخلات عن الأسطر التي تحتوي على تطابقات لقائمة أنماط (patterns) بعينها، وحين يجد تطابقًا في أحد الأسطر فإنه ينسخ السطر إلى مخرج قياسي (standard output) افتراضيًا أو إلى أي مخرج آخر تطلبه باستخدام الخيارات التي قد تضيفها إلى الأمر. | |||
ورغم أن أمر <code>grep</code> يتوقع أن يجري التطابقات على النصوص إلا أنه ليس له قيود على طول سطر المدخلات باستثناء الذاكرة المتاحة، ويمكنه مطابقة المحارف العشوائية (arbitrary characters) داخل السطر، وإن كان آخر بايت من ملف مدخلات ليس سطرًا جديدًا (newline) فإن <code>grep</code> يضيف واحدًا تلقائيًا. كذلك لا يمكن مطابقة محارف السطر الجديد في نص بما أن السطر الجديد يُعد فاصلًا لقائمة الأنماط. إليك بعض الأمثلة:<syntaxhighlight lang="bash"> | |||
hsoub ~> grep root /etc/passwd | |||
root:x:0:0:root:/root:/bin/bash | |||
operator:x:11:0:operator:/root:/sbin/nologin | |||
hsoub ~> grep -n root /etc/passwd | |||
1:root:x:0:0:root:/root:/bin/bash | |||
12:operator:x:11:0:operator:/root:/sbin/nologin | |||
hsoub ~> grep -v bash /etc/passwd | grep -v nologin | |||
sync:x:5:0:sync:/sbin:/bin/sync | |||
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown | |||
halt:x:7:0:halt:/sbin:/sbin/halt | |||
news:x:9:13:news:/var/spool/news: | |||
mailnull:x:47:47::/var/spool/mqueue:/dev/null | |||
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false | |||
rpc:x:32:32:Portmapper RPC user:/:/bin/false | |||
nscd:x:28:28:NSCD Daemon:/:/bin/false | |||
named:x:25:25:Named:/var/named:/bin/false | |||
squid:x:23:23::/var/spool/squid:/dev/null | |||
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false | |||
apache:x:48:48:Apache:/var/www:/bin/false | |||
hsoub ~> grep -c false /etc/passwd | |||
7 | |||
hsoub ~> grep -i ps ~/.bash* | grep -v history | |||
/home/hsoub/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] " | |||
</syntaxhighlight> | |||
* يعرض المستخدم <code>hsoub</code> الأسطر التي تحتوي نص <code>root</code> من <code>etc/passwd/</code>. | |||
* ثم يعرض أرقام الأسطر التي تحتوي على ذلك النص. | |||
* ثم ينظر في الأمر الثالث أي المستخدمين لا يستخدمون bash، لكن لا يتم عرض الحسابات التي تستخدم صدفة <code>nologin</code>. | |||
* ثم يحسب عدد الحسابات التي صدفاتها <code>bin/false/</code>. | |||
* أما سطر الأوامر الأخير فيعرض الأسطر التي تبدأ بـ <code>bash./~</code> من كل الملفات الموجودة في مجلد المنزل للمستخدم <code>hsoub</code>، باستثناء التطابقات التي تحتوي على نص <code>history</code>، بما في ذلك استبعاد التطابقات التي من ملف <code>bash_history./~</code> بما أنه قد يحتوي على نفس المقطع النصي سواء في حالتيه الصغرى (lowercase) والكبرى (uppercase). لاحظ أيضًا أن البحث عن نص <code>ps</code> وليس عن أمر <code>ps</code>. | |||
== أمر grep والتعبيرات النمطية == | |||
<blockquote>'''إن كنت على نظام تشغيل خلاف لينكس'''</blockquote><blockquote>نحن نستخدم أمر <code>grep</code> الخاص بنظام جنو في هذه الأمثلة، والذي يدعم التعبيرات النمطية الممتدة، وأمر <code>grep</code> من نظام جنو هو الافتراضي على أنظمة لينكس، فانظر -إن كنت تعمل على أنظمة غير لينكس- أي إصدار لديك باستخدام خيار <code>V-</code>. يمكن تحميل <code>grep</code> الخاص بنظام جنو من https://gnu.org/directory.</blockquote> | |||
== انظر أيضًا == | == انظر أيضًا == |
مراجعة 13:02، 22 أغسطس 2018
التعابير النمطية Regular Expressions
التعبير النمطي (Regular Expression) هو أسلوب يصف مجموعة من النصوص (strings)، وتُبنى التعابير النمطية بشكل تناظري للتعابير الحسابية (arithmetic expressions) عبر استخدام عدة معامِلات لدمج التعابير الأصغر. وأصغر وحدة بنائية للتعابير النمطية هي تلك التي تطابق محرفًا واحدًا، فأغلب المحارف -بما في ذلك كل الحروف والأرقام- ما هي إلا تعابير نمطية تطابق أنفسها، ويمكن اقتباس أي محرف خاص (metacharacter) له معنىً خاص بسبقه بشرطة مائلة خلفية \
.
المحارف الخاصة للتعابير النمطية
يمكن إتباع التعبير النمطي بواحد من عدة معامِلات تكرار (محارف خاصة):
جدول 4.1 معامِلات التعابير الخاصة
المعامل | التأثير |
---|---|
.
|
يطابق أي محرف وحيد. |
?
|
العنصر السابق لهذا المحرف يكون اختياريًا، وسيطابَق مرة واحدة على الأقل. |
*
|
سيطابَق العنصر السابق صفرًا أو أكثر من المرات. |
+
|
سيطابَق العنصر السابق مرة أو أكثر. |
{N}
|
سيطابَق العنصر السابق بعدد من المرات قدره N تحديدًا. |
{N,}
|
سيطابَق العنصر السابق N مرة أو أكثر. |
{N,M}
|
سيطابَق العنصر السابق N مرة على الأقل، لكن ليس أكثر من M مرة. |
-
|
يمثل هذا المعاملُ المدى (range) إن لم يكن أول أو آخر عنصر في قائمة، أو نقطة النهاية لمدىً في قائمة. |
^
|
يطابق هذا المحرفُ النص الفارغ في بداية سطر ما، كما يمثل المحارف التي ليست في مدى قائمة ما. |
$
|
يطابق هذا المحرف النص الفارغ في نهاية سطر ما. |
\b
|
يطابق هذا المحرفُ النصَّ الفارغ (empty string) في نهاية كلمة. |
\B
|
يطابق النص الفارغ إن لم يكن في نهاية كلمة. |
\<
|
يطابق النص الفارغ في بداية كلمة. |
\>
|
يطابق النص الفارغ في نهاية كلمة. |
يمكن وضع تعبيرين نمطيين في تسلسل (concatenation)، ويكون التعبير الناتج مطابِقًا لأي نص (string) تكوَّن بتسلسل نصيْن فرعيين مطابقيْن -بالترتيب- لتعبيريْن فرعيين متسلسليْن. كذلك يمكن ربط تعبيريْن نمطيين بمعامل الحرف المَزيد |
، ويطابق التعبير النمطي الناتج أي نص مطابق لأي من التعبيريْن.
للتكرار (Repitition) أولوية أعلى من التسلسل (Concatenation)، والتسلسل بدوره له أولوية أعلى من التناوب (Alternation). ولإلغاء قاعدة الأولوية تلك يمكن وضع تعبير فرعي بالكامل بين قوسين ()
.
الفرق بين التعبير النمطي الأساسي والممتد
تفقد المحارف الخاصة التالية معناها في التعابير النمطية الأساسية (Basic Regular Expression): ?
، +
، {
، |
، (
، )
، وتُستخدم نفس المحارف مسبوقة بشرطة مائلة خلفية بدلًا من ذلك ?\
, +\
, {\
, |\
, (\
, )\
. انظر توثيق النظام لديك لترى أي الأوامر التي تستخدم التعابير النمطية تدعم التعابير الممتدة.
أمر grep
يبحث أمر grep
في ملفات المدخلات عن الأسطر التي تحتوي على تطابقات لقائمة أنماط (patterns) بعينها، وحين يجد تطابقًا في أحد الأسطر فإنه ينسخ السطر إلى مخرج قياسي (standard output) افتراضيًا أو إلى أي مخرج آخر تطلبه باستخدام الخيارات التي قد تضيفها إلى الأمر.
ورغم أن أمر grep
يتوقع أن يجري التطابقات على النصوص إلا أنه ليس له قيود على طول سطر المدخلات باستثناء الذاكرة المتاحة، ويمكنه مطابقة المحارف العشوائية (arbitrary characters) داخل السطر، وإن كان آخر بايت من ملف مدخلات ليس سطرًا جديدًا (newline) فإن grep
يضيف واحدًا تلقائيًا. كذلك لا يمكن مطابقة محارف السطر الجديد في نص بما أن السطر الجديد يُعد فاصلًا لقائمة الأنماط. إليك بعض الأمثلة:
hsoub ~> grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
hsoub ~> grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin
hsoub ~> grep -v bash /etc/passwd | grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/var/spool/news:
mailnull:x:47:47::/var/spool/mqueue:/dev/null
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
rpc:x:32:32:Portmapper RPC user:/:/bin/false
nscd:x:28:28:NSCD Daemon:/:/bin/false
named:x:25:25:Named:/var/named:/bin/false
squid:x:23:23::/var/spool/squid:/dev/null
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
apache:x:48:48:Apache:/var/www:/bin/false
hsoub ~> grep -c false /etc/passwd
7
hsoub ~> grep -i ps ~/.bash* | grep -v history
/home/hsoub/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "
- يعرض المستخدم
hsoub
الأسطر التي تحتوي نصroot
منetc/passwd/
. - ثم يعرض أرقام الأسطر التي تحتوي على ذلك النص.
- ثم ينظر في الأمر الثالث أي المستخدمين لا يستخدمون bash، لكن لا يتم عرض الحسابات التي تستخدم صدفة
nologin
. - ثم يحسب عدد الحسابات التي صدفاتها
bin/false/
. - أما سطر الأوامر الأخير فيعرض الأسطر التي تبدأ بـ
bash./~
من كل الملفات الموجودة في مجلد المنزل للمستخدمhsoub
، باستثناء التطابقات التي تحتوي على نصhistory
، بما في ذلك استبعاد التطابقات التي من ملفbash_history./~
بما أنه قد يحتوي على نفس المقطع النصي سواء في حالتيه الصغرى (lowercase) والكبرى (uppercase). لاحظ أيضًا أن البحث عن نصps
وليس عن أمرps
.
أمر grep والتعبيرات النمطية
إن كنت على نظام تشغيل خلاف لينكس
نحن نستخدم أمر
grep
الخاص بنظام جنو في هذه الأمثلة، والذي يدعم التعبيرات النمطية الممتدة، وأمرgrep
من نظام جنو هو الافتراضي على أنظمة لينكس، فانظر -إن كنت تعمل على أنظمة غير لينكس- أي إصدار لديك باستخدام خيارV-
. يمكن تحميلgrep
الخاص بنظام جنو من https://gnu.org/directory.