我是python的新手,我正在尝试学习它。我想从DNS区域文件中获取信息。 DNS文件包含以下条目:
something 600 A 192.168.123.45
600 A 192.168.123.46
someelse CNAME something
anotherone A 192.168.123.47
nextone CNAME anotherone
anotherone TXT ( "te asd as as d" )
目标是获取主机名,如果有相应的TXT条目,我也想获得该条目的信息。
所以我开始只是处理文件,如果我要描述这些条目,记录类型是在[2]或[1],在它之后,我得到了IP。所以我现在有这样的事情:
for line in data:
word = line.split()
if len(word) > 2:
if "CNAME" == word[2]:
rectype = "CNAME"
arecord = word[3].replace('.domain.com.', '')
print rectype + " " + arecord
if "CNAME" == word[1]:
rectype = "CNAME"
arecord = word[2].replace('.domain.com.', '')
print rectype + " " + arecord
if "A" == word[2]:
rectype = "A"
print rectype + " " + word[3]
if "A" == word[1]:
rectype = "A"
print rectype + " " + word[2]
好吧,到目前为止一切都很好..但是现在如果我想获得相应的TXT记录,我是否需要在每行的文档中处理每一行,还是他们更容易,更有效的方法呢?
答案 0 :(得分:0)
我建议您构建一个字典,其键是标识符(“anotherone”将是您示例中的一个示例),其值为字符串(或者可能是字符串列表 - 我在DNS上生锈并且不确定如果可以多次使用。)
当您遇到CNAME和A记录时,将标识符作为键添加到字典中,并将其对应的值初始化为空列表。然后当你点击一行中有“TXT”时,在字典中查找该标识符并将该行添加为值。
答案 1 :(得分:0)
Python的一部分优点是你可以编写像英语一样的代码,它使用直观的操作符。
您有重复代码很多。在您的示例中,我们可以看到,只要弹出“关键字”,例如A
或CNAME
,您就可以使用下一个标记。在这里,我使用了in
Python关键字来检查元素是否在某种集合中。这是一个布尔值,所以如果它返回true,那么我接下一个元素,即tokens[tokens.index(keyword) + 1]
。
同样,in
也可用于字符串和子字符串搜索。我检查当前行中是否有“TXT”,如果是,我认为你想要它之后的一切?我使用splice运算符来指定范围。
line[line.index("TXT") + 3:]
表示我希望所有内容都在之后索引line.index("TXT") + 3
。
KEYWORDS = ["CNAME", "A"]
for line in data:
tokens = line.split()
if len(tokens) > 2:
record = ""
for keyword in KEYWORDS:
if keyword in tokens:
record = keyword + " " + tokens[tokens.index(keyword) + 1]
if "TXT" in line:
txt_data = line[line.index("TXT") + 3:]
record += "TXT: " + txt_data
print record