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