초당 특정 라인 속도로 터미널에 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.