使用python递归grep

时间:2011-08-10 14:57:36

标签: python grep subprocess popen

我是python的新手并且正在努力学习。我正在尝试使用python实现一个简单的递归grep进行处理,这是我到目前为止所遇到的。

p = subprocess.Popen('find . -name [ch]', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  for line in p.stdout.readlines():
    q = subprocess.Popen('grep searchstring %s', line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print q.stdout.readlines()

有人可以告诉我如何解决这个问题吗?

4 个答案:

答案 0 :(得分:9)

您应该使用os.walk功能来浏览文件。使用字符串方法或正则表达式过滤掉结果。检查http://docs.python.org/library/os.html以获取有关如何使用os.walk的信息。

import os
import re

def findfiles(path, regex):
    regObj = re.compile(regex)
    res = []
    for root, dirs, fnames in os.walk(path):
        for fname in fnames:
            if regObj.match(fname):
                res.append(os.path.join(root, fname))
    return res

print findfiles('.', r'my?(reg|ex)')

现在对于grep部分,您可以使用open函数

循环遍历文件
def grep(filepath, regex):
    regObj = re.compile(regex)
    res = []
    with open(filepath) as f:
        for line in f:
            if regObj.match(line):
                res.append(line)
    return res

如果您想获取行号,可能需要查看enumerate函数。

编辑添加grep功能

答案 1 :(得分:2)

您可以使用python-textops3:

例如,要从当前目录grep所有.py文件中的所有“导入”:

from textops import *

print('\n'.join(('.' | find('*.py') | cat() | grep('import')))) 

它是纯python,无需派生进程。

答案 2 :(得分:0)

p = subprocess.Popen('find . -name [ch]', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  for line in p.stdout.readlines():
    q = subprocess.Popen('grep searchstring %s', line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print q.stdout.readlines()
  1. 第2行的缩进将为例外,for需要与上面的p对齐
  2. 'grep searchstring %s', line不会替换字符串,您需要将,替换为%
  3. 通过这些更改和实际搜索值,它可以在我的OS X框中运行。最后的剧本:

    import subprocess
    p = subprocess.Popen('find . -name *.py', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in p.stdout.readlines():
        print line
        q = subprocess.Popen('grep import %s' % line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        print q.stdout.readlines()
    

答案 3 :(得分:0)

也许一个例子可以帮助你,命令find . -print | grep "python"等同于:

import subprocess

pc1 = subprocess.Popen('find . -print', stdout=subprocess.PIPE, shell=True)
pc2 = subprocess.Popen('grep "python"', stdin=pc1.stdout, shell=True,
                       stdout=subprocess.PIPE)

print pc2.communicate()[0]