使用Python筛选Linux日志文件
我想过滤一个日志文件,以保持所有行与特定模式匹配。我想用Python来实现这一点 这是我的第一次尝试:使用Python筛选Linux日志文件,python,regex,linux,filter,Python,Regex,Linux,Filter,我想过滤一个日志文件,以保持所有行与特定模式匹配。我想用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
#!/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)
我如何将其改进为:
- 将结果保存到具有类似名称(即不同扩展名)的新文件中
- 使用正则表达式使其更加灵活/强大
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)
这很容易改进吗?好吧,你知道,你自己已经回答了大部分问题:) 对于正则表达式匹配使用(文档中有相当多的解释性示例)
您已使用
open()
函数打开文件。使用相同的函数打开文件进行编写,只需提供相应的模式
参数(“w”或“a”与“+”组合,如果需要,请参阅Python交互式shell中的帮助(打开)
)。就这样。为什么不使用grep
?如果您想使用正则表达式并坚持用Python编写,请查看re
模块。不需要try…除了我认为这里的
。我更新了我的问题。我想用Python来做这件事,因为我正在学习Python。。。。并使用模块更改文件扩展名。好吧,“改进”不是一个合适的词来描述您的需求。如果它符合你的要求,就不应该改进。如果您还需要smth,那么应该明确地制定它。我将通过在一个语句中合并两个文件打开来降低嵌套级别,但这需要一个对象实现。或者简单地使用try:f=open(“original”)。。。最后:f.close()…
,这与语句的意思几乎相同