GREP em Python

Manav Narula 20 novembro 2021
GREP em Python

GREP é um recurso de linha de comando interessante que nos permite pesquisar arquivos de texto simples para linhas específicas usando expressões regulares.

Expressões regulares são muito usadas em Python e podem ser usadas para verificar se uma string corresponde a um padrão ou não.

O módulo re em Python nos permite lidar com expressões regulares. No código a seguir, tentaremos implementar GREP em Python e pesquisar um arquivo para algum padrão específico.

with open("sample.txt", "r") as file:
    for line in file:
        if re.search(pattern, line):
            print(line)

Abrimos o arquivo necessário no modo de leitura e iteramos o arquivo linha por linha. Então usamos a função re.search() para pesquisar o padrão em cada linha. Se o padrão for encontrado, a linha será impressa.

Existe outra maneira bacana de implementar isso na linha de comando com Python. Este método irá especificar a expressão regular e o arquivo a ser pesquisado na linha de comando durante a execução do arquivo no terminal. Isso nos permite replicar GREP em Python corretamente.

O código a seguir implementa isso.

import re
import sys

with open(sys.argv[2], "r") as file:
    for line in file:
        if re.search(sys.argv[1], line):
            print(line)

O módulo sys fornece a função argv(), que retorna um array de todos os argumentos fornecidos na linha de comando.

Podemos salvar este arquivo como grep.py e executar este script Python a partir do terminal e especificar os argumentos necessários da seguinte maneira.

python grep.py 'RE' 'file-name'

Se quisermos trabalhar com vários argumentos, podemos usar o módulo glob.

O módulo glob nos permite encontrar os caminhos dos arquivos que correspondem a um padrão em um diretório.

Seu uso na replicação do GREP em Python pode ser visto abaixo.

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,
                )

A função iglob() cria um objeto que retorna os arquivos no diretório, que são passados ​​para a função.

Outra maneira concisa de implementar o GREP em apenas algumas linhas é mostrada a seguir.

import re
import sys

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

Desta forma é mais precisa e eficiente em termos de memória, e podemos executar essas linhas diretamente no terminal.

python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn