تطبيق رأس Unix على أمر OWK من خلال Finding Command
سؤال
أرغب في إخراج أفضل 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
.