Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python筛选Linux日志文件_Python_Regex_Linux_Filter - Fatal编程技术网

使用Python筛选Linux日志文件

使用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

我想过滤一个日志文件,以保持所有行与特定模式匹配。我想用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)

这很容易改进吗?

好吧,你知道,你自己已经回答了大部分问题:)

对于正则表达式匹配使用(文档中有相当多的解释性示例)


您已使用
open()
函数打开文件。使用相同的函数打开文件进行编写,只需提供相应的
模式
参数(“w”或“a”与“+”组合,如果需要,请参阅Python交互式shell中的
帮助(打开)
)。就这样。

为什么不使用
grep
?如果您想使用正则表达式并坚持用Python编写,请查看
re
模块。不需要
try…除了我认为这里的
。我更新了我的问题。我想用Python来做这件事,因为我正在学习Python。。。。并使用模块更改文件扩展名。好吧,“改进”不是一个合适的词来描述您的需求。如果它符合你的要求,就不应该改进。如果您还需要smth,那么应该明确地制定它。我将通过在一个语句中合并两个文件打开来降低嵌套级别,但这需要一个对象实现。或者简单地使用
try:f=open(“original”)。。。最后:f.close()…
,这与
语句的
意思几乎相同