ma.pets-trick.com
معلومة

أمر القط في لينكس

أمر القط في لينكس


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


أمر القط في لينكس

أنا أعمل على جزء من البيانات يتم تلقيه عبر أنابيب متعددة من برامج أخرى.

أعمل حاليًا على استخراج البيانات التي أرغب في العمل عليها من الأنابيب. قررت استخدام الأمر sed لأنه سيسمح لي بإجراء العمليات الأساسية ، مثل ما يلي:

cat file1 | sed -e 's / foo / bar /' -e 's / foo / bar /' | sed -e 's / foo / bar /'

سيأخذ الأمر sed ببساطة من الإدخال الأول ما بين foo و bar ، ويأخذ من الإدخال الثاني ما بين foo و bar ، ويأخذ من الإدخال الثالث ما بين foo و bar.

السؤال هو:

هل هذا أمر معقول للاستخدام؟ لقد رأيت الكثير من برامج bash / shell المستخدمة للعمل على الملفات ، لكنني أتساءل عما إذا كان من الممكن القيام بنفس الشيء باستخدام أمر shell.

أ:

حسنًا ، سيكون الأمر جيدًا مع الأحرف الفردية - مثل هذا:

صدى فو | sed 's / foo / bar /'

لكنها ليست مفيدة للغاية - إلا إذا كنت ترغب في استخراج كل ملف في عملية منفصلة - وليس لديك الأنابيب الخاصة بك كوسيطات للأوامر الأخرى.

لاستخراج كل ملف على حدة ، يمكنك قراءة كل ملف سطرًا بسطر ومعالجة كل ملف:

#! / بن / باش

بالنسبة لي في {1..3} ، قم بذلك

& lt، / dev / stdin done & lt، "$ 1"

& lt، / dev / stdin done & lt، "$ 2"

& lt، / dev / stdin done & lt، "$ 3"

قطة $ أنا

انتهى

نظرًا لأنه ليس جيدًا للبرامج النصية الطويلة والأنابيب - أفضل - استخرج جميع الملفات (باستثناء الملف الأخير) باستخدام أمر القطع:

بالنسبة لي في {1..2} ، قم بذلك

& lt ، / dev / stdin |

أثناء قراءة اسم الملف ، قم بذلك

قص -f1 $ filename

انتهى

انتهى

أ:

تتمثل إحدى مشكلات أسلوبك في أنك ستستعيد محتويات foo ، بغض النظر عما إذا كان foo يحتوي على أي أسطر جديدة. بمعنى ، إذا كان foo يحتوي على 3 أسطر جديدة فيه:

فو

... وإذا أرسلت محتويات foo مرة أخرى عبر خط أنابيب ، فسينتهي بي الأمر بثلاثة أسطر من foo ، وليس 3 خطوط foo مع سطر جديد واحد ، وهو ما أريده.

المشكلة الأخرى هي أنك لن تكون قادرًا على معرفة من أين بدأ سطر واحد وانتهى الآخر. افترض أن لديك ملفًا بداخله:

abc

def

غي

إذا قمت بتشغيل الأمر الخاص بك ، فسوف ينتهي بي الأمر بهذا:

abc

ghe

... لكنني في الواقع أريد هذا:

abc

def

غي

الآن طريقة الحصول على نسخة "قائمة على الكلمات" من اسم الملف هي استخدام التعبيرات النمطية الموسعة. فيما يلي مثال باستخدام الأمر awk:

& lt ، / dev / stdin | awk -v RS = '' '{print "" "$ 0" ""}'

والتي ينتج عنها ما يلي:

"abc"

"def"

"ghi"

لدمج هذا في البرنامج النصي الخاص بك ، استبدل حلقة while بأمر awk التالي:

أثناء قراءة اسم الملف ، افعل

& lt ، / dev / stdin |

awk -v RS = '' '{print "" "$ 0" ""}'

انتهى

... ولتجنب إرسال محتويات الملف مرة أخرى ، قم بتغيير الكود الذي يستدعي الأمر إلى هذا:

أثناء قراءة اسم الملف ، افعل

& lt ، / dev / stdin |

awk -v RS = '' '{print "" "$ 0" ""}' & gt، "$ filename"

انتهى

ينتج عن هذا الناتج التالي:

"abc"

"def"

"ghi"

بهذه الطريقة ، لن تتضمن مخرجاتك أي أسطر جديدة. إذا كنت لا تريد أي أسطر جديدة ، فاستخدم الأمر التالي بدلاً من ذلك:

أثناء قراءة اسم الملف ، قم بذلك

& lt ، / dev / stdin |

awk -v RS = '' '{print "" "$ 0" ""}' |

xargs -0 -I '{}' rm -f {}

انتهى

والتي ينتج عنها المخرجات التالية:

"abc"

"def"

"ghi"

... أو ، إذا كنت تستخدم bash:

أثناء قراءة اسم الملف ، قم بذلك

& lt ، / dev / stdin |

awk -v RS = '' '{print "" "$ 0" ""}' |

xargs -0 -I '{}' rm -f {}

انتهى

أ:

xargs -n 1 | awk '{print}' | xargs -0 دورة في الدقيقة -rf

يبدو هذا أكثر قابلية للنقل. لا تعتمد على باش.

أ:

يمكنك استخدام هذا السطر في bash للعثور على جميع الملفات ذات الامتداد ".txt" في دليلك الحالي وإزالتها:

ls * .txt | xargs -n1 -r rm -fv

أ:

استخدم أداة البحث المضمنة للبحث عن الملفات التي تطابق نمطًا معينًا:

تجد . -اسم '* .txt' -طباعة | xargs -n 1 rm -f

هذا محمول ، bash ، zsh ، ksh ، إلخ. له آلية مماثلة.

إذا كانت ملفاتك تحتوي على مسافات في أسمائها ، ومن المهم أن تكون النتيجة سطرًا واحدًا ، فاستخدم هذا الإصدار:

تجد . -اسم '* .txt' -print0 | xargs -0 -n 1 rm -fv

يعد خيار البحث -print0 جديدًا في معيار POSIX ، ولكنه مدعوم بالإصدارات الحديثة من البحث في معظم الأنظمة المتوافقة مع POSIX. يؤدي إلى طباعة النتائج على أسطر منفصلة. يستخدم إصدار xargs أعلاه الخيار -n 1 إلى xargs بحيث يتم إرسال نسخة واحدة من rm -fv إلى كل ملف ، بدلاً من نسخة واحدة لكل اسم ملف.

(في نظام التشغيل Mac OS X ، أعتقد أن البحث يأتي مع -print0 ولكن عليك تثبيت GNU find للحصول على -print0.)


شاهد الفيديو: Try Not To Laugh Challenge - Funny Cat u0026 Dog Vines compilation 2017