output grep da output costantemente aggiornato
Domanda
Sto cercando di scrivere un semplice script su Lame per personalizzare il programma per i miei usi specifici. Quello che mi piacerebbe fare è analizzare la completezza percentuale dell'output di Lame.
Ecco come appare la linea ora:
./lame --nohist ~/Desktop/Driver.wav ~/Desktop/Driver.mp3 2>&1| egrep -o "\([0-9\%]+\)"
Ma questo non restituisce nulla. Ecco come appare l'output di 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
L'ultima riga di codice si aggiorna dinamicamente quando il file viene convertito. Quando copio / incolla / echo / pipe questo testo esatto nel mio grep trova il 17% giusto, ma quando lo eseguo davvero, trova zilch.
Modifica: Quando lancio l'output di lame in un file di testo, ecco come appaiono i risultati:
Sembra che potrei spingere l'output in un file temporaneo e leggere la percentuale completa da lì, ma mi sembra imbarazzante, come se ci fosse un modo più elegante per farlo.
Soluzione 3
Ho finito per usare NSScanner
per analizzare l'output. Ogni riga da NSTask
è stata inviata a questo metodo:
- (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];
}
}
Altri suggerimenti
Sospetto che potresti non essere in grado di farlo. L'output percentuale probabilmente andrà al terminale tramite curses (per consentire in- posiziona l'aggiornamento dinamico) e quindi ci sarà un output limitato tramite stdout.
Potrebbe valere la pena reindirizzare l'output su un file e vedere cosa viene scritto lì. cioè.
lame > /tmp/lame.log
probabilmente lame non sta trasmettendo queste informazioni allo stesso modo quando non è collegato a un terminale. Prova a eseguire il comando lame con alla fine " > output.txt " e guarda cosa stampa quando è collegato a un altro processo.
L'altra possibilità molto probabile è che "17%" non viene mai realmente stampato. Ciò che probabilmente sta stampando è:
%, sposta a sinistra, 1, sposta a sinistra, 2, sposta a sinistra 3, ... sposta a sinistra, sposta a sinistra, 1, 7, sposta a sinistra 8, ecc.