पिछले कार्यक्रम से आउटपुट की लाइनों की संख्या की गणना करें


32

मैं आउटपुट की लाइनों की संख्या की गणना करने की कोशिश कर रहा हूं जो एक निश्चित प्रोग्राम का उत्पादन करता है। समस्या यह है, कार्यक्रम को चलने में लंबा समय लगता है, और मैं उपयोगकर्ता को आउटपुट प्रदर्शित करना चाहता हूं। क्या अंतिम कमांड आउटपुट लाइनों की संख्या की गणना करने का एक तरीका है?

मैं कर सकता था, program | wc -lलेकिन वह उपयोगकर्ता को आउटपुट नहीं दिखाएगा। जहाँ तक मुझे पता है, मुझे करना है program; program | wc -l- लेकिन कार्यक्रम को चलने में कम से कम एक मिनट लगता है, इसलिए मैं नहीं चाहता कि इसे एक बार से अधिक करने के लिए बस एक पंक्ति की गिनती दिखानी पड़े।

संपादित करें:

  • क्या आउटपुट को दिखाने का एक तरीका है जैसा कि ऐसा होता है (लाइन द्वारा लाइन) और फिर अंत में एक गिनती लौटाता है?

कैसे के बारे में: कार्यक्रम अपने स्वयं के आउटपुट का ट्रैक रखता है और बस उस मान को चर (जैसे STDOUT_WRITE_COUNT) से पढ़ता है , या प्रोग्राम के अंत में इसे एक फ़ाइल / एपीआई में लॉग करता है। WDYT?
mecampbellsoup

जवाबों:


43

आप teeआउटपुट कॉपी को एक कॉपी wcऔर दूसरी कॉपी को सामान्य की तरह STDOUT में भेजने के लिए उपयोग कर सकते हैं ।

program | tee >(wc -l)

>(cmd)बैश वाक्य रचना जो साधन चलाने है cmdऔर की जगह >(cmd)(से जुड़े एक नामित पाइप) उस कार्यक्रम के STDIN के लिए पथ के साथ बिट।


2
>(cmd)है kshभी द्वारा मान्यता प्राप्त वाक्य रचना zshऔर bashऔर केवल उपयोग कर रहा है नामित पाइप प्रणाली की जरूरत नहीं है कि पर /dev/fd/n
स्टीफन चेज़लस

@StephaneChazelas हाँ, अधिकांश गोले इसका समर्थन करते हैं, लेकिन यह POSIX में नहीं है, इसलिए इसे हर जगह होने पर भरोसा नहीं किया जा सकता है।
पैट्रिक

हां, मैं सिर्फ इशारा कर रहा था कि प्रक्रिया प्रतिस्थापन एक bashआविष्कार नहीं था क्योंकि आपके उत्तर में शब्द एक विश्वास कर सकता है।
स्टीफन चेज़लस

1
@ लॉबस्टर निर्भर करता है कि आप कैसे कुशल परिभाषित करते हैं। इस विधि 2 अतिरिक्त प्रक्रियाओं, जहां के रूप में उत्पन्न करने वाला शामिल है sedऔर awkसिर्फ एक है। लेकिन teeऔर wcदोनों अत्यंत छोटे (की तुलना में बहुत छोटे होते हैं sedऔर awk)।
पैट्रिक

1
@ TheLibbster हाँ, कुछ साधारण परीक्षणों के अनुसार मैंने अभी किया है, यह वास्तव में दोनों तरीकों sedऔर awkविधियों के बारे में दोगुना है । (मैं एक फ़ाइल के dd100mb /dev/urandomऔर फिर कई बार प्रत्येक विधि के माध्यम से उस फ़ाइल
पैट्रिक

10

एक विकल्प awk का उपयोग करना है, जो गिनती और प्रिंटआउट करने के लिए कर सकता है।

program | awk '{ print } END { print NR }'

में awk, एनआर वर्तमान लाइन नंबर है। आप इसे पर्ल के साथ पूरा कर सकते हैं:

program | perl -pe 'END {print "$.\n"}'

या sed:

program | sed -n 'p;$='

क्या आउटपुट को दिखाने का एक तरीका है जैसा कि ऐसा होता है (लाइन द्वारा लाइन) और फिर अंत में एक गिनती लौटाता है?
लीबक्स

6

आप stderout पर क्लोन कर सकते हैं।

program | tee /dev/stderr | wc -l

इस तरह, program'stdout' को ' teestderr' पर लिखा जाना चाहिए, जिसे कंसोल पर प्रिंट किया गया है। teeइसके स्टडआउट को दिए गए डेटा को भी लिखता है, जिसे पाइप किया जाता है wc


3

मेरा पसंदीदा विकल्प:

program | grep "" -c

1
ओपी ने कुछ और पूछा हो सकता है, लेकिन मैं यहां सिर्फ आउटपुट लाइनों की संख्या की तलाश में आया था और वास्तविक आउटपुट दिखाने के बारे में परवाह नहीं की थी, और यह काम करता है। धन्यवाद!
निखिल वीजे

0
tail -f /var/log/squid/access.log | ( c=0; pl() { echo $c; c=0; }; trap pl SIGHUP; while read a; do (( c=c+1 )); done ) & ( trap 'kill $! ; exit' SIGINT; trap '' SIGHUP; while true; do kill -HUP $! ; sleep 1; done)

0

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

यही आप चाहते हैं YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)

हम teeयहाँ दो धाराएँ बनाने का लाभ उठाते हैं और एक को निर्देशित करते हैं /dev/stderr, जो आपको स्क्रीन पर दिखाई देगी, और दूसरी को wc -l, जो लाइनों की संख्या की रिपोर्ट करेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.