روابط سريعة
إن حساب عدد الأسطر والكلمات والبايتات في الملف مفيد، ولكن المرونة الحقيقية لنظام Linux wc يأتي الأمر من خلال العمل مع أوامر أخرى. دعنا نلقي نظرة.
ما هو الأمر wc؟
ال wc يعد الأمر تطبيقًا صغيرًا. وهو أحد أدوات Linux الأساسية، لذا لا توجد حاجة إلى تثبيته. سيكون موجودًا بالفعل على جهاز الكمبيوتر الذي يعمل بنظام Linux.
يمكنك وصف ما يفعله بكلمات قليلة جدًا. فهو يحسب الأسطر والكلمات والبايتات في ملف أو مجموعة مختارة من الملفات ويطبع النتيجة في نافذة طرفية. كما يمكنه أيضًا أخذ مدخلاته من دفق STDIN، مما يعني أنه يمكن توجيه النص الذي تريد معالجته إليه. وهنا يأتي دور wc يبدأ بالفعل بإضافة قيمة.
إنه مثال رائع لمبدأ “افعل شيئًا واحدًا وافعله جيدًا” في نظام Linux. ولأنه يقبل الإدخال المباشر، فيمكن استخدامه في التعويذات متعددة الأوامر. وكما سنرى، فإن هذه الأداة الصغيرة المستقلة هي في الواقع أداة رائعة للعمل الجماعي.
طريقة واحدة أستخدمها wc يُستخدم كعلامة نائبة في أمر معقد أو اسم مستعار أقوم بإعداده. إذا كان الأمر النهائي يحتمل أن يكون مدمرًا ويحذف الملفات، فأنا غالبًا ما أستخدم wc كبديل للأمر الحقيقي الخطير.
بهذه الطريقة، أثناء تطوير الأمر، أحصل على ملاحظات مرئية تفيد بأن كل ملف يتم معالجته كما توقعت. لا توجد فرصة لحدوث أي شيء سيئ أثناء صراعي مع قواعد اللغة.
بسيطة مثل wc ولكن لا يزال هناك بعض التفاصيل الصغيرة التي تحتاج إلى معرفتها.
البدء مع wc
أبسط طريقة للاستخدام wc هو تمرير اسم ملف نصي على سطر الأوامر.
wc lorem.txt
هذا يسبب wc لمسح الملف وحساب الأسطر والكلمات والبايتات وكتابتها في نافذة المحطة الطرفية.
تعتبر الكلمات أي شيء محصورًا بمسافة بيضاء. وسواء كانت كلمات من لغة حقيقية أم لا، فهذا لا يهم. إذا كان الملف لا يحتوي على شيء سوى “frd g lkj”، فإنه لا يزال يُحسب على أنه ثلاث كلمات.
الأسطر عبارة عن تسلسلات من الأحرف تنتهي إما بعلامة إرجاع أو بنهاية الملف. لا يهم إذا كان السطر يلتف في محرر النصوص الخاص بك أو في نافذة المحطة الطرفية، حتى wc إذا واجهنا إرجاع عربة أو نهاية الملف، فسيظل نفس السطر.
لقد وجدنا في مثالنا الأول سطرًا واحدًا في الملف بأكمله. هذا هو محتوى ملف “lorem.txt”.
cat lorem.txt
كل ذلك يعتبر سطرًا واحدًا لأنه لا توجد علامات إرجاع. قارن هذا بملف آخر، “lorem2.txt”، وكيف wc يفسرها.
wc lorem2.txt
cat lorem2.txt
هذه المرة، wc يحسب 15 سطرًا لأن علامات الإرجاع قد تم إدراجها في النص لبدء سطر جديد عند نقاط معينة. ومع ذلك، إذا قمت بعدّ الأسطر التي تحتوي على نص، فستجد أن هناك 12 سطرًا فقط.
الأسطر الثلاثة الأخرى عبارة عن أسطر فارغة في نهاية الملف. تحتوي هذه الأسطر على علامات إرجاع فقط. ورغم عدم وجود نص في هذه الأسطر، فقد تم بدء سطر جديد وبالتالي wc يعدهم كذلك.
يمكننا تمرير عدد كبير من الملفات إلى wc كما نحب.
wc lorem.txt lorem2.txt
نحصل على الإحصائيات لكل ملف فردي وإجمالي جميع الملفات.
يمكننا أيضًا استخدام أحرف البدل حتى نتمكن من تحديد الملفات المطابقة بدلاً من الملفات المسماة صراحةً.
wc *.txt *.?
خيارات سطر الأوامر
افتراضيا، wc سيعرض الأسطر والكلمات والبايتات في كل ملف. الأمر يشبه استخدام -l (خطوط) -w (الكلمات) و -c خيارات (البايت).
wc lorem.txt
wc -l -w -c lorem.txt
يمكننا تحديد مجموعة الأرقام التي نرغب في رؤيتها.
wc -l lorem.txtwc -w lorem.txt
wc -c lorem.txt
wc -l -c lorem.txt
ينبغي إيلاء اهتمام خاص للرقم الأخير الذي تم إنشاؤه بواسطة -c خيار (بايتات). يخطئ كثير من الناس في اعتبار هذا الخيار عدًا للأحرف. في الواقع، يحسب البايتات. قد يكون عدد الأحرف وعدد البايتات هو نفسه. ولكن ليس دائمًا.
دعونا نلقي نظرة على محتويات الملف المسمى “unicode.txt”.
cat unicode.txt
تحتوي على ثلاث كلمات وحرف أبجدي غير لاتيني. دعنا نتعرف على wc معالجة الملف بإعداده الافتراضي للبايتات، وسنفعل ذلك مرة أخرى ولكن نطلب الأحرف التي تحتوي على -m خيار (الحروف).
wc unicode.txt
wc -l -w -m unicode.txt
هناك بايتات أكثر من عدد الأحرف.
دعنا نلقي نظرة على ملف التفريغ السداسي عشري للملف ونرى ما يحدث. hexdump الأوامر -C يعرض الخيار (canonical) البايتات الموجودة في الملف في أسطر مكونة من 16 بايتًا، مع إظهار معادلها العادي بتنسيق ASCII (إن وجد) في نهاية السطر. إذا لم يكن هناك حرف ASCII مطابق، يتم وضع نقطة “.” يظهر بدلا من ذلك.
hexdump -C unicode.txt
في ASCII، قيمة سداسية عشرية لـ 0x20 يمثل حرف مسافة. إذا أحصينا ثلاث قيم من اليسار، فسنرى أن القيمة التالية هي حرف مسافة. لذا فإن القيم الثلاث الأولى 0x62, 0x6f، و 0x79 تمثل الحروف الموجودة في كلمة “boy”.
القفز فوق 0x20نرى مجموعة أخرى من ثلاث قيم سداسية عشرية: 0x63, 0x61، و 0x74. هذه القيم تهجئ كلمة “قطة”. عند القفز فوق حرف المسافة التالي، نرى ثلاث قيم أخرى للحروف في كلمة “كلب”. هذه هي 0x64, 0x5f، و 0x67.
خلف كلمة “كلب” مباشرة يمكننا أن نرى حرف المسافة 0x20، وخمس قيم سداسية عشرية أخرى. القيمتان الأخيرتان عبارة عن إرجاعات عربة، 0x0a.
تمثل البايتات الثلاثة الأخرى الحرف غير اللاتيني، والذي قمنا بتظليله باللون الأخضر. إنه حرف Unicode، ويستغرق ترميزه ثلاثة بايتات. هذه هي 0xe1, 0xaf، و 0x8a.
لذا تأكد من معرفة ما تعده، وأن البايتات والأحرف لا يجب أن تكون متماثلة. عادةً، يكون عد البايتات أكثر فائدة لأنه يخبرك بما يوجد بالفعل داخل الملف. يمنحك العد بالأحرف عدد الأشياء التي تمثلها محتويات الملف.
أخذ أسماء الملفات من ملف
هناك طريقة أخرى لتوفير أسماء الملفات إلى wc يمكنك وضع أسماء الملفات في ملف، وتمرير اسم هذا الملف إلى wcيفتح الملف ويستخرج أسماء الملفات ويعالجها كما لو تم تمريرها عبر سطر الأوامر. يتيح لك هذا تخزين مجموعة عشوائية من أسماء الملفات لإعادة استخدامها.
لكن هناك مشكلة كبيرة، وهي أن أسماء الملفات يجب أن تنتهي بعلامة فارغة، وليس بعلامة إرجاع السطر. أي أنه بعد كل اسم ملف يجب أن يكون هناك بايت فارغ من 0x00 بدلاً من بايت إرجاع العربة المعتاد 0x0a.
لا يمكنك فتح محرر وإنشاء ملف بهذا التنسيق. عادةً ما يتم إنشاء ملفات مثل هذه بواسطة برامج أخرى. ولكن إذا كان لديك مثل هذا الملف، فهذه هي الطريقة التي يمكنك استخدامه بها.
هذا هو ملفنا الذي يحتوي على أسماء الملفات. فتحه في less يظهر لك الغريب^@“الشخصيات التي less يستخدم للإشارة إلى البايتات الفارغة.
less source-files-list.txt
لاستخدام الملف مع wc، نحن بحاجة إلى استخدام --files0-from (قراءة الإدخال من) الخيار وتمرير اسم الملف الذي يحتوي على أسماء الملفات.
wc ---files0-from=source-files-list.txt
يتم معالجة الملفات تمامًا كما لو تم توفيرها على سطر الأوامر.
مدخل الأنابيب إلى المرحاض
طريقة أكثر شيوعًا ومرونة وإنتاجية لإرسال المدخلات إلى wc هو توجيه الإخراج من الأوامر الأخرى إلى wc يمكننا أن نثبت ذلك من خلال echo يأمر.
echo "Count this for me" | wc
echo -e "Count this\nfor me" | wc
الثاني echo يستخدم الأمر -e خيار (الأحرف الهاربة) للسماح بالتسلسلات الهاربة مثل “\n“كود تنسيق السطر الجديد. يؤدي هذا إلى إدخال سطر جديد، مما يتسبب في wc لرؤية المدخلات كسطرين.
فيما يلي سلسلة من الأوامر التي تنقل مدخلاتها من واحد إلى الآخر.
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
- يجد يبحث عن الملفات (
type -f) بشكل متكرر، بدءًا من الدليل الحالي.revيعكس أسماء الملفات. - يقطع يستخرج الحقل الأول (
-f1) عن طريق تحديد فاصل الحقل ليكون نقطة “.“والقراءة من “”واجهة”” اسم الملف المعكوس حتى النقطة الأولى التي يجدها. لقد استخرجنا الآن امتداد الملف. - مراجعة يعكس الحقل المستخرج الأول.
- نوع يقوم بتصنيفهم حسب الترتيب الأبجدي التصاعدي.
- فريد من نوعه يسرد الإدخالات الفريدة لنافذة المحطة الطرفية.
يقوم هذا الأمر بإدراج جميع ملحقات الملفات الفريدة الموجودة في الدليل الحالي وأي أدلة فرعية.
إذا أضفنا -c (العدد) الخيار ل uniq سيؤدي الأمر إلى حساب عدد مرات ظهور كل نوع من أنواع الامتدادات. ولكن إذا أردنا معرفة عدد امتدادات الملفات المختلفة والفريدة، فيمكننا إسقاط wc كآخر أمر على السطر، واستخدم -l خيار (الخطوط).
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l
وأخيرا
وهنا خدعة أخيرة wc يمكنه أن يفعل ذلك من أجلك. سيخبرك بطول أطول سطر في الملف. للأسف، لا يخبرك بالسطر الذي هو عليه. إنه يعطيك فقط طوله.
wc -L taf.c
لكن انتبه، فعلامات التبويب تُحسب على أنها ثماني مسافات. وعند عرضها في محرر النصوص الخاص بي، ستجد ثلاث علامات تبويب بمسافتين في بداية هذا السطر. ويبلغ طولها الحقيقي 124 حرفًا. لذا فإن الرقم المذكور موسع بشكل مصطنع.
أود أن أتعامل مع هذه الوظيفة بحذر شديد. وأعني بذلك عدم استخدامها. فنتائجها مضللة.
على الرغم من غرابتها، wc تُعد أداة رائعة لإسقاطها في الأوامر الموجهة عندما تحتاج إلى حساب كافة أنواع القيم، وليس فقط الكلمات الموجودة في ملف.