сортировка выходных данных из постоянно обновляемых выходных данных

StackOverflow https://stackoverflow.com/questions/1023914

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать простой скрипт вокруг 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 в текстовый файл, вот как выглядят результаты:

lameout.txt

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

Это было полезно?

Решение 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 и т.д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top