كيف تستخرج الأسطر ذات عدد الحروف المحدد من ملف نصي في لينكس ؟
واجهت هذا الإحتياج عندما كنت أريد استخراج كل الأسطر من ملف نصي التي تحتوى على عدد معين من الحروف والأرقام. بحثت على الإنترنت لإيجاد حلول وجربت كل الطرق التي وجدتها على الإنترنت. وهذا ما وجدته.
استخدام grep 🔗
أمر grep هو برنامج يعمل على واجهة سطر الأوامر وهو مخصص للبحث في ملف نصيّ عن الأسطر التي ينطبق عليها الـ regular expression المحدد. اسم grep تكون من أمر ed وهو g/re/p (global regular expression search and print) الذي يقوم بنفس الوظيفة.
لكي تستخدم grep ، نضيف -E
وبعدها نكتب الـ regular expression لكي نحصل على الأسطر التي تتوافق معه ؛ في حالتنا هي الأسطر التي تحتوي على عدد محدد من الحروف والأرقام.
هذا هو الأمر الذي يعطينا الأسطر ذات الحرف الواحد أو الرقم الواحد في داخل الملف النصيّ pt.txt
:
grep -E '^.{1}$' pt.txt
وهذا هو الأمر الذي يستخلص لنا الأسطر التي تحتوي على حرفين فقط أو رقمين فقط أو حرف ورقام (أي رمزين فقط) من ملف النص pt.txt
:
grep -E '^.{2}$' pt.txt
وهذا هو الأمر الذي يستخلص لنا كل الأسطر النصيّة التي تحتوى على 8 حروف فقط من الملف النصيّ pt.txt
:
grep -E '^.{8}$' pt.txt
استخدام egrep 🔗
الأمر egrep هو عبارة عن سكربت مخصص لتشغيل الأمر grep -E
.
لذلك نستطيع استخدام الأمر بهذا الشكل.
egrep '^.{1}$' pt.txt
في الأمر السابق ، سيتم استخراج كل الأسطر التي طوالها حرفين فقط.
إليك الأمر الذي يستخرج لنا كل السطور التي تحتوى على 10 حروف فقط.
egrep '^.{10}$' pt.txt
استخدام awk 🔗
برنامج AWK يُنطق (/ɔːk/) وهي لغة مخصصة للتعامل مع النصوص، وغالباً تستخدم في استخراج البيانات وإنشاء التقارير. تشبه في وظيفتها برنامجيّ sed و grep ، أي أنها مخصصة للبحث في النصوص ، وتجدها دائماً في أنظمة التشغيل الشبيهة بـ يونيكس.
لكي نحصل على طول السطر الحالي في الملف النصيّ ، نستخدم الفانكشن length()
في لغة أوك awk. وبذلك نستطيع أن نقارن طول السطر وهو عدد الحروف فيه مع الرقم الذي نريده. لو كانت المقارنة متوافقة فإن لغة أوك awk تطبع السطر (وهذا هو السلوك الإفتراضي للغة). وهذا هو المطلوب. دعونا نكتب الأمر.
awk 'length() == 4' pt.txt
في الأمر السابق ، ستقوم أداة awk بطباعة (استخراج) كل السطور التي تحتوى على 4 حروف فقط (طول السطر 4 رموز أو حروف أو أرقام).
إن أردت استخلاص كل السطور التي تحتوى على 12 حرف ، استخدم هذا الأمر بلغة أوك awk.
awk 'length() == 12' pt.txt
الإستخدامات 🔗
مهمة استخراج الأسطر ذات الطول المحدد من الملف النصيّ مهمة شائعة جداً في مجالات وصناعات كثيرة منها علم البيانات وتحليل البيانات وأمن المعلومات وغيرها من المجالات.
خبراء أمن المعلومات يستخدموا هذه الطريقة لإستخراج كلمات المرور (passwords) ذات طول محدد من قاعدة بيانات نصية (ملف نصيّ كبير).
ملاحظات 🔗
دقة النتائج 🔗
واجهت مشكلة غريبة أثناء استخدام الثلاث أدوات. أداة Awk دائماً تستخرج نتائج أكثر من grep و egrep. وهذه النتائج صحيحة بالفعل.
لماذا لا تقوم grep بإستخلاص كل النتائج ؟ للأسف ، لا أعرف الإجابة.
الأداء وسرعة التنفيذ 🔗
لاحظت شيئاً آخر وهو أن أداة awk بطيئة جداً مقارنةً بـ grep (أو egrep). الأمر الذي يستخدم أداة grep يتم تنفيذه في 47 مللي ثانية ، والأمر الذي يستخدم egrep يتم إتمامه في 48 مللي ثانية. ولكن الأمر الذي يستخدم أداة أووك awk يتم تنفيذه في أكثر من 12 ثانية. لذلك فإن أداة awk بطيئة جداً جداً مقارنةً بـ grep.
رأيي وتفضيلاتي 🔗
أنا أفضل استخدام أداة لغة أووك awk أكثر من grep في هذه الحالة ﻷنها أدق في النتائج بناءاً على التجارب التي قمت بها بنفسي. البطء في تنفيذ أوامر أووك awk مقبول بالنسبالي ﻷنه لا يوجد بديل بنفس الدقة أعرفه.
أتمنى أن تكون قد استفدت من الموضوع ، إن كنت تعرف أي شخص يُمكنه الإستفادة من هذه المعلومات، ارسل له رابط هذا المقال. إن أردت معرفة الموضوعات الجديدة بعد نشرها مباشرةً على موقع أبانوب حنا ، تابعني على يوتيوب و تيليجرام ، و فيسبوك ، و واتساب .