3

複数の 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 フラグを外しました。私のスクリプトには必要ありません。

4

3 に答える 3

3

UNIX の哲学に注意してください。

 A program should do one and only one thing and do it well.

あなたのケースに適用されます:

A script should do one and only one thing and do it well.

あなたの「厄介なハック」は、実際には正しい方向への一歩です。

いつの日か別のスクリプトで「--no-title」を見る必要があるかどうかはわかりません。その時点で、UNIX の哲学に従えば、それを行うためのスクリプトが既にあるはずです。

スクリプトに一度に多くのことを実行させようとすると、複雑になることが 1 つあります。地獄を引用してください。

複雑にしないでおく。

于 2011-08-20T00:59:10.600 に答える
1

正しい使い方は次のとおりです。

watch -d --no-title "/bin/bash 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"
于 2011-08-20T00:24:34.773 に答える
0

tail -f <file>役に立ちますか?

男の尻尾

于 2011-08-20T01:20:50.833 に答える