grep'ing saída da saída continuamente atualizado
Pergunta
Eu estou tentando escrever um script simples em torno de Lame para personalizar o programa para os meus usos específicos. O que eu gostaria de fazer é analisar fora apenas o percentual de completude da saída Lame.
Aqui está o que os olhares linha como agora:
./lame --nohist ~/Desktop/Driver.wav ~/Desktop/Driver.mp3 2>&1| egrep -o "\([0-9\%]+\)"
Mas isso não retornar nada. Aqui está o que a saída do Lame parece com:
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
A última linha de código atualiza dinamicamente como o arquivo é convertido. Quando eu copiar / colar / echo / cachimbo este texto exato em meu grep encontra a 17% muito bem, mas quando eu executá-lo de verdade, ele encontra zilch.
Edit: Quando eu jogar a saída de coxo em um arquivo de texto, aqui é o que os resultados parecido:
Parece que eu poderia empurrar a saída para um arquivo temporário e ler a porcentagem fora completa de lá, mas que se sente estranho, que deve haver uma maneira mais elegante de fazer isso.
Solução 3
Acabei usando NSScanner
para analisar a saída. Cada linha do NSTask
foi enviado a este método:
- (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];
}
}
Outras dicas
Eu suspeito que você pode não ser capaz de fazer isso. A saída percentual provavelmente irá para o terminal via maldições (para permitir a in- lugar dinâmico atualização), e assim haverá uma saída limitada via stdout.
Pode valer a pena redirecionando a saída para um arquivo e ver o que é escrito lá. i.
lame > /tmp/lame.log
coxo provavelmente não está a emitir esta informação da mesma maneira quando não estiver conectado a um terminal. Tente executar o seu comando coxo com no final "> output.txt" e olhar para o que está sendo impresso quando ligado a outro processo.
A outra possibilidade muito provável é que "17%" é nunca realmente imprimir. O que provavelmente é a impressão é:
%, mover para a esquerda, um, mover para a esquerda, dois, três mover para a esquerda, ... mover para a esquerda, mover para a esquerda, 1, 7, 8 mover para a esquerda, etc.