2009-06-21 2 views
1

저는 특별한 용도로 프로그램을 사용자 정의하기 위해 절름발이 주위에 간단한 스크립트를 작성하려고합니다. 내가하고 싶은 것은 Lame 출력의 완성도를 분석하는 것입니다.계속 업데이트 된 출력의 grep'ing 출력

./lame --nohist ~/Desktop/Driver.wav ~/Desktop/Driver.mp3 2>&1| egrep -o "\([0-9\%]+\)" 

을하지만 그 아무 것도 반환하지 않습니다 :

여기에 라인이 지금의 모습입니다. 다음은 Lame의 출력 모습입니다.

 LAME 3.99 (alpha 1, Jun 4 2009 19:42:31) 32bits (http://www.mp3dev.org/) 
    warning: alpha versions should be used for testing only 
    Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz 
    Encoding /Users/jkubicek/Desktop/Driver.wav 
     to /Users/jkubicek/Desktop/Driver.mp3 
    Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3 
    Frame   | CPU time/estim | REAL time/estim | play/CPU | ETA 
    1500/8765 (17%)| 0:02/ 0:15| 0:03/ 0:17| 14.654x| 0:14

마지막 줄의 코드는 파일이 변환 될 때 동적으로 업데이트됩니다. 이 정확한 텍스트를 내 grep에 복사/붙여 넣기/에코/파이프 할 때 실제로 17 %를 찾았지만 실제로 실행하면 zilch가 발견됩니다.

편집 : 나는 텍스트 파일로 절름발이의 출력을 던질 때, 여기 결과가 어떻게 생겼는지 : 나는 임시 파일에 출력을 밀어 읽을 수처럼

lameout.txt http://nothing2fancy.com/images/forum_images/lameout.txt-20090621-095324.png

같습니다 그 비율은 거기서 끝나지 만,이 일을하는 더 우아한 방법이있는 것처럼 어색한 느낌입니다.

답변

1

I를 왼쪽으로 이동 출력을 구문 분석하기 위해 NSScanner을 사용하여 종료되었습니다. NSTask의 각 행은 다음 방법으로 전송되었습니다.

- (NSNumber *)parseOutputString:(NSString *)output { 
    NSScanner *scanner = [NSScanner scannerWithString:output]; 
    NSString *endString = @"% complete"; 
    NSInteger percentComplete; 
    BOOL didFindNumber = NO; 

    while (![scanner scanString:endString intoString:nil]) { 
     [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil]; 
     didFindNumber = [scanner scanInteger:&percentComplete]; 

     if ([scanner isAtEnd]) { 
       didFindNumber = NO; 
       break; 
     } 
    } 

    if (didFindNumber) { 
     return [NSNumber numberWithInteger:percentComplete]; 
    } else { 
     return [NSNumber numberWithInt:0]; 
    } 
} 
1

귀하가이 작업을 수행하지 못할 수도 있습니다. 백분율 출력은 아마도 curses을 통해 터미널로 이동하므로 (내부 동적 업데이트를 허용하기 위해) 표준 출력을 통해 출력이 제한됩니다.

출력을 파일로 리디렉션하고 거기에 무엇이 기록되는지 볼 가치가 있습니다. 즉

lame > /tmp/lame.log 
+0

제안 해 주셔서 감사합니다. 나는 출력 파일을 검사하고 그것은 개별 라인에있는 모든 개별 퍼센트 업데이트를 보유하고있다. 따라서 각각을 읽는 것이 가능해야합니다. – kubi

+0

lame이 숫자를 출력 한 다음^H (또는 백 스페이스)를 출력 할 수도 있습니다. 따라서 grep은 EOL을 식별 할 수 있도록 캐리지 리턴을 얻을 수 없습니다. 절름발이는 또한 stdout이 보내지는 위치에 따라 출력을 변경할 수 있습니다. –

1

저는이 정보가 터미널에 연결되어 있지 않을 때 같은 방식으로 출력되지 않을 것입니다. 끝에 "> output.txt"와 함께 절름발이 명령을 실행하고 다른 프로세스에 첨부 할 때 인쇄 내용을보십시오.

다른 가능성은 "17 %"가 절대로 실제로 인쇄되지 않는다는 것입니다. 무엇 아마 인쇄하는 것은 :

%,,, ... 왼쪽으로 이동, 왼쪽, 1, 7, 이동 8 왼쪽으로 이동 (3)를 왼쪽으로 이동, 2, 왼쪽으로 이동, 1 등

관련 문제