ग्नू टेक्स्टटूल के साथ एक कंटीन्यू 'wc -l' कैसे करें?


28

मुझे इसका पता है

cat logfile.txt | wc -l
120

मुझे एक फ़ाइल में लाइनों की संख्या बताएगा।

जहाँ तक

tail -f logfile.txt

मुझे वह नई लाइनें दिखाएगा जो एक अन्य प्रोग्राम लिखता है 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- एक और उपयोगी नया टूल। बहुत बहुत धन्यवाद।
टावी

tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
Grep के

2
@tombolinux, awkका सुपरसेट है greptail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
स्टीफन चेज़लस 20

ठंडा। मैं अंत में एक नई रूपरेखा 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(एक पंक्ति नहीं है क्योंकि यह एक newline वर्ण द्वारा समाप्त नहीं किया गया है), और $countफ़ाइल में कोई अतिरिक्त लाइन नहीं जोड़े जाने पर भी वेतन वृद्धि होगी।
स्टीफन चेजेलस

ओपी को एक समय में एक पंक्ति में लॉगफ़ाइल्स की निगरानी करना चाहिए था?
वॉनब्रांड

नहीं, जिसके कारण आपका समाधान काम नहीं कर सकता है। उदाहरण के लिए, यदि फ़ाइल में लिखने वाले एप्लिकेशन इसके आउटपुट को बफ़र करते हैं, तो किसी भी समय, अंतिम पंक्ति के समाप्त होने की संभावना नहीं है, इसलिए इसे दो बार गिना जाएगा।
स्टीफन चेजेलस

0

जाग-आधारित समाधान जारी रखना: आपको अपने लॉग में प्रत्येक पंक्ति के लिए काउंटर टिकिंग देखने की आवश्यकता नहीं हो सकती है; यह मामला है, आप इसे इस तरह से कर सकते हैं (संख्या प्रत्येक 10 लाइनों के लिए बदल जाएगी):

tail -n +0 logfile.txt | \
    awk 'a+=1{}a%10==0{printf "\r%lu", a}END{printf "\r%lu", a}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.