Ultimamente ho usato il comando egrep (solo per preferenza rispetto a grep) e ho notato un comportamento che non capisco del tutto. Quando eseguo il seguente comando nella mia directory home:
egrep -r "main" *
fa quello che mi aspetto e restituisce tutte le righe e i rispettivi file che contengono "main".
Anche se inserisco:
egrep -r "main"
e dimentica di mettere la stella alla fine, sembra appendere per sempre. Spero che qualcuno possa essere in grado di far luce sul perché questo è e cosa sta facendo?
Grazie :)
risposte:
5 per risposta № 1Sta aspettando un input da stdin
perché non hai specificato un nome file, da grep
pagina di manuale:
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
DESCRIPTION
Grep searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PATTERN. By default, grep
prints the matching lines.
4 per risposta № 2
grep (o egrep) ha bisogno di sapere quali file cercare. Includendo il *
, gli stai dicendo di cercare in tutti i file nella directory corrente.
Se non includi il file *
, non sa dove cercare, quindi attende il tuo input e ti chiederà input per la ricerca (digitalo, quindi premi ctrl + d per terminare la modalità di input standard).
Questo comportamento non è unico per grep. Qualsiasi comando che richiede input vuole che l'input provenga da un file o da input standard (stdin).
i dati stdin possono provenire da una pipe o possono esseredigitato manualmente al prompt dopo aver inserito il comando (che è quello che stavi vedendo quando pensavi che fosse bloccato). Come ho già detto, premendo Ctrl + D uscirai da quella modalità di input.
3 per risposta № 3
Non hai fornito il percorso quindi grep aspetta stdin
per i dati.
Esempio con percorso:
egrep -r "pattern" .
<- cerca nella directory e nelle sottodirectory correnti
cat file | egrep "pattern"
<- cerca nei dati dalla pipe