長期実行コマンドの出力からの複数項目のフィルタリング

長期実行コマンドの出力からの複数項目のフィルタリング

要約:

Handbrakecliを実行して進行状況を確認する方法そしてETA、点滅せずにダイアログボックスにパイプされます。

詳細:

ディレクトリ内のすべてのビデオファイルを見つけて、そのファイルに対して同時にhandbrakecliを実行するスクリプトがあります。 handbrakecliが実行されるたびに、ファイルなどに関する多くの情報が表示され、その後に次の行が表示されます。

Encoding: task 1 of 1, 3.30 % (295.53 fps, avg 303.23 fps, ETA 00h02m54s)

私のスクリプトでは、handbrakecliコマンドを他のコマンドにパイプ処理し、進行状況を除くすべてをフィルタリングし、それをダイアログボックスに次のようにパイプします。

ピース1

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST" | \
    stdbuf -o0 tr -s '\r' '\n' | \
    stdbuf -o0 grep -oP '(?<=, )\d+(?=\.\d\d \%)' | \
    dialog --gauge "$DIALOG_MSG" 10 70;

これは素晴らしい作品です。進行状況が表示され、点滅しません。 2番目の作業は、進捗状況とETAの表示方法を見つけることでした。これが私が思いついたものです。

ピース2

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" | \
    stdbuf -oL tr -s '\r' '\n' | \
    while read -r str; do
        local REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))");
        local PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)");
        echo "$PROGRESS" | dialog --gauge "$DIALOG_MSG Time remaining: $REMAINING" 10 70;
    done

動作しますが、ダイアログウィンドウが点滅します。これがパフォーマンスと関係があるか(疑いがある)か、それとも全体と関係があるのか​​わかりません。読みながらループはダイアログボックスでは正しく機能しません。

また、ダイアログボックスに接続せずにこれを試しましたが、ダイアログボックスを一度だけ表示してからまったく更新しません。

ピース3

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" | \
    stdbuf -oL tr -s '\r' '\n' | \
    while read -r str; do
        local REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))");
        local PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)");
        dialog --gauge "$DIALOG_MSG Time remaining: $REMAINING" 10 70 $PROGRESS;
    done

最後に私はこれを試しました:

ピース4

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" | \
    stdbuf -o0 tr -s '\r' '\n' | (
        read -r str;                                                                                                                          
        local REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))");
        local PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)");
        echo "$PROGRESS";
    ) | dialog --gauge "$DIALOG_MSG Time remaining: $REMAINING" 10 70;

しかし、効果は良くありません。

私はここにいくつかの基本的な問題があることを知っています。

ベストアンサー1

ピース2が最も近い。入力でマジックマークを見つけることを選択しdialog --gauge、次の行から新しいパーセントを読み取り、新しいマークが表示されるまで次の行から新しいヒントを読みます。XXX

したがって、必要なものを手に入れる必要があります。

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" |
stdbuf -oL tr -s '\r' '\n' |
while read -r str
do
    REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))")
    PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)")
    echo -e "XXX\n$PROGRESS\n$DIALOG_MSG Time remaining: $REMAINING\nXXX"
done | 
dialog --gauge "$DIALOG_MSG Time remaining: " 10 70;

おすすめ記事