単語数を数え、その数を変数に割り当てるよりエレガントな方法はありますか?

単語数を数え、その数を変数に割り当てるよりエレガントな方法はありますか?

スクリプトがあります。

#!/bin/bash

/root/xiotech status > xiostatus.tmp
SyncCount=$(grep -c Sync xiostatus.tmp)
PauseCount=$(grep -c paused xiostatus.tmp)
CopyingCount=$(grep -c Copying xiostatus.tmp)

if [ "$SyncCount" -eq "11" ]
then echo All 11 mirrors are in sync.

else echo $PauseCount mirrors are paused and $CopyingCount mirrors are syncing.
fi

rm -f xiostatus.tmp

awkのようなものを使ってこれらの数を計算して「変更」するよりエレガントな方法はありますか?この場合、ファイルが小さくてあまり問題ではありませんが、ファイルが900 MBの場合、3回ナビゲートするのに追加のサイクルがかかります。

ベストアンサー1

awkスクリプト全体を簡単に置き換えることができます。

#!/usr/bin/awk -f

/Sync/ {SyncCount++}
/paused/ {PauseCount++}
/Copying/ {CopyingCount++}

END {
    if(SyncCount == 11)
        print "All 11 mirrors are in sync."
    else
        print (+PauseCount) " mirrors are paused and " (+CopyingCount) " mirrors are syncing."
}

変数を数値として扱うように(+var)強制することです(したがって、変数が設定されていない場合は出力されます)。ブロックを使用してすべての変数を初期値に設定することもできます。awk0BEGIN0

BEGIN {
    SyncCount = PauseCount = CopyingCount = 0
}

ファイルとして保存して実行してみてくださいawk -f /path/to/the/script.awk xiostatus.tmp。一時ファイルが不要な場合でもこれを行うことができます/root/xiotech status | awk -f /path/to/the/script.awk

スクリプトに実行ビットを設定すると、それをスタンドアロン実行可能ファイル(、または)awkとして呼び出すことができます。/path/to/the/script.awk xiostatus.tmp/root/xiotech status | /path/to/the/script.awk

おすすめ記事