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


15

나는 게으르고 이것을하기 위해 스크립트를 작성할 수는 있지만, 그것을하는 방법을 생각하기에는 너무 게으르다.

나는 종종 다음과 같은 일을한다.

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

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

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

같은 것

cris$ scroll -lps=300 output.txt

그리고 앉아서 앉아서 초당 300 줄의 롤을 보는 것이 이상적이라고 생각합니다.


7
같은 것을 시도하십시오 cat FILENAME | pv -l -L 900 -q. 제한은 초당 줄이 아니라 초당 바이트 수이므로 주석이 답이 아닙니다.
David Schwartz

좋아, 그것은 멋진 유틸리티이며 부분적으로 작동합니다. 그러나 그렇습니다, 그것은 lps가 아닌 bps 이후에 오기 때문에 약간 고르지 않습니다.
Cris Stringfellow

답변:


17

짧고 읽기 쉬운 :

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

DMas의 답변에 대한 의견 이 이러한 종류의 솔루션을 홍보하는 것처럼 보이기 때문에 작고 읽을 수 있기 때문에이 솔루션을 게시합니다 !

이 실행을 위해, 펄이됩니다하지만이 때문에 싫어 포크/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 라인 x 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::Hiresperl 모듈을 사용할 수 있습니다 .

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)

참고 : filename이 숫자 인 경우 path :로 지정해야합니다 ./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? 찾아 볼 수 있습니다. 놀랄 만한.
Cris Stringfellow

2
@CrisStringfellow Ok, Time::HiRes정확성을 높이기 위해 perl 모듈을 사용하는 설명과 스크립트 를 추가했습니다.
F. Hauri

나의 신. 대단한 답변입니다. 감사합니다. 나는 그것을 두 번 찬성하려고 노력했다. 나는 당신의 훌륭한 설명을 읽고 무언가를 배우고 있습니다.
Cris Stringfellow

2
내 의견도 공감할 수 있습니다 ;-)
F. Hauri

@CrisStringfellow 답변 편집 됨 : -pswitch to perl 명령을 사용하여 스크립트가 밝아졌습니다!
F. Hauri

11

수면과 함께 awk를 사용하십시오.

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

이것은 저에게 효과적이며 위의 스크립트 옵션보다는 내 상황에 가장 적합한 옵션이었습니다. 이 답변이 다운 투표 된 이유를 잘 모르겠습니다.
시민 케플러

2
펄 솔루션과 달리 읽기 쉽습니다.
건슬링거

1
@ Gunslinger : 구문 system(*sleep .1")은 10 포크 / 초를 생성합니다! 이것은 기록 될 수있다 perl -pe 'system "sleep .1"' log.txt: (!하지 시스템 친화적 인) 읽을 수도 있지만, 매우 비싼
F. 하우리을

나도이 읽을 수있는 대답을 선호합니다. 유일한 것은 출력하는 모든 줄에 대해 쉘 절전 명령을 실행한다는 것입니다. 그러나 완벽하게 읽을 수있는 하나의 라이너가되는 것은 중요하지 않습니다.
itsafire 2016 년

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)

stdin 또는 인수 (-i)의 입력을 허용하며 기본적으로 1/10 초마다 한 줄을 쓰지만 다른 인수 (-d)로 변경할 수 있습니다.


감사. 이 Q & Ad에서 일어날 때 파이썬에서이 아이디어와 비슷한 것을 개발하기 시작했습니다. 파이썬 은 F. Hauri의 대답에 사용 된 것과 같이 Perl과 비슷한 방식으로 select docs.python.org/3/library/select.html 을 지원합니다 .
ybull
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.