سؤال

أرغب في إخراج أفضل 10 أسطر من أمر AWK في قائمة الملفات المقدمة بواسطة Find ، باستخدام هذا المقتطف:

$ find . -name "*.txt" -print -exec awk '$9 != ""'  \| head -n10 {} \;

لاحظ أيضًا أنني أريد طباعة أسماء الملفات التي يتم معالجتها.

لكن لماذا أحصل على مثل هذا الخطأ:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt

ما هي الطريقة الصحيحة للقيام بذلك؟

حاولت بدون انتشار خلفي قبل الأنبوب. لا يزال يعطى خطأ:

find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory
هل كانت مفيدة؟

المحلول

إذا كنت ترغب في تشغيل برنامج AWK على كل ملف من العثور على أنه يطبع فقط الأسطر العشرة الأولى كل مرة.

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;

نصائح أخرى

عند تشغيل أمر مع Find's -exec ، لا تحصل على جميع الأشياء اللطيفة مثل مشغل الأنابيب (|). يمكنك استعادتها عن طريق تشغيل Subshell بشكل صريح إذا كنت ترغب في ذلك ، على سبيل المثال:

تجد . -name '*.txt' -exec /bin /sh -c "echo ملف نصي يسمى {} | head -n 15" ؛

بناءً على إجابة أشاولي:

find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;

يجب أن يكون أداء أفضل ، مع خروجنا من السجل العاشر.

استخدام awk يجب أن تعمل فقط:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;

يمكنك أن تفعل ذلك بهذه الطريقة أيضًا:

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {}  \;

بدون head.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top