كيف يمكنك إدخال أنبوب من خلال البقرى إلى آخر الأداة المساعدة ؟
سؤال
أنا باستخدام 'tail -f' لمتابعة ملف السجل كما انها تحديثه ؛ أنا القادم الأنابيب إخراج هذا البقرى فقط لاظهار الخطوط التي تحتوي على مصطلح البحث ("org.springframework" في هذه الحالة).أخيرا أود أن جعل الأنابيب الإخراج من البقرى إلى أمر ثالث, 'قطع':
tail -f logfile | grep org.springframework | cut -c 25-
الأمر قص إزالة 25 أول حرف من كل سطر بالنسبة لي إذا كان يمكن الحصول على مدخلات من grep! (يعمل كما هو متوقع إذا كنت القضاء على 'البقرى' من السلسلة.)
أنا باستخدام cygwin مع باش.
النتائج الفعلية:عندما أقوم بإضافة الثانية الأنابيب للاتصال 'قطع' الأمر ، والنتيجة هي أنه توقف ، كما لو كان في انتظار الإدخال (في حال كنت أتساءل).
المحلول
على نظامي، تم تخزين حوالي 8K قبل أن أحصل على أي إخراج. عمل هذا التسلسل لمتابعة الملف على الفور:
tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
نصائح أخرى
على افتراض جنو البقرى ، إضافة --line-buffered
إلى سطر الأوامر الخاص بك, على سبيل المثال.
tail -f logfile | grep --line-buffered org.springframework | cut -c 25-
تحرير:
أرى البقرى التخزين المؤقت ليس المشكلة الوحيدة هنا ، كما قطع لا تسمح linewise التخزين المؤقت.
قد ترغب في محاولة استبدالها شيء يمكنك التحكم مثل sed:
tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p'
أو awk
tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}'
ما يجب أن تعمل بشكل جيد - هذه هي الفكرة بأكملها لخطوط الأنابيب. المشكلة الوحيدة التي أراها هي أنه في إصدار cut
لدي (GNU COSEUTILE 6.10)، يجب عليك استخدام بناء الجملة cut -c 25-
(أي استخدام علامة ناقص بدلا من علامة زائد) لإزالة أول 24 حرفا.
أنت أيضا تبحث عن أنماط مختلفة في الأمثلة الخاصة بك، في حالة صلة بها.