Python调用grep失败

时间:2016-11-24 09:07:34

标签: python

我想在Python中执行此命令

grep keyMessage logFile.log > keyMessageFile.log

这就是我现在所做的

from subprocess import call

keyMessage= 'keyMessage'
call(["grep", keyMessage,  "logFile.log"])

但我不知道如何添加> keyMessageFile.log部分

顺便说一句,我使用grep的原因是因为它比使用read文件快得多然后比较字符串然后写文件

#UPDATE 我编写的python代码较慢

keyMessage= 'keyMessage'

with open('logFile.log') as f:
    for line in f:
        with open(keyMessage+ '.txt', 'a') as newFile:
            if(keyMessage not in line):
                continue
            else:
                newFile.write(line)

3 个答案:

答案 0 :(得分:4)

subprocess.call有一个参数stdout。传递打开的文件以便写入。

with open("keyMessageFile.log", "w") as o:
    keyMessage= 'keyMessage'
    call(["grep", keyMessage,  "logFile.log"], stdout=o)

subprocess.call是旧API,您应该使用subprocess.run代替。

答案 1 :(得分:4)

最简单的方法(合理安全地)是:

from subprocess import check_call
from shlex import quote
check_call('grep %s logFile.log > keyMessageFile.log' % quote(keyMessage), shell=True)

但是,除非您确实需要grep的正则表达式匹配功能,否则您最终会在程序中阅读keyMessageFile.log,我不认为以下内容会非常缓慢:

def read_matching_lines(filename, key):
    with open(filename) as fp:
      for line in fp:
        if key in line:
          yield line

for matching_line in read_matching_lines('logFile.log', keyMessage):
    print(matching_line)

答案 2 :(得分:0)

对我而言,这有效:

    import sys
    os.system('grep %s logFile.log > keyMessageFile.log' % 'looking string')