我想从Linux auth.log中提取登录信息并报告,但是正则表达式无法提取相关信息。我认为以空格(.*)
为边界的组将匹配这些空格之间的完整文本段。它适用于第一个单词和用户名,但对于IP地址,它会从IP地址开始吐出整行文本。我错过了什么?
s='Accepted keyboard-interactive/pam for user101 from 10.19.36.76 port 36272 ssh2'
s2='Postponed keyboard-interactive for user101 from 10.19.36.76 port 36303 ssh2 [preauth]'
w = re.compile ("(.*) keyboard-interactive.*for (.*) from (.*) ");
m = w.search(s2)
if m:
print "login by:", m.group(2)
print "src ip :", m.group(3)
print "status :", m.group(1)
输出:
login by: user101
src ip : 10.19.36.76 port 36303 ssh2 [preauth]
status : Postponed
OR:
login by: user101
src ip : 10.19.36.76 port 36272 ssh2
status : Accepted
答案 0 :(得分:1)
因为(.*)
会匹配from
之后的所有内容(新行除外)。如果您只想匹配IP地址,可以使用如下字符类:
[\d.]+
或者更安全的方法使用以下内容:
((?:\d{1,3}\.){3}\d{1,3})
答案 1 :(得分:1)
w = re.compile ("(.*?) keyboard-interactive.*for (.*?) from (.*?) ");
^^ ^^ ^^
让你的正则表达式非贪婪