【发布时间】:2012-12-24 23:40:59
【问题描述】:
我有一个包含多个 IP 地址的文件。 4行txt大约有900个IP。我希望输出为每行 1 个 IP。我怎样才能做到这一点?基于其他代码,我想出了这个,但它失败了,因为多个 IP 在单行上:
import sys
import re
try:
if sys.argv[1:]:
print "File: %s" % (sys.argv[1])
logfile = sys.argv[1]
else:
logfile = raw_input("Please enter a log file to parse, e.g /var/log/secure: ")
try:
file = open(logfile, "r")
ips = []
for text in file.readlines():
text = text.rstrip()
regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})$',text)
if regex is not None and regex not in ips:
ips.append(regex)
for ip in ips:
outfile = open("/tmp/list.txt", "a")
addy = "".join(ip)
if addy is not '':
print "IP: %s" % (addy)
outfile.write(addy)
outfile.write("\n")
finally:
file.close()
outfile.close()
except IOError, (errno, strerror):
print "I/O Error(%s) : %s" % (errno, strerror)
【问题讨论】:
-
您正在寻找 IPv4 地址的规范形式。请注意,还有其他可接受的形式,即使是 IPv4 地址。例如如果您在 localhost 端口 80 (2130706433 == 0x7f000001 == 127.0.0.1) 上运行 HTTP 服务器,请尝试 2130706433。当然,如果你控制了文件的格式,你就不需要担心这些事情......但是,如果你可以切实地支持 IPv6,它将使你的脚本适应未来。
-
re.findall()总是返回一个列表。它永远不是None。
标签: python