তালিকা হিসাবে 'ওয়াচ' কমান্ডের আউটপুট


27

লগ ফাইলে যুক্ত হওয়া প্রতি মিনিটে লাইনের সংখ্যার কিছু সাধারণ গণনা করতে চাই।

আমি প্রতিটি সেকেন্ডের জন্য গণনাও সঞ্চয় করতে চাই।

আমার যা দরকার তা হল নিম্নলিখিত কমান্ডের একটি তালিকা হিসাবে আউটপুট যা প্রতি সেকেন্ডে আপডেট হবে:

watch -n1 'wc -l my.log'

তালিকা হিসাবে 'ওয়াচ' কমান্ডের 'আপডেট' আউটপুট কিভাবে করবেন?

উত্তর:


24

আপনি -tস্যুইচটি ব্যবহার করতে পারেন watchযার কারণে এটি হেডার মুদ্রণ না করে। তবে এটি এখনও পর্দা সাফ করবে যাতে আপনি একটি সাধারণ শেল লুপ দিয়ে আরও ভাল হতে পারেন:

while sleep 1; do
    wc -l my.log
done

সুবিধাগুলির মধ্যে একটি হ'ল আপনি সহজেই অন্যান্য কমান্ড যুক্ত করতে পারেন (উদাঃ date) এবং / অথবা আউটপুটটিকে sedপুনরায় ফর্ম্যাট করার জন্য পাইপ করতে পারেন। যাইহোক, আপনি লুপের sleep 1সাথে অদলবদল করলে wcএটি স্বয়ংক্রিয়ভাবে ত্রুটিগুলি বন্ধ হয়ে যাবে।


তবে মনে রাখবেন যে এটা ঠিক প্রতি মাসের দ্বিতীয় করবে না (zsh বা ksh93 সঙ্গে, আপনি ঘুমন্ত সময় তাই ড্রিফট লুপ কমান্ড চলমান যথাযোগ্য জন্য অ্যাকাউন্ট হিসেবে সেগুলিকে সমন্বয়, পারে যদিও)
Stéphane Chazelas

2
@ স্টাফেন চ্যাজেলাস এটির সাথে নয় wait- কেবল চেষ্টা করুন watch -n 1 "sleep 5"
পিটারফ

প্রকৃতপক্ষে (আমি উভয় প্রোপস এবং ব্যস্তবক্স বাস্তবায়ন পরীক্ষা করেছি)। আমি ভেবেছিলাম যে এটিই ছিল একমাত্র জিনিসটির watchজন্য দরকারী, তবে এটি আপনাকে দেয় না যাতে আপনার সমাধানটি একটি ঘড়ির উপর ভিত্তি করে তৈরি করার মতোই ভাল তবে কোনওটি "সঠিকভাবে কোনও লগ ফাইল বাড়ায়" প্রশ্নের উত্তর দেয় না great
স্টাফেন চেজেলাস

ঠিক আছে, যদি প্রতি মিনিটে লাইনগুলি চূড়ান্ত লক্ষ্য হয়, তবে প্রতি 10 সেকেন্ডে একবার এটি নমুনা নেওয়া যথেষ্ট ইমো-এর চেয়ে বেশি - তাই ওভারহেড এতটা ভয়ঙ্কর নয় (যদি না ফাইলটি আসলেই বড় হয় তবে)। এবং প্রকৃতপক্ষে লুপের মধ্যে থেকে, কেউ সময় সংক্রান্ত তথ্য মুদ্রণ করতে পারে (কমান্ডের আগে ও প্রয়োজনের পরে উভয়ই শেষ হয়) এবং তারপরেও বড় ফাইলগুলির জন্য সঠিকতা আরও ভাল (প্রস্থের আদেশ) পেতে পারে।
পিটার্ফ

1
@ পিটারফের watchএকটি -pবিকল্প রয়েছে যা যথাযথভাবে এটি করবে, যদি সম্ভব হয় (স্পষ্টতই, আপনি কোনও কমান্ড করতে পারবেন না যা প্রতি 1 সেকেন্ডে 5 সেকেন্ড সময় নেয়, যদি আপনাকে একাধিক যুগপত অনুমতি না দেওয়া হয়)। আমি জানি, আমি এটি লিখেছি :
পি

8

একটি পুরানো প্রশ্ন, তবে আমি খুব সহজ উত্তর পেয়েছি:

watch -n1 'wc -l my.log | tee -a statistics.log'

এটি আপনার wcপ্রতিটি সেকেন্ডকে কার্যকর করবে , পরিসংখ্যান.লগ ফাইলটিতে এটির আউটপুট যুক্ত করবে এবং এটি স্ক্রিনে প্রদর্শন করবে।
সুতরাং, আপনি সংখ্যাগুলি পূর্ণ একটি ফাইল শেষ করবেন, এর পরের সংখ্যক লাইনের প্রতিনিধিত্ব করবেন my.log


দয়া করে মনে রাখবেন এই কমান্ড যে watch "($MYCMD | tee -a $MYLOG)", না watch "($MYCMD)" | tee -a $MYLOG। আমার মতো করেও যদি আপনি এই ভুল পেয়ে থাকেন তবে আউটপুটটি খুব বিভ্রান্তিকর হতে চলেছে। এখানে অন্য একটি বিষয় লক্ষণীয় হ'ল এই আদেশটি ডিফল্টরূপে প্রতিটি কমান্ডের সম্পাদনের টাইমস্ট্যাম্প যুক্ত করে না, তাই লুপের উত্তরটি এখনও আপনার পক্ষে আরও ভাল কাজ করতে পারে।
ffledgling



1

আমি যখন এই থেকে আরও ভাল / লগড আউটপুট পাওয়ার চেষ্টা করছিলাম তখন আমি এই প্রশ্নটি জুড়ে এসেছি du -sh $data_path। আমি এখানে পাওয়া "ওয়েট কমান্ড, ডু স্লিপ" প্যাটার্নটি ব্যবহার করেছি, তবে আমার পছন্দসই আউটপুট দেওয়ার জন্য কিছু জটিল এডাব্লুকে ব্যবহার করেছে।

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

আমি এটি অননিলাইনার হিসাবে আসলে করেছি, সেজন্য সেমিকোলন রয়েছে। তবে এটি পঠনযোগ্য করে তোলার জন্য, আমি এটি ভেঙে ফেলেছি। আউটপুটটি দেখে মনে হচ্ছে:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

আপনি একটি স্ক্রিপ্ট তৈরি করতে পারেন যা এটি আপনার জন্য করে। আমি আমার কল keep(যেমন, এটি করা চালিয়ে যান) এবং এটি চালুbin পথে ।

এটি আমার লিপি:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
আপনার "$@"উদ্ধৃত আদেশের পরিবর্তে আদেশ (আর্গুমেন্ট) কার্যকর করতে ব্যবহার করা উচিত $*। এইভাবে আপনার শেল রাখার জন্য উদ্ধৃত আর্গুমেন্ট ইত্যাদি থাকবে যেমন ব্যবহারকারী তাদের আশা করে। FTFY।
রোয়াইমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.