特定のキャラクターが正常に削除された回数を数えたいです。問題は、ログファイルの1行にスクリプトが文字を削除しようとしているという事実が表示されることです。
Prepare to remove role X
次の行は、削除が成功したかどうかを示します。
正常に削除されました:
Delete Successful
削除に失敗しました:
Failed to delete role X: error code
成功した文字の削除回数を計算する方法は?次のgrepを使いたいです。
grep "Delete Successful" | wc -l
ただし、上記の役割と同じようにログインしたポリシーも削除します。つまり:
Prepare to delete policy X
Delete Successful
または
Failed to delete policy X: error code
1行で「役割を削除する準備」を検索した後、次の行に「削除成功」と表示された回数を計算する方法はありますか?
答え1
grep
GNUを使用している場合、grep
迅速で汚れた解決策は次のとおりです。
grep -A1 "Prepare to remove role" | grep "Delete Successful" | wc -l
grep オプションは、-A1
grep に一致する行と一致する行の次の行を印刷するように指示します。その後、2番目のgrepは正常に削除された行のみを印刷します。
これは、「役割Xの削除準備完了」行の直後に「削除成功」行が常に続く場合にのみ安定して機能します。
wc -l
また、注:grepにはその機能が組み込まれているため、必要はありません。
grep -A1 "Prepare to remove role" | grep -c "Delete Successful"
答え2
awkを使用してください:
awk '/Delete Successful/ && last_line ~ /Prepare to remove role/ {n++}
{last_line=$0}
END {print n+0}'
答え3
これがログに「削除成功」する唯一の2つの方法であると仮定すると、いくつかの数学を使用するのはどうでしょうか?
SUCCESS=$(grep 'Delete Successful' | wc -l)
POLICY_COUNT=$(grep 'Prepare to delete policy X' | wc -l)
POLICY_FAIL=$(grep 'Failed to delete policy X' | wc -l)
POLICY_SUCCESS=$(( $POLICY_COUNT - $POLICY_FAIL ))
ROLE_SUCCESS=$(( $SUCCESS - $POLICY_SUCCESS ))
答え4
(純粋なシェルアルゴリズムは外部ツールよりはるかに遅いことが証明されているので、これに対するすべての参照を削除しました。しかし、ベンチマークデータは興味深いかもしれません。)
テストデータ:
Prepare to remove role foo
Delete Successful
Prepare to remove role bar
Failed to delete role bar: 1
Prepare to remove policy baz
Delete Successful
Prepare to remove role ban
Delete Successful
something
else
Prepare to remove role bay
Failed to delete role bar: 2
Prepare to remove role bat
Failed to delete role bar: 1
基準上記のテストデータを1回繰り返す百万時間(例:306MB)、3回のインターリーブ実行で得られた最良の結果、real
時間の増加に基づいてソート:
テストコード:
for index in {1..3}
do
for path in grep.sh awk.sh
do
echo "$path:"
time bash "$path"
echo
done
done
テストシステム:Intel Core i7 @ 3.07 GHz、6GB RAM。