awk - 두 단계를 하나로 결합

awk - 두 단계를 하나로 결합

다운로드가 진행 중인지 확인하려면 Transmission-remote의 출력 테이블을 읽어야 합니다. 현재 이는 다음을 통해 달성됩니다.

trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"
[ "$($trans | awk '! /awk/ && /n[/]a/ {print $2}')" == "n/a" ] \
|| [[ $($trans | awk '! /awk/ && /%/ {print substr($2, 1, length($2)-1)}' | sort -n | head -n 1) -lt 100 ]]

문자열 "n/a"가 있거나 완료 <100%가 있는지 찾습니다. 작성된 방식에 따르면 동일한 테이블에 대해 "원격 전송"을 두 번 조사해야 합니다.

샘플 테이블 출력:

ID  Done    Have     ETA          Up      Down  Ratio Status       Name
1   100%    3.38 GB  Done         0.0     0.0   1.00  Finished     Fish Documentary.mkv
2   100%    5.87 GB  Unknown      0.0     0.0   0.00  Idle         Ethical Coding.pdf
3   100%    1.33 GB  Done         0.0     0.0   1.99  Finished     Bacon.jpg
4   100%    1.26 GB  Unknown      0.0     0.0   0.00  Idle         Eggs.png
5   100%   10.89 GB  Done         0.0     0.0   1.00  Finished     Invest in gold.pdf
Sum:            23.63 GB               0.0     0.0

awk 매개변수를 하나로 결합하는 것이 가능합니까? 아니면 누군가 원하는 결과를 얻기 위한 더 간단하거나 깔끔한 방법을 제안할 수 있습니까?

궁극적인 목표는 다운로드하는 동안 NAS의 빨간색 LED가 빨간색으로 깜박이고 모든 다운로드가 완료되면 계속 흰색으로 바뀌도록 하는 것입니다.

원본 스크립트는 다음과 같습니다.https://pastebin.com/tKXc8mFW

답변1

Pastebin 게시물의 코드를 살펴본 후 다음과 같이 생각합니다.

trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"

while
 [ "$($trans | awk '! /awk/ && /n[/]a/ {print $2}')" == "n/a" ] \
 || [[ $($trans | awk '! /awk/ && /%/ {print substr($2, 1, length($2)-1)}' | sort -n | head -n 1) -lt 100 ]] \
 || find $dir -mindepth 1 -maxdepth 1 | read
do
 sleep 10
done

다음과 같아야 합니다(테스트되지 않음).

downloading() {
    transmission-remote '0.0.0.0:9092' -n "$user:$pass" -l |
        awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}' ||
    find "$dir" -mindepth 1 -maxdepth 1 | read -r
}

while downloading; do
    sleep 10
done

설명하다:

귀하의 질문에 있는 표는 샘플 입력일 수 있지만 찾으려는 값이 포함되어 있지 않은 것 같습니다.

"해당 사항 없음" 문자열이 존재하거나 완료 수준이 <100%입니다.

내 생각에는 주어진 코드의 두 번째 열에 있어야 하므로 테스트에 유용하지 않습니다.

다음 목표 값 중 일부를 포함하도록 수정하면 다음과 같습니다.

$ cat file
ID  Done    Have     ETA          Up      Down  Ratio Status       Name
1   100%    3.38 GB  Done         0.0     0.0   1.00  Finished     Fish Documentary.mkv
2    25%    5.87 GB  Unknown      0.0     0.0   0.00  Idle         Ethical Coding.pdf
3   100%    1.33 GB  Done         0.0     0.0   1.99  Finished     Bacon.jpg
4    77%    1.26 GB  Unknown      0.0     0.0   0.00  Idle         Eggs.png
5    n/a   10.89 GB  Done         0.0     0.0   1.00  Finished     Invest in gold.pdf

이것을 변경하십시오 :

trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"

이와 관련하여:

trans() { transmission-remote '0.0.0.0:9092' -n "$user:$pass" -l; }

다른 문제를 해결하려면 코드를 변수가 아닌 함수에 저장해야 합니다(참조:https://mywiki.wooledge.org/BashFAQ/050) 다음과 같이 변경합니다.

trans() { cat file; }

이제 위의 입력으로 테스트해 보겠습니다. 그러면 원하는 대로 들립니다.

$ trans | awk '($2 ~ "[/%]") && ($2+0 < 100)'
2    25%    5.87 GB  Unknown      0.0     0.0   0.00  Idle         Ethical Coding.pdf
4    77%    1.26 GB  Unknown      0.0     0.0   0.00  Idle         Eggs.png
5    n/a   10.89 GB  Done         0.0     0.0   1.00  Finished     Invest in gold.pdf

그러나 귀하의 질문에 예상되는 결과가 없다는 점을 고려하면 이것은 단지 추측일 뿐입니다.

조건 중 하나라도 충족되면 성공/실패 종료 상태를 얻고 싶을 수도 있습니다. 이 경우 상황은 다음과 같습니다.

$ if trans | awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}'; then
    echo "found it"
fi
found it

trans또는 awk 스크립트가 성공적으로 종료될 때까지(즉, 대상을 찾을 수 없음을 의미) 매초마다 호출되는 루프에서 이 작업을 수행 하려는 경우 :

$ while trans | awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}'; do
    echo "flash red"
    sleep 1
done
flash red
flash red
flash red
flash red

답변2

다음 AWK 호출은 두 번째 열에 "n/a"가 있거나 두 번째 열이 100% 미만인 경우 성공적으로 종료되고, 그렇지 않으면 실패합니다.

awk 'BEGIN { r = 1 } $2 == "n/a" || ($2 ~ "%" && int($2) < 100) { r = 0; exit } END { exit r }'

귀하의 스크립트에서는

while
 $trans | awk 'BEGIN { r = 1 } $2 == "n/a" || ($2 ~ "%" && int($2) < 100) { r = 0; exit } END { exit r }' \
 || find $dir -mindepth 1 -maxdepth 1 | read
do
 sleep 10
done

AWK 스크립트는 열 2에서 "n/a"를 찾거나 정수로 변환할 때 100보다 작은 백분율 값을 찾습니다.

관련 정보