grep'ing sortie de sortie mise à jour en permanence
Question
J'essaie d'écrire un script simple autour de Lame pour personnaliser le programme en fonction de mes utilisations spécifiques. Ce que je voudrais faire, c’est d’analyser uniquement le pourcentage d’exhaustivité de la sortie de Lame.
Voici à quoi ressemble la ligne:
./lame --nohist ~/Desktop/Driver.wav ~/Desktop/Driver.mp3 2>&1| egrep -o "\([0-9\%]+\)"
Mais cela ne retourne rien. Voici à quoi ressemble le résultat de 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
La dernière ligne de code est mise à jour de manière dynamique au fur et à mesure de la conversion du fichier. Lorsque je copie / colle / echo / dirige ce texte exact dans mon grep, il trouve parfaitement les 17%, mais lorsque je le lance réellement, il trouve zilch.
Modifier: Lorsque je jette la sortie de lame dans un fichier texte, voici à quoi ressemblent les résultats:
Il semble que je puisse transférer la sortie dans un fichier temporaire et lire le pourcentage complet, mais cela semble difficile, car il devrait y avoir un moyen plus élégant de le faire.
La solution 3
J'ai fini par utiliser NSScanner
pour analyser le résultat. Chaque ligne du NSTask
a été envoyée à cette méthode:
- (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];
}
}
Autres conseils
Je suppose que vous ne pourrez peut-être pas faire cela. Le pourcentage de sortie ira probablement au terminal via cursus (pour permettre mettre à jour dynamique), et donc il y aura une sortie limitée via stdout.
Il peut être intéressant de rediriger la sortie vers un fichier et de voir ce qui y est écrit. c'est-à-dire
lame > /tmp/lame.log
lame n’émet probablement pas cette information de la même manière s’il n’est pas connecté à un terminal. Essayez d’exécuter votre commande boiteuse à la fin " > output.txt " et regardez ce que vous imprimez lorsqu'il est associé à un autre processus.
L’autre possibilité très probable est que " 17% " n'est jamais en train d'imprimer. Ce qui est probablement l’impression, c’est:
%, déplacer à gauche, 1, déplacer à gauche, 2, déplacer à gauche 3, ... déplacer à gauche, déplacer à gauche, 1, 7, déplacer à gauche 8, etc.