Pourquoi grep n'ignore-t-il pas les fichiers binaires par défaut?

94

La page de manuel pour grepdécrit le -Idrapeau comme suit:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

Il dit aussi ceci à propos des fichiers binaires:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

Je ne peux pas penser à un scénario où je me soucierais des correspondances dans les fichiers binaires. Si un tel scénario existe, il doit sûrement être l'exception plutôt que la norme. Pourquoi grepn'ignore- t-il pas les fichiers binaires par défaut plutôt que de demander à cet indicateur de le faire?

Braiam
la source
4
Vous pouvez définir la variable GREP_OPTIONSsur vos paramètres préférés, sans avoir à utiliser autant de commutateurs de ligne de commande.
Marco
2
Remarque pour les autres commandes ne prenant pas en charge une telle variable: Vous pouvez définir les options par défaut en définissant un alias dans votre .(ba|z|foo)shrc': alias grep = "grep -I" `.
Erik
1
Cela peut effectivement être très utile. Par exemple, je cherchais la version d'unité d'un projet et je ne pouvais pas me souvenir du fichier dans lequel il était conservé. J'ai cherché le format de la version et il en est résulté des fichiers binaires qui correspondent. Il s’est avéré qu’il s’agissait d’une version antérieure à la version 5, la version n’étant présente que dans un fichier binaire. Par conséquent, sans la correspondance binaire, je l’aurais peut-être manquée.
Svend Hansen
FYI Il y a un outil ack qui est un peu "meilleur que grep". Ack ne recherche pas les fichiers binaires. Dans Debian, il s’appelle "ack-grep".
Teika kazura

Réponses:

91

Tout ce que pense Grep n’est pas un fichier binaire, c’est un fichier binaire. Par exemple, les journaux de marionnettes ont un code de couleur ansi, ce qui fait que grep pense qu'ils sont binaires. Je voudrais quand même les rechercher si je me fais passer par / var / log.

Dennis Kaarsemaker
la source
4
Il en va de même pour les fichiers PDF.
Joseph R.
12
+ historiquement, grep ne pouvait PAS faire cela, donc pour la compatibilité uniquement, les paramètres par défaut doivent être complets.
Olivier Dulac
2
@OlivierDulac c'est logique, sinon ignorer les fichiers binaires devrait être la valeur par défaut.
Dagang
5

grepLa capacité de recherche de fichiers binaires est également utile lorsque je compile un programme et que l'éditeur de liens se ldplaint d'une fonction introuvable. Je peux utiliser une commande comme

grep nom_fonction / lib / lib *

trouver la bibliothèque qui la contient. (Les bibliothèques sont des fichiers binaires.)

Daniel Frużyński
la source
Dans ce cas, vous préférez utiliser grep -l function_name /lib/lib*ou nm -Do /lib/lib* | grep function_nameou ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_namebien.
Stéphane Chazelas
Eh bien, grep some_function /lib/*est plus court et donne généralement la bonne réponse - nom de la bibliothèque que je cherche. Mais oui, il faut parfois une approche plus sophistiquée comme la vôtre.
Daniel Frużyński