我想打印在 Ubuntu 中创建的日志消息中与 USB 相关的行。这是我的代码:
>>> import re
>>> fd = open("/var/log/syslog.1", "r")
>>> for lines in fd:
... if re.match("usb", lines):
... print lines
(顺便说一句,我不确定文件 syslog.1 是否正确。但是,我确实在其中找到了很多消息,其中一些与 USB 相关)
@SidNoob:添加到日志主题(可能与 python 无关),我假设您正在寻找来自 usb 守护程序或驱动程序的日志。如果是这种情况,您可能正在查看正确的日志文件“/var/log/syslog”,它记录了与内核相关的消息(包括驱动程序)。如果它是一个应用程序(具有不同的日志级别),那么您可能需要查看“/var/logs/messages”。
但重点是:有时打开“/var/log/syslog”之类的文件进行读取可能会占用大量内存,因为您正在将文件加载到 RAM 中。在服务器类型的环境中,这可能会运行到 MB 甚至更长的时间。有一个命令“dmesg”,无论“var/log/syslog”文件的内容是什么,它都会打印到标准输出。因此,除了打开这个大文件之外,您还可以将“dmesg”的输出存储到一个字符串中,然后逐行解析。
您可能认为这两种方式是相同的,并且在运行 python 程序时可能会占用相同的内存。是的,但如果您清除“dmesg”输出,则不会。“dmesg”是一个环形缓冲区,因此您可以在运行 USB 应用程序之前使用“dmesg -c”将其清除,并在启动应用程序后发出“dmesg”。通过这种方式,您可以减少解析的行数,从而加快程序速度。
希望这会增加您的知识和程序。
对于最近的消息,您想要/var/log/syslog
-/var/log/syslog.1
基本上是旧消息的备份。
阻止您的代码工作的事情是您正在使用re.match()
而不是re.search()
- 正如您从这些链接的文档中看到的那样,re.match()
仅在正在搜索的文本的开头匹配。
但事实上,您根本不需要使用正则表达式。这是您的代码的替代方案:
>>> with open("/var/log/syslog") as f:
... for line in f:
... if "usb" in line.lower():
... print line
...
这里有一些不同之处:
我们正在使用with
上下文管理器打开文件。即使出现问题,这也有助于 Python 清理和关闭文件,这是养成的好习惯。
按照 Python 的惯例,我们将文件变量称为f
. fd
会让阅读您的代码的人认为您在谈论文件描述符,这不是一回事。
由于它只有一行,我们将调用字符串变量line
,而不是lines
。
而不是正则表达式,我们可以只检查是否"usb"
在某处的行中(并且我们在检查之前将行转换为小写,以便我们也可以捕获"USB"
原始行。