GREP in Python

Manav Narula 9 maggio 2021
GREP in Python

GREP è un’interessante funzionalità della riga di comando che ci consente di cercare righe specifiche in file di testo semplice utilizzando espressioni regolari.

Le espressioni regolari sono molto usate in Python e possono essere usate per controllare se una stringa corrisponde o meno a un pattern.

Il modulo re in Python ci permette di gestire le espressioni regolari. Nel codice seguente, proveremo a implementare GREP in Python e cercheremo un file per alcuni pattern specifici.

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

Apriamo il file richiesto in modalità di lettura e scorriamo il file riga per riga. Quindi usiamo la funzione re.search() per cercare il pattern in ogni riga. Se viene trovato il motivo, la riga viene stampata.

C’è un altro modo accurato per implementarlo nella riga di comando con Python. Questo metodo specificherà l’espressione regolare e il file da cercare nella riga di comando durante l’esecuzione del file nel terminale. Questo ci consente di replicare correttamente GREP in Python.

Il codice seguente implementa questo.

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)

Il modulo sys fornisce la funzione argv(), che restituisce un array di tutti gli argomenti forniti nella riga di comando.

Possiamo salvare questo file come grep.py ed eseguire questo script Python dal terminale e specificare gli argomenti necessari nel modo seguente.

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

Se vogliamo lavorare con più argomenti, allora possiamo usare il modulo glob.

Il modulo glob ci permette di trovare i percorsi dei file che corrispondono a un pattern in una directory.

Il suo utilizzo nella replica di GREP in Python può essere visto di seguito.

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 funzione iglob() crea un oggetto che restituisce i file nella directory, che vengono passati alla funzione.

Di seguito è mostrato un altro modo conciso di implementare GREP in poche righe.

import re
import sys

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

In questo modo è più preciso ed efficiente in termini di memoria e possiamo eseguire queste righe direttamente nel terminale.

python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
Autore: Manav Narula
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