継続的に更新された出力からのgrep '出力
質問
特定の用途に合わせてプログラムをカスタマイズするために、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が見つかります。
編集: ラメからの出力をテキストファイルにスローすると、結果は次のようになります。
出力を一時ファイルにプッシュし、そこから完全なパーセンテージを読み取ることができたように見えますが、これを行うにはもっとエレガントな方法があるはずなので、それは厄介に感じます。
解決 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];
}
}
他のヒント
これができないかもしれません。パーセンテージの出力は、おそらく curses を介して端末に送られます(入力を許可するには、動的更新を配置する)、そのため、stdout経由の出力は制限されます。
出力をファイルにリダイレクトして、そこに何が書き込まれるかを確認する価値があるかもしれません。すなわち
lame > /tmp/lame.log
lameは、端末に接続されていない場合、おそらくこの情報を同じ方法で出力していません。最後に">でラメコマンドを実行してみてください。 output.txt"他のプロセスに接続されたときに何が印刷されるかを見てください。
他の非常に可能性の高い可能性は、「17%」実際に印刷することはありません。おそらく印刷とは:
%、左に移動、1、左に移動、2、左に移動3、...左に移動、左に移動、1、7、左に移動8など。