পূর্ববর্তী প্রোগ্রাম থেকে আউটপুট লাইনের সংখ্যা গণনা করুন


32

আমি একটি নির্দিষ্ট প্রোগ্রাম উত্পাদিত লাইন সংখ্যা গণনা করার চেষ্টা করছি। সমস্যাটি হ'ল, প্রোগ্রামটি চালাতে দীর্ঘ সময় লাগে এবং আমি আউটপুটটি ব্যবহারকারীর কাছে প্রদর্শন করতে চাই। শেষ কমান্ড আউটপুট করা লাইনের সংখ্যা গণনা করার কোনও উপায় আছে কি?

আমি করতে পারি program | wc -lকিন্তু এটি ব্যবহারকারীর কাছে আউটপুট প্রদর্শন করবে না। যতদূর আমি জানি, আমাকে করতে হবে program; program | wc -l- তবে প্রোগ্রামটি চালাতে কমপক্ষে এক মিনিট সময় লাগে, তাই নীচে একটি লাইন গণনা দেখানোর জন্য আমি একবারের বেশি এটি করতে চাই না।

সম্পাদনা করুন:

  • আউটপুটটি ঘটার সাথে সাথে দেখানোর কোনও উপায় আছে (লাইন দ্বারা লাইন) এবং তারপরে শেষে একটি গণনা ফেরত দেওয়া?

কীভাবে: প্রোগ্রামটি তার নিজস্ব আউটপুট ট্র্যাক করে রাখে এবং ভেরিয়েবলের (যেমন STDOUT_WRITE_COUNT) থেকে সেই মানটি পড়ুন , বা প্রোগ্রামের শেষে ফাইল / এপিআইতে লগইন করুন। WDYT?
mecampbellsoup

উত্তর:


43

আপনি teeএক অনুলিপি প্রেরণ করে আউটপুট স্ট্রিমটি বিভক্ত করতে wcএবং অন্য অনুলিপি সাধারণের মতো STDOUT এ বিভক্ত করতে পারেন ।

program | tee >(wc -l)

এটি >(cmd)হ'ল বাশ সিনট্যাক্স যার অর্থ এই প্রোগ্রামটির এসটিডিআইএন-এর পাথ (একটি নামযুক্ত পাইপ সংযুক্ত) এর সাথে বিটটি cmdপ্রতিস্থাপন করুন এবং প্রতিস্থাপন করুন >(cmd)


2
>(cmd)হয় kshএছাড়াও দ্বারা স্বীকৃত সিনট্যাক্স zshএবং bashএবং শুধুমাত্র ব্যবহার করা হয় নামে পাইপ সিস্টেম আছে না যে উপর /dev/fd/n
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস হ্যাঁ, বেশিরভাগ শেল এটি সমর্থন করে, তবে এটি পসিক্সে নেই, তাই এটি সর্বত্র থাকার জন্য নির্ভর করা যায় না।
প্যাট্রিক

হ্যাঁ, আমি কেবল উল্লেখ করছিলাম যে প্রক্রিয়া প্রতিস্থাপন কোনও bashআবিষ্কার ছিল না কারণ আপনার উত্তরটিতে শব্দটি বিশ্বাস করতে পারে।
স্টাফেন চেজেলাস

1
@TheLibbster নির্ভর করে আপনি কীভাবে দক্ষকে সংজ্ঞায়িত করেন। এই পদ্ধতিতে 2 টি অতিরিক্ত প্রক্রিয়া তৈরি করা জড়িত, যেখানে কেবল sedএবং awkকেবল একটি। কিন্তু teewcউভয় অত্যন্ত ছোট (তুলনায় অনেক ছোট sedএবং awk)।
প্যাট্রিক

1
@ দ্য লিব্বস্টার হ্যাঁ, আমি কিছু সাধারণ পরীক্ষা অনুসারে করেছি, এটি আসলে sedএবং awkপদ্ধতি উভয়ের চেয়ে প্রায় দ্বিগুণ দ্রুত । (আমি কোনও ফাইলে dd100mb ডি /dev/urandomএবং তারপরে প্রতিটি পদ্ধতিতে কয়েকবার সেই ফাইলটি
প্যাট্রিক

10

একটি বিকল্প হ'ল awk ব্যবহার করা, যা গণনা করতে পারে এবং stdout এ মুদ্রণ করতে পারে।

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

ইন awk, এনআর হ'ল বর্তমান লাইন নম্বর। আপনি পার্ল দিয়ে এটি সম্পাদন করতে পারেন:

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

বা sed:

program | sed -n 'p;$='

আউটপুটটি ঘটার সাথে সাথে দেখানোর কোনও উপায় আছে (লাইন দ্বারা লাইন) এবং তারপরে শেষে একটি গণনা ফেরত দেওয়া?
লিববাক্স

6

আপনি stderr এ stdout ক্লোন করতে পারেন।

program | tee /dev/stderr | wc -l

এইভাবে, স্ট্ডআউট স্টেডারকে লেখা যেতে programপাইপ করা teeহয়েছে, যা কনসোলে মুদ্রিত হয়েছে। 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অন্যটিতে লাইনের সংখ্যার প্রতিবেদন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.