Grep и Python - PullRequest
       28

Grep и Python

62 голосов
/ 17 декабря 2009

Мне нужен способ поиска файла с использованием grep через регулярное выражение из командной строки Unix. Например, когда я набираю в командной строке:

python pythonfile.py 'RE' 'file-to-be-searched'

Мне нужно найти в файле регулярное выражение 'RE' и распечатать соответствующие строки.

Вот код, который у меня есть:

import re
import sys

search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
        print line,
        if line == None:
            print 'no matches found'

Но когда я ввожу слово, которого нет, no matches found не печатает

Ответы [ 6 ]

72 голосов
/ 17 декабря 2009

Естественный вопрос: почему бы просто не использовать grep ?! Но при условии, что вы не можете ...

import re
import sys

file = open(sys.argv[2], "r")

for line in file:
     if re.search(sys.argv[1], line):
         print line,

На что обратить внимание:

  • search вместо match для поиска где-либо в строке
  • запятая (,) после print удаляет возврат каретки (строка будет иметь один)
  • argv включает имя файла python, поэтому переменные должны начинаться с 1

Это не обрабатывает несколько аргументов (как это делает grep) и не расширяет подстановочные знаки (как это сделала бы оболочка Unix). Если вам нужна эта функциональность, вы можете получить ее, используя следующее:

import re
import sys
import glob

for arg in sys.argv[2:]:
    for file in glob.iglob(arg):
        for line in open(file, 'r'):
            if re.search(sys.argv[1], line):
                print line,
11 голосов
/ 07 августа 2014

Сжатие и эффективное использование памяти:

#!/usr/bin/env python
# file: grep.py
import re, sys

map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))

Работает как egrep (без особой обработки ошибок), например ::10000

cat file-to-be-searched | grep.py "RE"

А вот однострочный:

cat file-to-be-searched | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
5 голосов
/ 17 декабря 2009

Адаптировано из grep в python .

Принимает список имен файлов через [2:], без обработки исключений:

#!/usr/bin/env python
import re, sys, os

for f in filter(os.path.isfile, sys.argv[2:]):
    for line in open(f).readlines():
        if re.match(sys.argv[1], line):
            print line

sys.argv[1] соответственно sys.argv[2:] работает, если вы запускаете его как отдельный исполняемый файл, что означает

chmod +x

первый

4 голосов
/ 17 декабря 2009
  1. используйте sys.argv для получения параметров командной строки
  2. используйте open(), read() для манипулирования файлом
  3. используйте модуль Python re для сопоставления строк
2 голосов
/ 11 июня 2013

Вас может заинтересовать pyp . Ссылаясь на мой другой ответ :

"Pyed Piper", или pyp, это текстовая манипуляция в командной строке linux инструмент похож на awk или sed, но который использует стандартную строку Python и методы списка, а также пользовательские функции, разработанные для быстрой генерации приводит к интенсивной производственной среде.

0 голосов
/ 27 июля 2018

Настоящая проблема в том, что строка переменной всегда имеет значение. Проверка на "не найдено совпадений" заключается в том, есть ли совпадение, поэтому код "if line == None:" следует заменить на "else:"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...