Comparaison de deux commandes de recherche

12

Récemment, j'ai reçu ce findone-liner, mais je ne suis pas en mesure d'expliquer d'où vient la différence des deux ci-dessous:

Exemple 1

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

./names:Madison Randy:300:Product Development

Exemple 2

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

Madison Randy:300:Product Development

Comme vous pouvez le voir, dans le premier, il y a le fichier spécifique dont dérive cette chaîne et jusqu'à présent, je ne suis vraiment pas en mesure de savoir pourquoi cela se produit.

VVelev
la source

Réponses:

17

Vous dites à grep de rechercher 2 emplacements. grep n'affiche l'emplacement complet que si plusieurs emplacements sont recherchés.

Par exemple

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

Remarquez que si je recherche un seul fichier, grep omet le nom du fichier

grep -i "foo" /tmp/herp
foo

Mais si je spécifie plusieurs emplacements de recherche, grep indique où il a trouvé chaque correspondance

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

L'ajout de l' /dev/nullastuce incite grep à imprimer le chemin complet, en fournissant 2 arguments.

spuder
la source
1
+1 mais vous avez oublié de mentionner "l'évidence": "La raison pour laquelle le fichier ajouté /dev/nullest d'être sûr que tout ce qui est grep-ed ne sera pas trouvé dans le /dev/nullfichier (vide) , donc seuls les emplacements corrects sont sortis"
Olivier Dulac
Mais aussi, en cherchant, /dev/nullvous ne perdez pas de temps à chercher dans un fichier factice non vide. Et enfin, l'intention de chercher /dev/nullest évidente pour ceux qui connaissent cet idiome.
alexis
5

man grep:

-H, --with-filename

Imprimez le nom du fichier pour chaque correspondance. Il s'agit de la valeur par défaut lorsqu'il y a plusieurs fichiers à rechercher.

La différence résulte de l'appel de grep avec un ou deux arguments de fichier dans les deux cas. Au lieu d'ajouter, /dev/nullvous pouvez appeler grepavec l'argument -H. Peut-être que le /dev/nullcomportement est plus largement pris en charge.

Hauke ​​Laging
la source
3
grep -Hn'est pas portable - l' /dev/nullastuce fonctionne sans GNU grep.
Chris Down
4

Le premier exemple équivaut à exécuter grep sur deux fichiers pour chaque fichier trouvé à la suite de l' findexpression. Par exemple, si findtrouve trois fichiers a.txt, b.txtet c.txtpuis grepcourront comme

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

À qui grepaffichera le nom de fichier auquel correspond la sortie. Comme rien ne correspondra à / dev / null, il est garanti que le nom de fichier du premier fichier sera imprimé s'il correspond.

Alors que le deuxième exemple équivaut à

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

Dans ce cas, le nom de fichier ne sera pas imprimé pour les correspondances car il n'y a qu'un seul argument.

mkc
la source