通过Python运行grep - 不起作用

时间:2016-11-07 11:19:07

标签: python grep subprocess

我有一些像这样的代码:

f = open("words.txt", "w")
subprocess.call(["grep", p, "/usr/share/dict/words"], stdout=f)
f.close()

我想将某个模式的MacOs字典grep并将结果写入words.txt。例如,如果我想执行grep '\<a.\>' /usr/share/dict/words之类的操作,我会使用p = "'\<a.\>'"运行上述代码。但是,子进程调用似乎无法正常工作,words.txt仍为空。有什么想法吗?另外,有没有办法在不调用grep-subprocess的情况下将正则表达式应用于/usr/share/dict/words

编辑: 当我在终端中运行grep '\<a.\>' /usr/share/dict/words时,我得到的字样如下:aa 广告 AE 啊 嗳 AK 人 上午 一个 AR 如 在 AW 斧头 ay作为终端的结果(或者如果我将它们重定向到那里的文件)。这是我在运行子进程调用后期望的words.txt

2 个答案:

答案 0 :(得分:2)

就像@woockashek已经评论过的那样,你没有得到任何结果,因为输入文件中的'\<a.\>'没有命中。您可能实际上希望找到\<a.\>的匹配,但显然您需要省略单引号,这会让您感到烦恼。

当然,Python非常了解如何在文件中查找正则表达式。

import re

rx = re.compile(r'\ba.\b')
with open('/usr/share/dict/words', 'Ur') as reader, open('words.txt', 'w') as writer:
    for line in reader:
        if rx.search(line):
            print(line, file=writer, end='')

这里的单引号是Python语法字符串语法的一部分,就像命令行中的单引号是shell语法的一部分一样。在这两种情况下,它们都不是您要搜索的实际正则表达式的一部分。

subprocess.Popen文档模糊地提到了一个经常被忽视的事实,即当你没有shell=True时,shell的引用是没有必要或有用的(通常你应该避免这种情况) ,由于这个原因和其他原因)。

很遗憾,Python不支持\<\>作为字边界运算符,因此我们必须使用(功能相当的)\b

答案 1 :(得分:-1)

call()启动的进程的标准输入和输出通道绑定到父进程的输入和输出。这意味着调用程序无法捕获命令的输出。使用check_output()捕获输出以供以后处理:

import subprocess
f = open("words.txt", "w")
output = subprocess.check_output(['grep', p ,'-1'])
file.write(output)
print output
f.close()
PD:我希望它有效,我无法检查答案,因为我没有MacOS来试试。