Shell

解析 apache 日誌以排除 IP 範圍

  • October 22, 2012

我需要在一大堆 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 部分可以匹配,這應該足夠好了。

一個簡單粗暴的方法可能是使用 grep。

使用您的範圍創建一個文件(ranges.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

這可以幫助您入門,但如果查詢應該經常執行並在大日誌文件上執行,它可能不是一個好的解決方案。

祝你好運!

引用自:https://unix.stackexchange.com/questions/52547