0

我的问题与其他人的问题非常相似,但我还没有找到我正在寻找的确切答案,所以我希望一位资深的 Python 用户能够进一步帮助我。

我正在为我的工作学习脚本方法,但他们不会派我去培训中心学习,所以我的首席技术官说我应该学习如何从汇总的 Wireshark 收集报告中创建日志文件。我在 Bash 中很幸运,但他希望我能流利地使用 Python - 没有任何脚本/编程方面的帮助或背景,这是一项艰巨的任务。我正在尝试从 Wireshark 报告中 grep 到一个新文件,给出 DNS 流量出现的计数和列表。唯一的事情是为了有效,它需要能够在每次使用时使用新的数据集,否则这是一个毫无意义的练习。

>> f1 = open('/home/user/file','r')
>> for line in f1
** if "DNS" in line:
**** print line

两个问题:
1)我如何计算每个 DNS 的出现?
2)我将如何管道/打印到一个新的 txt 文件?

4

2 回答 2

0

您可以简单地初始化一个新变量来计算您的项目

counter = 0

if 'DNS' in line:
    counter += 1

print counter

WRT 保存您的数据,您可以在 python 中进行,也可以打印出数据并将其输出到文件

counter = 0
data = []

if 'DNS' in line:
    counter += 1
    data.append(line)

to_s = "\n".join(data)
f = open('out.txt', 'w')
f.write(to_s)
f.close()
于 2013-06-10T20:56:54.403 回答
0

这可能更高级一点,但是,关于文件处理,我真的很喜欢做一些生成器流水线!

# this is a generator (an iterable) which only outputs a 
# line containing "DNS" if it was requested in an iteration
# furthermore, the way i use a generator here is called "list comprehension"
dns_lines = ( line for line in open('/home/user/file','r') if "DNS" in line )

# the with-statement uses python's magic-methods to take care of 
# opening and closing the file
with open("output", 'w') as f:
    # enumerate works on generators
    # it enumerates each item that is iterated over
    # a tuple is returned (count, line)
    for count_line in enumerate(dns_lines):
        f.write("%d - %s" % (count_line))

David Beazley在此处了解有关生成器和文件处理的更多信息

我假设,你想了解更多关于 python 有多强大的信息。因此,我的长评论。:)

// 编辑:关于这里会发生什么的更多解释:

  • 第一行将生成一个生成器对象。
  • 文件读取将在第二个 for 循环中开始运行。
  • 一旦开始此迭代,文件将被读取,直到找到包含“DNS”的行。
  • 将创建一个元组(计数,行)并移交给这个迭代。
  • 元组使用格式字符串写入文件!
  • 下一次迭代将发生并请求下一行,这将再次开始文件读取。

我希望这有帮助!生成器防止将整个列表加载到内存中,它们允许许多巧妙的技巧和流水线处理。但是,它的内容比您在这篇文章中提到的要多得多!

于 2013-06-10T20:57:47.840 回答