Scripting grep';从不断更新的输出中删除输出

Scripting grep';从不断更新的输出中删除输出,scripting,grep,darwin,Scripting,Grep,Darwin,我正试图围绕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 (h

我正试图围绕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 LAME 3.99(alpha 12009年6月4日19:42:31)32位(http://www.mp3dev.org/) 警告:alpha版本仅用于测试 使用多相低通滤波器,过渡带:16538 Hz-17071 Hz Encoding/Users/jkubicek/Desktop/Driver.wav 发送至/Users/jkubicek/Desktop/Driver.mp3 编码为44.1 kHz j立体声MPEG-1第三层(11x)128 kbps qval=3 帧| CPU时间/estim |实时/estim |播放/CPU | ETA 1500/8765(17%)| 0:02/0:15 | 0:03/0:17 | 14.654x | 0:14 最后一行代码在文件转换时动态更新。当我复制/粘贴/回显/将这些精确的文本导入到我的grep中时,它会发现17%很好,但当我真正运行它时,它会发现zilch

编辑: 当我将lame的输出放入文本文件时,结果如下:


看起来我可以将输出推送到一个临时文件,然后从中读取完成百分比,但这感觉很尴尬,好像应该有一种更优雅的方法来实现这一点。

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

将输出重定向到一个文件并查看其中写入的内容可能是值得的。i、 e

lame > /tmp/lame.log

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

另一个很可能的可能性是“17%”从未真正打印出来。打印可能是:


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

我最后使用
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也可能输出您的图形,然后输出^H(或退格)。因此,grep可能无法获得回车来识别EOL。Lame还可以根据标准输出发送到的位置更改其输出