スクリプトがあります。
#!/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)
強制することです(したがって、変数が設定されていない場合は出力されます)。ブロックを使用してすべての変数を初期値に設定することもできます。awk
0
BEGIN
0
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