장기 실행 명령의 출력에서 ​​여러 항목 필터링

장기 실행 명령의 출력에서 ​​여러 항목 필터링

요약:

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;

이것은 훌륭하게 작동합니다. 진행 상황이 표시되고 깜박이지 않습니다. 두 번째 작업은 진행 상황과 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;

관련 정보