Gnu টেক্সটুল সহ একটি ক্রমাগত 'wc -l' কীভাবে করবেন?


28

আমি অবশ্যই জানি

cat logfile.txt | wc -l
120

আমাকে একটি ফাইলের লাইনের সংখ্যা বলবে।

যেহেতু

tail -f logfile.txt

অন্য একটি প্রোগ্রাম লিখেছেন যে নতুন লাইনগুলি আমাকে দেখায় logfile.txt

উভয়কেই কী একত্রিত করা সম্ভব যে আমি স্ট্যান্ডার্ড পাঠ্য ইউটিলিটিসের সাথে লগফিল.টিএসটিএসটির একটানা আপডেটের লাইন গণনা পাই?

আমি সম্পর্কে জানি না

watch wc -l logfile.txt

তবে আমি প্রতিবার পুরো ফাইলটি পুনরায় গণনা করতে চাই না, এটি একটি অপব্যয় বলে মনে হচ্ছে। একজনের জন্য প্রতি সেকেন্ডে কেবলমাত্র যুক্ত হওয়া গণনা এবং লাইনের শেষে একটি \rপরিবর্তে একটি প্রয়োজন হবে \n


1
আপনার ফাইলটি কি এত বড় যে সমস্ত কিছুর গণনা করা একটি সমস্যা? বর্জ্যের নিরিখে: পাইপিং catআউটপুট টু wcকরাও বড় অপচয়!
বার্নহার্ড

হ্যাঁ, এটি সম্ভাব্যভাবে খুব বড়।
তোয়াই

উত্তর:


36

হতে পারে:

tail -n +1 -f file | awk '{printf "\r%lu", NR}'

সাবধান থাকুন যে এটি প্রতিটি লাইন ইনপুটটির জন্য একটি সংখ্যা আউটপুট দেয় (যদিও টার্মিনালে প্রেরণ করা হলে পূর্ববর্তী মানকে ওভাররাইড করে)।

বা আপনি tail -fহাতে হাতে শেল প্রয়োগ করতে পারেন :

n=0
while :; do 
  n=$(($n + $(wc -l)))
  printf '\r%s' "$n"
  sleep 1
done < file

(নোট যে এটা এক আপ রান wcএবং এক sleepপ্রতি সেকেন্ডে যা সব শাঁস সালে নির্মিত না কমান্ড। সঙ্গে ksh93যখন sleepbuiltin, একটি বিল্ট ইন পেতে wc(ডেবিয়ান) এ অন্তত, আপনি যোগ করতে হবে /opt/ast/binসামনে $PATH(কিনা নির্বিশেষে ডিরেক্টরিটি বিদ্যমান আছে বা নেই) বা ব্যবহার করুন command /opt/ast/bin/wc(জিজ্ঞাসা করবেন না ...))।

আপনি যেমন ব্যবহার করতে পারেন pv:

tail -n +1 -f file | pv -bl > /dev/null

তবে সাবধান থাকুন যে এটি যোগ করেছে k, M... সংখ্যার 1000 এর বেশি হলে প্রত্যয়গুলি (এবং এর আশেপাশে কোনও উপায় বলে মনে হয় না )।


আপনার tail | awkসমাধান কত। আপনার বিকল্পগুলি জানুন: -n +0এই সংমিশ্রণে আমার কাছে উপস্থিত হত না।
তোয়াই

2
ছিঃ! pv- আরেকটি দরকারী নতুন সরঞ্জাম। ধন্যবাদ এক গুচ্ছ
তোয়াই 20'13

tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
গ্রেপ দিয়ে

2
@tombolinux, awkএকটি সুপারসেটও হয় greptail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
স্টাফেন চেজেলাস

কুল। আমি প্রিন্টটি শেষে একটি নতুন লাইন END{print ""}তৈরি করতে যুক্ত করব awk
pLumo

6

বিশুদ্ধ সঙ্গে এটি গণনা করার চেষ্টা করুন bashছাড়া wc:

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo $a ; done

বা এমনকি পূর্বের মানটি আবার লিখতে পছন্দ করুন:

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo -ne "\r$a" ; done

1

আমি বিশ্বাস করি না এরকম কিছু আছে। তবে এর লাইনে কিছু ছিটানো সহজ হওয়া উচিত:

#!/usr/bin/perl

$for_a_while = 1;

$oldcount = -1;
$count = 0;
open($fh, "<", $ARGV[0]);

for (;;) {
  for ($curpos = tell($fh); <$fh>; $curpos = tell($fh)) {
    $count++;
  }
  if($count != $oldcount) {
    print "$count\n";
    $oldcount = $count;
  }
  sleep($for_a_while);
  seek($fh, $curpos, 0);
}

(সাধারণ ধারণা থেকে আঁকানো perlfunc(1))


1
আপনি যতবার করবেন তখনই সংখ্যাটি বাড়বে printf foo >> file। আপনাকে নতুন লাইনের অক্ষরগুলি গণনা করতে হবে (যেমন wc -lআমি প্রস্তাবিত শেল সলিউশনের মধ্যে রয়েছে), রেকর্ডগুলি যেগুলি দিয়েছিল তা নয় <$fh>। আমি মনে করি না আপনি ব্যবহার করতে হবে tellবা seekসব সময়ে।
স্টাফেন চেজেলাস

<$fh>ডিফল্টরূপে একটি লাইন লেখা আছে, রেকর্ড না। উদ্ধৃত পার্ল ম্যানপেজটি সম্ভবত একটি অসহযোগিতামূলক পরিবেশের জন্য এটি এইভাবে করতে বলেছে (ফাইল সিস্টেমের উপর নির্ভর করতে পারে, আমি অনুমান করি এনএফএস বা অন্যান্য নেটওয়ার্ক-মাউন্ট করা ফাইল সিস্টেমগুলি কিছুটা উত্থাপনের প্রয়োজন হতে পারে)।
ভনব্র্যান্ড

ফাইলের শেষে পৌঁছে যাওয়ার পরে এটি নিজের জন্য চেষ্টা করুন, <$fh>কোনও রেকর্ড ফিরিয়ে আনবে এমনকি যদি এটি কোনও নতুন লাইনের চরিত্র দ্বারা শেষ না হয়। সুতরাং যদি perlফাইলটির শেষে বসে থাকে এবং পরে কেউ একটি করে থাকে printf foo >> file, তবে সেগুলি <$fh>ফিরে আসবে foo(কোনও লাইন নয় যেহেতু এটি একটি নতুন লাইন চরিত্র দ্বারা শেষ করা হয়নি), এবং $countবাড়তি বাড়ানো হবে যদিও ফাইলটিতে কোনও অতিরিক্ত লাইন যোগ করা হয়নি।
স্টাফেন চেজেলাস

ওপি কি একবারে লাইন লেখা লগফাইলগুলি পর্যবেক্ষণ করার কথা ছিল?
ভনব্র্যান্ড

না, যে কারণে আপনার সমাধানটি কাজ না করে। উদাহরণস্বরূপ, ফাইলটিতে লিখিত অ্যাপ্লিকেশনগুলি যদি তার আউটপুটটিকে বাফার করে, তবে যে কোনও সময় শেষ পংক্তিটি সমাপ্ত না হওয়ার সম্ভাবনা রয়েছে তাই দ্বিগুণ গণনা করা হবে।
স্টাফেন চেজেলাস

0

অবাস্তব-ভিত্তিক সমাধানটি চালিয়ে যাওয়া: আপনার লগের প্রতিটি লাইনের জন্য কাউন্টার টিকিং দেখার দরকার নেই; এটি সেই ক্ষেত্রে, আপনার এটির মতো এটি থাকতে পারে (প্রতিটি 10 ​​লাইনের জন্য সংখ্যাটি পরিবর্তিত হবে):

tail -n +0 logfile.txt | \
    awk 'a+=1{}a%10==0{printf "\r%lu", a}END{printf "\r%lu", a}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.