我想过滤日志文件以保持所有行都匹配特定模式。我想用 Python 做到这一点。
这是我的第一次尝试:
#!/usr/bin/env python
from sys import argv
script, filename = argv
with open(filename) as f:
for line in f:
try:
e = line.index("some_term_I_want_to_match")
except:
pass
else:
print(line)
我怎样才能改进它:
- 将结果保存到具有相似名称(即不同扩展名)的新文件中
- 使用正则表达式使其更加灵活/强大。
(我刚刚在学习 Python。这个问题既是关于学习 Python 的,也是关于完成这个特定结果的。)
好的,这是我到目前为止的想法......但是你如何做相当于在下面的行中添加一个 r
re.compile(r"\s*")
在下一行中,字符串不是字符串文字?
re.compile(a_string_variable)
除此之外,我认为这个更新版本可以完成这项工作:
#!/usr/bin/env python
from sys import argv
import re
import os
import argparse #requires Python 2.7 or above
parser = argparse.ArgumentParser(description='filters a text file on the search phrase')
parser.add_argument('-s','--search', help='search phrase or keyword to match',required=True)
parser.add_argument('-f','--filename', help='input file name',required=True)
parser.add_argument('-v','--verbose', help='display output to the screen too', required=False, action="store_true")
args = parser.parse_args()
keyword = args.search
original_file = args.filename
verbose = args.verbose
base_file, ext = os.path.splitext(original_file)
new_file = base_file + ".filtered" + ext
regex_c = re.compile(keyword)
with open(original_file) as fi:
with open(new_file, 'w') as fo:
for line in fi:
result = regex_c.search(line)
if(result):
fo.write(line)
if(verbose):
print(line)
这可以很容易地改进吗?
最佳答案
好吧,你知道的,你已经自己回答了大部分问题:)
对于正则表达式匹配,使用 re
module (该文档有很好的解释性示例)。
您已经使用open()
函数打开文件。使用相同的功能打开文件进行写入,只需提供相应的mode
参数(如果需要,“w”或“a”与“+”组合,参见help(open)
在 Python 交互式 shell 中)。就是这样。
关于python - 使用 Python 过滤 Linux 日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21593730/