複数のApacheログでいくつかのリクエストを見つける必要があります。私の唯一の要求は次のとおりです。
私が持っている50のIP範囲のリストに含まれていないIPアドレスからの要求を確認するだけです。
正規表現awk grepまたは他のものを組み合わせてこれを達成するにはどうすればよいですか?簡単な方法は思い出せません。アイデアは、各行をインポートして最初の部分(IPアドレス)を取得し、すべての範囲を含むファイルと一致させ、存在しない場合に表示することです。どうすればいいかわからないので、どんな助けでも大歓迎です!
サンプル:
一般的なhttpログ行は次のとおりです。
123.456.789.012 - - [22/Oct/2012:06:37:48 +0100] "GET /test/test HTTP/1.1" 302 224 "-" "some user agent/4.3.5"
私のIP範囲ファイルの一般的な行は次のとおりです。
192.168.0.1 - 192.168.0.255
もちろん、必要に応じてIP範囲ファイルを192.168.0.1/24表現に変換できます。良い点は、すべての範囲がクラスCであることです(ちょうど気づいた)。したがって、IPアドレスの最初の3つの部分だけが一致すると推測されます。この程度で十分でしょう。
答え1
シンプルで粗い方法はgrepを使うことです。
ファイルの作成(範囲.txt) 範囲は次のとおりです。
192\.168\.0\.[0-9]*
10\.0\.0\.[0-9]*
既存のスコープファイルからファイルを作成するには、sed
次のように使用します。
sed -n -e 's/^\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\) .*$/^\1\\.\2\\.\3\\.[0-9]* /p' your-range-file > ranges.txt
次に、grepを使用して、次のようにそのファイルのパターンに一致する行を除外します。
$ grep -v -f ranges.txt apache-log-file.log
または
$ cat apache-log-file.log | < do some pre cleaning > | grep -v -f ranges.txt
これにより開始できますが、クエリを頻繁に実行し、大容量ログファイルに対して実行する必要がある場合は、良い解決策ではない可能性があります。
頑張ってください!
答え2
Logはログファイル、iprangeはiprangeを含むファイルです。ソリューションのPerl部分はIPアドレスの最初の3つのコンポーネントを取得し、このコンポーネントがiprangesファイルにない場合、forループはそれを印刷します。
for i in `perl -lne 'print $1 if (m/(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}/);' log`
> do
> grep -q $i iprange || echo $i;
> done