grep'ing вывод из постоянно обновляемого вывода - PullRequest
1 голос
/ 21 июня 2009

Я пытаюсь написать простой скрипт для Lame, чтобы настроить программу для моих конкретных целей. То, что я хотел бы сделать, это проанализировать только процентную полноту из вывода 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 / pipe этот точный текст в мой grep, он находит 17% просто отлично, но когда я запускаю его по-настоящему, он находит zilch.

Edit: Когда я выбрасываю вывод из lame в текстовый файл, вот как выглядят результаты:

lameout.txt

Похоже, что я мог бы перенести вывод во временный файл и прочитать оттуда процент завершения, но это неудобно, как будто должен быть более элегантный способ сделать это.

Ответы [ 3 ]

1 голос
/ 21 июня 2009

lame, вероятно, не выводит эту информацию таким же образом, когда не подключен к терминалу. Попробуйте выполнить команду lame в конце "> output.txt" и посмотрите, что она печатает при подключении к другому процессу.

Другая очень вероятная возможность состоит в том, что "17%" никогда не распечатывается. Что, вероятно, является печатью:

%, двигаться влево, 1, двигаться влево, 2, двигаться влево 3, ... двигаться влево, двигаться влево, 1, 7, двигаться влево 8 и т. Д.

1 голос
/ 17 сентября 2009

В итоге я использовал 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 голос
/ 21 июня 2009

Я подозреваю, что вы не сможете сделать это. Процентный вывод, вероятно, будет поступать на терминал через curses (чтобы разрешить динамическое обновление на месте), и поэтому через stdout будет ограниченный вывод.

Возможно, стоит перенаправить вывод в файл и посмотреть, что там написано. т.е.

lame > /tmp/lame.log
...