GREP en Python
GREP es una característica interesante de la línea de comandos que nos permite buscar líneas específicas en archivos de texto plano usando expresiones regulares.
Las expresiones regulares se usan mucho en Python y se pueden usar para verificar si una cadena coincide con un patrón o no.
El módulo re
en Python nos permite tratar con expresiones regulares. En el siguiente código, intentaremos implementar GREP en Python y buscaremos en un archivo algún patrón específico.
with open("sample.txt", "r") as file:
for line in file:
if re.search(pattern, line):
print(line)
Abrimos el archivo requerido en el modo de lectura e iteramos a través del archivo línea por línea. Luego usamos la función re.search()
para buscar el patrón en cada línea. Si se encuentra el patrón, se imprime la línea.
Hay otra forma ingeniosa de implementar esto en la línea de comandos con Python. Este método especificará la expresión regular y el archivo que se buscará en la línea de comando mientras se ejecuta el archivo en la terminal. Esto nos permite replicar GREP en Python correctamente.
El siguiente código implementa esto.
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)
El módulo sys
proporciona la función argv()
, que devuelve un array de todos los argumentos proporcionados en la línea de comandos.
Podemos guardar este archivo como grep.py
y ejecutar este script de Python desde la terminal y especificar los argumentos necesarios de la siguiente manera.
python grep.py 'RE' 'file-name'
Si queremos trabajar con múltiples argumentos, entonces podemos usar el módulo glob
.
El módulo glob
nos permite encontrar las rutas de los archivos que coinciden con un patrón en un directorio.
Su uso para replicar GREP en Python se puede ver a continuación.
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,
)
La función iglob()
crea un objeto que devuelve los archivos en el directorio, que se pasa a la función.
A continuación se muestra otra forma concisa de implementar GREP en unas pocas líneas.
import re
import sys
map(sys.stdout.write, (l for l in sys.stdin if re.search(sys.argv[1], l)))
De esta manera es más precisa y eficiente en memoria, y podemos ejecutar estas líneas directamente en la 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