複数の http ステータス コードを持つ IP アドレスを grep および awks してカウントするスクリプトがあります。私の目標は次のとおりであるため、スクリプトが何であるかは実際には問題ではありません。
このスクリプト内で「watch」コマンドを呼び出して、動的 apache ログから受信した新しいデータで数秒ごとに表示を更新したいと考えています。
次のようにスクリプトをうまく呼び出すことができます:
$ watch --no-title ./bad_request.sh
しかし、コマンド プロンプトからのスクリプトの呼び出しをより明確にするために、むしろスクリプト自体の中に「watch」コマンドを入れたいと思います。
スクリプトは次のとおりです。
#!/bin/bash
#identify repeated offenders through 401 and 403 status codes
for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep "( 401| 403)"| grep -c $ip; done | sort -k2 -r
今、スクリプト内の for ループの直前に「watch -d --no-title」を挿入しようとしましたが、怒ってエラーになります。最初のコマンドの最後までしか処理していないからだと思います。スクリプト全体にバッククォートと $() を入れてみました。また、スクリプトの大部分を bash 関数にして、関数で watch を呼び出してみました。サイコロはありません。
何か案は?
ところで、私はスクリプトの改善にもオープンです - 私はそれが少し冗長/非効率的であることを認識しています. もちろん、それはおそらく別のスタック オーバーフローの質問のために予約する必要があります。
ありがとう、
ケビン
編集:もう1つ、電話することはできますwhile true; do <bulk of script>; sleep 1; clear;
が、それは嫌いです。動作しますが、画面がちらつきます。これは正しい方法ではありません。
編集 2: 機能するもう 1 つの厄介なハックは、単純に 2 つのスクリプトを作成することです。最初のものは次のとおりです。
watch --no-title ./bad_request
そして、そのスクリプトを呼び出すだけです。それはうまくいきますが、もっと良い方法が必要です。
編集 3 (すみません...): 「watch」から -d フラグを外しました。私のスクリプトには必要ありません。