প্রতি সেকেন্ডের লাইনের নির্দিষ্ট গতিতে টার্মিনালে বিড়াল ফাইল


15

আমি অলস এবং আমি এটি করার জন্য একটি স্ক্রিপ্ট লিখতে পারি, তবে এটি কীভাবে করা যায় তা ভেবে আমি এমনকি খুব অলস।

আমি প্রায়শই এই জাতীয় জিনিসগুলি করি:

cris$ python runexperiment.py > output.txt
cris$ cat output.txt

কখনও কখনও কোনও পরীক্ষার দীর্ঘ আউটপুটটির দিকে তাকানোর সময় আমি পৃষ্ঠাটি কেবল স্ক্রোল করতে এবং ধারাবাহিক নিদর্শনগুলি ফর্ম এবং ছড়িয়ে দিতে দেখতে চাই। কিন্তু 1 মিলিয়ন লাইনযুক্ত কোনও ফাইলে বিড়াল ব্যবহার করা সম্ভবত 5 সেকেন্ডের মধ্যেই শেষ হয়ে যায়। এটা আমার জন্য খুব দ্রুত।

'স্ক্রোল ইউটিলিটি' এর মতো ফাইলটি দেখার গতি কমে যাওয়ার কোনও উপায় আছে কি? আমি দ্রুত চাই, তবে 200k লাইনগুলিতে এক সেকেন্ডও নয় (সম্ভবত এটির প্রদর্শনগুলি কোনওভাবেই নিবন্ধভুক্ত হবে না)।

কিছুটা এইরকম

cris$ scroll -lps=300 output.txt

এবং তারপরে বসে এবং প্রতি সেকেন্ড রোল পাস্টের 300 লাইনগুলি দেখা আদর্শ হবে, আমি কল্পনা করি।


7
এরকম কিছু চেষ্টা করুন cat FILENAME | pv -l -L 900 -q। সীমাটি প্রতি সেকেন্ডে বাইটে হয়, প্রতি সেকেন্ডে লাইন নয়, তাই আমি এই মন্তব্যটি একটি উত্তর নয়।
ডেভিড শোয়ার্টজ

ঠিক আছে এটি একটি দুর্দান্ত উপযোগ এবং এটি কিছুটা কাজ করে works তবে হ্যাঁ, এটি বিপিএস না হয়ে পিপিএসের পরে চলে যাওয়ার পরে এটি একটু চপ্পল।
ক্রিস স্ট্রিংফেলো

উত্তর:


17

সংক্ষিপ্ত এবং পাঠযোগ্য :

perl -pe "system 'sleep .003'" log.txt

আমি এই সমাধানগুলি পোস্ট করি কারণ সেগুলি ছোট এবং পাঠযোগ্য, কারণ ডিএমএসের উত্তরের মন্তব্যগুলি মনে হয় যে এই ধরণের সমাধান প্রচার করে!

কিন্তু আমি ঘ্রিনা করি এই কারণে: এই চালানোর জন্য, পার্ল হবে মাল থেকে /bin/sleep300x / সেকেন্ড!

এটি একটি বড় রিসোর্স ভোক্তা! এছাড়াও একটি ভুল ভাল সমাধান !!

মধ্যে বিল্টিন ঘুম ব্যবহার

দুর্ভাগ্যক্রমে, বিল্টিন sleepপূর্ণসংখ্যার মধ্যে সীমাবদ্ধ। সুতরাং আমাদের selectপরিবর্তে ব্যবহার করতে হবে:

perl -e 'print && select undef,undef,undef,.00333 while <>;'

পার্লের অধীনে, স্যুইচ print while <>দ্বারা প্রতিস্থাপন করা যেতে পারে -p:

perl -pe 'select undef,undef,undef,.00333'

আসুন চেষ্টা করুন:

time /bin/ls -l /usr/bin | perl -pe 'select undef,undef,undef,.00333' | wc
   2667   24902  171131

real    0m9.173s
user    0m0.056s
sys     0m0.048s

bc -l < <(echo 2667/9.173)
290.74457647443584432573

ব্যাখ্যা:

  • 300 লাইন / সেকেন্ড মানে 1 লাইন দ্বারা 0.0033333333 সেকেন্ড।

  • printডিফল্ট ইনপুট স্পেস$_ যা আর্গুমেন্ট প্রিন্ট ছাড়াই ।

  • হিসাবে ডাকা হয় ... | perl -e, ... | perl -neবা ... | perl -pe, স্ট্যান্ডার্ড ইনপুট অটোমেটিক্যালি নির্ধারিত হবে *STDINযা ডিফল্ট ফাইল বর্ণনাকারী , তাই <>একই কাজ <STDIN>করবে যা স্ট্যান্ডার্ড ইনপুট থেকে পড়বে যতক্ষণ না $/( ইনপুট রেকর্ড বিভাজক যা ডিফল্টরূপে একটি নতুন লাইন থাকে ) পৌঁছায়। ইংরাজীতে, ডিফল্টরূপে স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন <>পড়বে এবং সামগ্রীটিকে ভেরিয়েবলের জন্য বরাদ্দ করবে ।$_

  • &&এটি একটি শর্ত এবং শর্ত, তবে সেখানে চেইন কমান্ড বিভাজক হিসাবে ব্যবহৃত হয় সুতরাং (সাফল্যের সাথে) পরের কমান্ডটি করে একটি লাইন প্রিন্ট করার পরে।

  • selectব্যবহার না করার জন্যsleep এটি একটি প্রোগ্রামারের কৌশল । এই কমান্ডটি ফাইল বর্ণনাকারীদের (ইনপুট এবং / অথবা আউটপুট, ফাইল, সকেট এবং / অথবা নেট সকেট) ইভেন্টগুলি ফাঁদে নকশা করা হয়েছে । এই কমান্ড দিয়ে, একটি প্রোগ্রাম পারে অপেক্ষা ঘটনা 3 ধরনের জন্য, পড়া করার জন্য প্রস্তুত ভোজন , লিখতে প্রস্তুত ভোজন এবং কিছু ঘটনা ফিডে ঘটেছে । চতুর্থ আর্গুমেন্টটি সেকেন্ডে একটি সময়সীমা হয়, তাই বাক্য গঠন হয় select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>

আরও নির্ভুলতার জন্য, আপনি Time::Hiresপার্ল মডিউলটি ব্যবহার করতে পারেন :

perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'

নোট: $.হয় বর্তমান ইনপুট লাইন সংখ্যা

ভাল হিসাবে লিখিত cat >catLps.pl

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw|time|;

my $start=time;
my $lps=300;

$lps=shift @ARGV if @ARGV && $ARGV[0]=~/^(\d+)$/;
my $sleepPerLine=1/$lps;

print &&
    select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)
    while <>

ব্যবহার:

catLps.pl [lps] [file] [file]...

প্রথম যুক্তি lpsহ'ল secondsচ্ছিক লাইন প্রতি সেকেন্ডে সাংখ্যিক যুক্তি (ডিফল্ট: 300)

দ্রষ্টব্য: যদি ফাইলের নাম শুধুমাত্র সাংখ্যিক হয়, তাহলে আপনি তাদের পাথ দিয়ে নির্দিষ্ট করুন করতে হতে পারে: ./3

ভালো লেগেছে catএই যুক্তি এবং / অথবা হিসেবে দেওয়া ফাইল পাস পারে স্ট্যান্ডার্ড ইনপুট

সুতরাং আমরা পারে:

TIMEFORMAT='%R' 
time seq 1 100 | ./catLps.pl 100 >/dev/null 
1.040

time seq 1 10000 | ./catLps.pl 10000 >/dev/null  
1.042

মজার জন্য:

export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))

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

2
@ ক্রিসস্ট্রিংফেলো ঠিক আছে, আমি Time::HiResআরও নির্ভুলতার জন্য পার্ল মডিউলটি ব্যবহার করে কিছু ব্যাখ্যা এবং একটি সম্পূর্ণ স্ক্রিপ্ট যুক্ত করেছি
এফ

আমার .শ্বর এটি একটি দুর্দান্ত উত্তর। ধন্যবাদ. আমি এটি দ্বিতীয়বার upvote করার চেষ্টা করেছি। আমি আপনার দুর্দান্ত ব্যাখ্যাটি পড়ে কিছু শিখছি।
ক্রিস স্ট্রিংফেলো

2
আপনি আমার মন্তব্যগুলিকেও উজ্জীবিত করতে পারেন ;-)
এফ হাউরি

@ ক্রিসট্রিংফেলো উত্তর সম্পাদিত: -pসুইচ টু পার্ল কমান্ডের সাহায্যে স্ক্রিপ্টটি হালকা করা হয়েছিল!
এফ হাউরি

11

ঘুমের সাথে কেবল বিশ্রী ব্যবহার করুন:

awk '{print $0; system("sleep .1");}' log.txt

এটি আমার জন্য কাজ করেছিল এবং আমার পরিস্থিতির জন্য উপরের স্ক্রিপ্ট বিকল্পগুলির চেয়ে সেরা বিকল্প ছিল। এই উত্তরটি কেন নিচে ভোট হয়েছে তা নিশ্চিত করুন।
নাগরিক কেপলার

2
পার্ল সমাধানের বিপরীতে এটি বেশ পঠনযোগ্য।
গানস্লিংগার

1
@ গনস্লিংগার: সিনট্যাক্সটি system(*sleep .1")10 টি কাঁটাচামচ / সেকেন্ড তৈরি করবে! এটি লিখিত হতে পারে perl -pe 'system "sleep .1"' log.txt: খুব পঠনযোগ্য, তবে খুব ব্যয়বহুল (সিস্টেম বান্ধব নয়!)
এফ হৌরি

আমিও এই পাঠযোগ্য উত্তরটি পছন্দ করি। কেবলমাত্র এটি হ'ল এটি প্রতিটি লাইনের আউটপুটগুলির জন্য শেল স্লিপ কমান্ডটি ফায়ার করবে। তবে নিখুঁত পঠনযোগ্য ওয়ান লাইনার হওয়ার কারণে আমি পাত্তা দিই না।
itafire

0

আমি পার্টিতে দেরি করেছি, তবে পাই আমি পাই যে অজগরটি চেষ্টা করার জন্য এটি একটি দরকারী শেখার অনুশীলন হবে, তাই আমি যা পেয়েছি তা তুলে ধরব:

#!/usr/bin/env python3

import argparse
from time import sleep

parser = argparse.ArgumentParser(description='Echo a file slowly')
parser.add_argument('-i',
                    '--input-file',
                    type=argparse.FileType('r'),
                    default='-')
parser.add_argument('-d',
                    '--delay-in-ms',
                    type=int,
                    default='100')
args = parser.parse_args()

for line in args.input_file:
    print(line.rstrip())
    sleep(args.delay_in_ms/1000.0)

এটি স্টাডিন বা আর্গুমেন্ট (-i) হিসাবে ইনপুট গ্রহণ করে এবং ডিফল্টরূপে এক সেকেন্ডের 1/10 তম প্রতি এক লাইন লেখায়, তবে এটি অন্য যুক্তির (-d) দিয়ে পরিবর্তন করা যেতে পারে।


ধন্যবাদ। আমি যখন এই প্রশ্নোত্তর নিয়ে এসেছি তখন আমি পাইথনে এই ধারণার অনুরূপ কিছু বিকাশ করতে শুরু করেছি। আমি লক্ষ করেছি যে পাইথনও এফ। হাউরির উত্তরে ব্যবহৃত পার্লের অনুরূপভাবে নির্বাচিত ডকস.পিথন.আর.৩ / ৩ / লাইব্রেরি / সিলেক্ট এইচটিএমএল সমর্থন করে ।
ybull
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.