একবারে একাধিক ফাইল টেলিং করার সময় প্রতিটি লাইনের সূচনা করার সময় ফাইলের নাম দেখান?


14

নীচে দেখানো হয়েছে এমন একাধিক ফাইল টেলিং করার সময়, প্রতিটি লাইনের শুরুতে ফাইলের নামটি দেখানোর কোনও উপায় আছে কি?

tail -f one.log two.log

বর্তমান আউটপুট

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

এরকম কিছু খুঁজছি

one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...

আপনি -vলেজের জন্য (ভার্বোস) বিকল্পটি দেখতে পারেন । এটি আপনার জিজ্ঞাসার সাথে ঠিক মেলে না, তবে এটি শুরু।
রাহুল

মাল্টিটেল এটি করতে পারে বলে আমি মনে করি
গিলস

উত্তর:


7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ ধন্যবাদ {don_cristti}


@ ডন_ক্রিসটি, আপনাকে ধন্যবাদ! (1) একটি বনাম ফাইল - আমার গ্লাসে আর ওয়াইন নেই! (2) ভাল ধারণা। আমি এই জাতীয় কিছু করতে শুরু করি তবে আমি আমার আত্মাকে বলেছিলাম "স্পেস দিয়ে কেউ পুচ্ছ-ফাইল তৈরি করবে না" :) - আমি আপনার দুর্দান্ত পরামর্শগুলি ব্যবহার করব।
জাজাও

আপনি দৈর্ঘ্য -8 ব্যাখ্যা করতে পারেন? এটি এখানে 8 কেন, আমি কেবল 8 টি কাজ জানি।
শিচেং গুও

1
লেজ -n 1 * .txt | awk '/ ^ ==> / {a = সাবস্ট্রিট ($ 0, 5, দৈর্ঘ্য -8); পরবর্তী} {একটি মুদ্রণ করুন, $ 1} '| awk '$ 2> 0 {if ($ 2! ch / chrY /) print 1}' প্রিন্ট করুন | xargs -I {} qsub {}
গুও

@ শিচেংগুও, ৮ = দৈর্ঘ্য ("==>") + দৈর্ঘ্য ("<==")
জয়াওও

1
আশ্চর্য / আশ্চর্যরূপে আপনার joojoo ম্যাজিক awkসমাধান কাজ করে!
ট্রেভর বয়ড স্মিথ

6

সংক্ষিপ্ত উত্তর

জিএনইউ সমান্তরালে চমৎকার বিকল্পগুলির একটি সেট রয়েছে যা এ জাতীয় কাজগুলি করা সহজ করে তোলে:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

আউটপুটটি হবে:

one.log: এক.লগের বিষয়বস্তু এখানে ...
one.log: এক.লগের বিষয়বস্তু এখানে ...
two.log: two.log এর বিষয়বস্তু এখানে ...
two.log: two.log এর বিষয়বস্তু এখানে ...

আরও ব্যাখ্যা

  • বিকল্পটি --tagstring=strপ্রতিটি আউটপুট লাইনে স্ট্রিং স্ট্র সঙ্গে ট্যাগ করে । parallel ম্যান পৃষ্ঠা থেকে :
--tagstring str
                স্ট্রিং সহ লাইনগুলি ট্যাগ করুন। প্রতিটি আউটপুট লাইন দিয়ে আবার চাপ দেওয়া হবে
                str এবং TAB (\ t)। str এ প্রতিস্থাপন স্ট্রিং যেমন {} থাকতে পারে}

                -u, --onall এবং --nonall ব্যবহার করার সময় --tagstring এড়ানো হবে।
  • সমস্ত ঘটনা {}সমান্তরাল যুক্তিগুলির দ্বারা প্রতিস্থাপন করা হবে যা এই ক্ষেত্রে লগ ফাইলের নাম; যেমন one.logএবং two.log(পরে সমস্ত যুক্তি :::)।

  • বিকল্পটি --line-bufferপ্রয়োজনীয় কারণ কোনও কমান্ডের আউটপুট (যেমন tail -f one.logবা tail -f two.log) মুদ্রণ হবে যদি সেই কমান্ডটি শেষ হয়। যেহেতু tail -fফাইল বৃদ্ধির জন্য অপেক্ষা করবে, --line-bufferতাই লাইন ভিত্তিতে আউটপুট প্রিন্ট করা প্রয়োজন যা এটি করে। parallel ম্যান পেজ থেকে আবার :

- লাইন-বাফার (আলফা পরীক্ষা)
                লাইনের ভিত্তিতে বাফার আউটপুট। --গ্রুপ আউটপুট রাখবে
                পুরো কাজের জন্য একসাথে --ungroup আউটপুট সাথে মিশ্রিত করতে দেয়
                একটি কাজ থেকে আসা অর্ধেক লাইন এবং অর্ধেক লাইন আসছে
                অন্য চাকুরী. - লাইন-বাফার এই দুটিয়ের মধ্যে ফিট করে: জিএনইউ সমান্তরাল
                একটি সম্পূর্ণ লাইন মুদ্রণ করবে, তবে এর লাইন মিশ্রনের অনুমতি দেবে
                বিভিন্ন কাজ

2

যদি tailবাধ্যতামূলক না হয় তবে আপনি এটি grepঅর্জন করতে ব্যবহার করতে পারেন :

grep "" *.log

এটি প্রতিটি আউটপুট লাইনের উপসর্গ হিসাবে ফাইলের নাম মুদ্রণ করবে।

*.logশুধুমাত্র একটি ফাইলে প্রসারিত হলে আউটপুট বিরতি । এই বিষয়ে:

grep '' /dev/null *.log

আমি আউটপুট ফাইল নাম দেখাতে প্রয়োজন tail -fনা grep
mtk

@ সেরনেস্যাট এটি কেবল ফাইলগুলির পুরো বিষয়বস্তু মুদ্রণ করবে না? ওপি লেজটি নির্দিষ্ট করা হলে ফাইলের নাম মুদ্রণের জন্য জিজ্ঞাসা করছিল
রাহুল

আপনি কেবলমাত্র করতে পারেন --with-filenameবা -Hসর্বদা ফাইলের নাম প্রিপেন্ড করতে বাধ্য করতে পারেন ।
ট্রেভর বয়ড স্মিথ

আমি সত্যিই এই উত্তর ভালবাসি! 13 অক্ষরের দৈর্ঘ্যের মতো সমাধানের সাথে ঠিক যা প্রয়োজন তা হুবহু করে তোলে। কৌশলযুক্ত awkসমাধানের বিপরীতে বা parallelযা ইনস্টল করা হয়নি।
ট্রেভর বয়ড স্মিথ

কেবলমাত্র সমস্যাটি হ'ল যদি আপনার লগফাইলগুলি 1 মিলিয়ন লাইন দীর্ঘ হয়। তারপরে আপনার গ্রেপটি কনসোল করার জন্য 1 মিলিয়ন লাইন স্প্যাম করবে (বা ওভার ssh) ...
ট্রেভর বয়েড স্মিথ

0

আমার ধারণাটি হ'ল বেশ কয়েকটি ফাইল থেকে মার্জড লগ সহ একটি একক ফাইল তৈরি করা হবে, যেমন কেউ এখানে পরামর্শ দিয়েছেন এবং ফাইলের নামগুলি পূর্বনির্ধারিত করেছেন:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG

0

সঙ্গে কিছু xargsএবং sedকাজ করতে পারে:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.