초당 라인의 특정 속도로 터미널에 대한 Cat 파일

초당 라인의 특정 속도로 터미널에 대한 Cat 파일

저는 게으른 편이라 스크립트를 작성할 수도 있지만 어떻게 해야 할지 생각하기에는 너무 게으릅니다.

나는 종종 다음과 같은 일을 합니다.

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

때로는 실험의 긴 결과를 볼 때 페이지를 스크롤하면서 연속적인 패턴이 형성되고 분산되는 것을 보고 싶습니다. 그러나 100만 줄의 파일에 cat을 사용하면 5초 안에 완료됩니다. 이건 나한테도 너무 빠르다.

'스크롤 유틸리티'와 같이 파일 보기 속도를 늦출 수 있는 방법이 있습니까? 나는 빠른 속도를 원하지만 초당 200,000줄은 원하지 않습니다. (아마도 이 모든 라인은 어쨌든 디스플레이에 등록되지 않을 것입니다.)

같은 것

cris$ scroll -lps=300 output.txt

그런 다음 편안히 앉아서 초당 300줄이 지나가는 것을 보는 것이 이상적일 것이라고 상상합니다.

답변1

짧고읽을 수 있는:

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

이 솔루션은 작고 읽기 쉽기 때문에 다음의 의견으로 게시합니다.DMAS의 답변이런 종류의 솔루션을 홍보하는 것 같습니다!

하지만 나는 이것을 싫어합니다: 이 실행을 위해 Perl은포크/bin/sleep300x/초 까지 !

이것은 큰 자원 소비자입니다! 또한 잘못된좋은 솔루션!!

사용내장자다

불행하게도 내장 기능 sleep은 정수로 제한됩니다. 따라서 대신 다음을 사용해야 합니다 select.

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

Perl에서는 스위치 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라인/초는 0.0033333333초당 1라인을 의미합니다.

  • 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 모듈을 사용할 수 있습니다 .

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선택적 초당 행 숫자 인수입니다(기본값: 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

그냥 수면과 함께 awk를 사용하세요:

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

답변3

통역사를 사용하는 대신 특별히 제작된 도구를 사용할 수 있습니다. 배포판에 설치되어 있거나 설치할 수 있습니다(apt-get install pv 등).

파일을 초당 5줄로 표시하려면:

cat filename | pv --quiet --line-mode --rate-limit 5

파일을 초당 100바이트로 표시하려면:

cat filename| pv --quiet  --rate-limit 100

답변4

Ruby의 sleep함수는 부동 소수점 값을 지원하므로 @F.Hauri의 답변을 기반으로 한 효율적이고 짧은 솔루션은 다음과 같습니다.

ruby -pe 'sleep 0.00333' log.txt

또는

ruby -pe 'sleep (1.0/300)' log.txt

관련 정보