Confronto tra due comandi di ricerca


12

Recentemente ho ricevuto questo findone-liner, ma non sono in grado di spiegare da dove provenga la differenza dei due seguenti:

Esempio 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Esempio 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

Come puoi vedere, nel primo c'è il file specifico da cui deriva questa stringa e finora non sono davvero in grado di scoprire perché questo accada.

Risposte:


17

Stai dicendo a grep di cercare 2 posizioni. grep mostra la posizione completa solo se vengono cercate più posizioni.

Per esempio

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Notate come se cerco solo 1 file, grep omette il nome del file

grep -i "foo" /tmp/herp
foo

Ma se specifico più percorsi di ricerca, grep dice dove ha trovato ogni corrispondenza

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Aggiungendo /dev/nullsta ingannando grep nella stampa del percorso completo, fornendo 2 argomenti.


1
+1 ma hai dimenticato di menzionare il "ovvio": "Il motivo per cui il file aggiunto /dev/nullè quello di essere sicuro che tutto ciò che è grep-ed non verrà trovato nel /dev/nullfile (vuoto) , quindi vengono emessi solo i percorsi corretti"
Olivier Dulac,

Ma anche cercando /dev/nullnon perdi tempo a cercare un file fittizio non vuoto. E infine, l'intento della ricerca /dev/nullè ovvio per coloro che hanno familiarità con questo linguaggio.
alexis,

5

man grep:

-H, --with-nomefile

Stampa il nome del file per ogni corrispondenza. Questo è il valore predefinito quando c'è più di un file da cercare.

La differenza deriva dal fatto che grep viene chiamato con uno o due argomenti di file nei due casi. Invece di aggiungere /dev/nullè possibile chiamare grepcon l'argomento -H. Forse il /dev/nullcomportamento è supportato più ampiamente.


3
grep -Hnon è portatile - il /dev/nulltrucco funziona senza GNU grep.
Chris Down,

4

Il primo esempio equivale a eseguire grep su due file per ogni file trovato come risultato finddell'espressione. Ad esempio, se findtrova tre file a.txt, b.txte c.txtpoi grepverrà eseguito come

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

A cui grepverrà mostrato il nome file per cui corrisponde l'output. Poiché nulla corrisponderà a / dev / null, è garantito che il nome file del primo file verrà stampato se corrisponde.

Considerando che, il secondo esempio è equivalente a

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

Nel qual caso il nome file non verrà stampato per le corrispondenze poiché esiste un solo argomento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.