awk - 2つのステップを1つにまとめる

awk - 2つのステップを1つにまとめる

ダウンロードが進行中であることを確認するには、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% があるかどうかを探します。作成された方法によれば、同じテーブルに対して「リモート転送」を2回調べる必要があります。

サンプルテーブル出力:

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パラメータを1つにまとめることは可能ですか?それとも、誰かが望む結果を得るためのより簡単なまたはきれいな方法を提案できますか?

究極の目標は、ダウンロード中に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%です。

私の考えでは、与えられたコードの2番目の列にある必要があるため、テストには役立ちません。

次の目標値の一部を含めるように変更すると、次のようになります。

$ 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

おすすめ記事