Shell
解析 apache 日誌以排除 IP 範圍
我需要在一大堆 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
這可以幫助您入門,但如果查詢應該經常執行並在大日誌文件上執行,它可能不是一個好的解決方案。
祝你好運!