来自不断更新的输出的grep'ing输出

问题描述 投票:1回答:3

我正在尝试围绕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

最后一行代码在转换文件时动态更新。当我复制/粘贴/回显/管道这个确切的文本到我的grep它找到17%就好了,但当我真正运行它时,它找到zilch。

编辑:当我将lame的输出抛出到文本文件中时,结果如下所示:

lameout.txt

看起来我可以将输出推送到临时文件并读取完成的百分比,但这感觉很尴尬,就像应该有更优雅的方式来做到这一点。

scripting grep darwin
3个回答
1
投票

我怀疑你可能无法做到这一点。百分比输出可能会通过curses进入终端(允许就地动态更新),因此通过stdout输出的数量有限。

将输出重定向到文件并查看在那里写入的内容可能是值得的。即

lame > /tmp/lame.log

1
投票

当没有连接到终端时,lame可能不会以相同的方式输出此信息。尝试在末尾“> output.txt”运行你的lame命令,并查看附加到另一个进程时打印的内容。

另一个非常可能的可能性是“17%”实际上从未打印出来。印刷的可能性是:

%,向左移动,1,向左移动,向左移动2,向左移动3,向左移动,向左移动,向左移动1,7,向左移动8等。


1
投票

我最终使用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];
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.