繁体   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