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