сортировка выходных данных из постоянно обновляемых выходных данных
Вопрос
Я пытаюсь написать простой скрипт вокруг Lame, чтобы настроить программу для моих конкретных целей.Что я хотел бы сделать, так это проанализировать только процент полноты из неубедительного вывода.
Вот как сейчас выглядит эта линия:
./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
Последняя строка кода динамически обновляется по мере преобразования файла.Когда я копирую / вставляю / echo / передаю этот точный текст в свой grep, он находит 17% просто отлично, но когда я запускаю его по-настоящему, он находит пшик.
Редактировать:Когда я отправляю выходные данные из lame в текстовый файл, вот как выглядят результаты:
Похоже, я мог бы перенести выходные данные во временный файл и прочитать оттуда процент завершения, но это кажется неудобным, как будто должен быть более элегантный способ сделать это.
Решение 3
В итоге я использовал 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];
}
}
Другие советы
Я подозреваю, что вы, возможно, не сможете этого сделать.Процентный вывод, вероятно, будет поступать на терминал через проклятия (чтобы разрешить динамическое обновление на месте), и таким образом, будет ограниченный вывод через стандартный вывод.
Возможно, стоит перенаправить выходные данные в файл и посмотреть, что там будет записано.т. е.
lame > /tmp/lame.log
lame, вероятно, не выводит эту информацию таким же образом, когда не подключен к терминалу.Попробуйте запустить свою убогую команду с в конце "> output.txt" и посмотрите, что она выводит при подключении к другому процессу.
Другая весьма вероятная возможность заключается в том, что "17%" на самом деле никогда не выводится на печать.Что, вероятно, является печатью, так это:
%, двигаться влево, 1, двигаться влево, 2, двигаться влево 3, ...двигаться влево, двигаться влево, 1, 7, двигаться влево 8 и т.д.