簡體   English   中英

從apache日志中刪除2次后獲取IP的正則表達式

[英]Regular Expression to get the IP after 2 DELETE from apache log

我有sever.log文件。 我的正則表達式是2 DELETE之后提取所有IP

192.168.10.20 - - [18/Jul/2017:08:41:37 +0000] "DELETE /search/tag/list HTTP/1.0" 200 5042 "http://cooper.com/homepage/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5342 (KHTML, like Gecko) Chrome/14.0.870.0 Safari/5342"
10.30.24.3 - - [18/Jul/2017:08:45:15 +0000] "DELETE /search/tag/list HTTP/1.0" 200 4939 "http://www.cole-brown.net/category/main/list/privacy/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/5322 (KHTML, like Gecko) Chrome/14.0.843.0 Safari/5322"
98.5.45.3 - - [18/Jul/2017:08:45:49 +0000] "GET /apps/cart.jsp?appID=8471 HTTP/1.0" 200 4958 "http://knight-chase.com/post.jsp" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_3; rv:1.9.6.20) Gecko/2013-11-03 17:44:01 Firefox/3.8"

我的代碼如下

with open (r'C:\Users\ubuntu\Desktop\Tests\apache.log', 'r') as fr:
    lined = fr.read()
#print (line)
regex = r"DELETE.*?DELETE.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
print(re.findall(regex, lined,re.DOTALL))

我的輸出

['14.0.843.0']

想要的

['98.5.45.3']

您將IP與第二個DELETE放在同一行,因為它是最接近的IP。 您需要轉到下一行:

regex=r'DELETE.*?DELETE[^\n]*\n(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
print(re.findall(regex, lined, re.DOTALL))

請參閱此正則表達式演示

[^\\n]*\\n部分只會匹配0+個字符,除了換行符,然后是換行符。

或者,您可以使用和等價的:

regex=r'DELETE[\s\S]*?DELETE.*\n(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
print(re.findall(regex, lined))

請參閱此正則表達式演示 在這里, [\\s\\S]*? (將匹配任何0+字符盡可能少.作為不能使用re.DOTALL被除去),然后.*將匹配比換行符字符以外的任何字符0+。

您可以使用正則表達式。 這有點復雜,因為它會驗證ip地址如果任何大於255的正則表達式段無法捕獲它

import re

s = '''192.168.10.20 - - [18/Jul/2017:08:41:37 +0000] "DELETE /search/tag/list HTTP/1.0" 200 5042 "http://cooper.com/homepage/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5342 (KHTML, like Gecko) Chrome/14.0.870.0 Safari/5342"
10.30.24.3 - - [18/Jul/2017:08:45:15 +0000] "DELETE /search/tag/list HTTP/1.0" 200 4939 "http://www.cole-brown.net/category/main/list/privacy/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/5322 (KHTML, like Gecko) Chrome/14.0.843.0 Safari/5322"
98.5.45.3 - - [18/Jul/2017:08:45:49 +0000] "GET /apps/cart.jsp?appID=8471 HTTP/1.0" 200 4958 "http://knight-chase.com/post.jsp" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_3; rv:1.9.6.20) Gecko/2013-11-03 17:44:01 Firefox/3.8"'''
expr = r"(?:.+DELETE.+[\r\n]+){2}^((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\b"

result = re.search(expr, s, re.MULTILINE)  # you may use re.findall with same arguments set
print(result.group(1))  # first group contains ip address

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM